where 子句中的变量

问题描述 投票:0回答:3

我正在进行我的第一个 Typo3 项目。我坚持了几天的努力。我在这里搜索并用谷歌搜索。但似乎,我的问题就是这么简单,以至于没有人问:-)

我的 setup.typoscript(来自 sitepackagebuilder.com)中有一个 FLUIDTEMPLATE。一切正常,网站看起来也像我想要的那样。

但是:我必须加入一个带有变量的 where 子句。这是我的代码:

page = PAGE
page {

    10 = FLUIDTEMPLATE
    10 {

        variables {
            
            dayNow = USER
            dayNow.userFunc = VereinLilaWinkel\LilaWinkelTemplate\Schultermine->dayNow

            day30 = USER
            day30.userFunc = VereinLilaWinkel\LilaWinkelTemplate\Schultermine->day30
        }

        dataProcessing {

            60 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
            60 {

                table = tx_mask_termin
                pidInList = 123
                selectFields = tx_mask_termin.*, usr_plz.plz, usr_plz.ort
                leftjoin = usr_plz ON usr_plz.uid = tx_mask_termin.tx_mask_plzort
                where = tx_mask_termin.tx_mask_datum BETWEEN {dateNow} AND {date30}
                orderBy = tx_mask_termin.tx_mask_datum ASC
                as = nextSchultermine
            }
        }
    }
}

userFuncs 工作正常,例如我回来了(今天):

  • 现在日期:2023-05-02
  • 日期 30: 2023-06-01

目标是让 where 语句起作用。到目前为止,我只能每天硬编码。所以我知道,其余的查询工作正常。

我尝试了所有我能找到的 wrap 和 dataWrap。我尝试了 lib.myValues,或者作为常量……我也向 ChatGPT 询问了它……还没有运行版本……变量不会在 where 子句中呈现!

database variables typo3 where-clause typoscript
3个回答
1
投票

我相信你可以在不使用 Userfunction 的情况下管理它。例如,您可以使用以下代码获取下个月的第一天 使用以下代码

DATE_ADD(LAST_DAY(NOW()), INTERVAL 1 DAY)

要获取当前日期,您可以使用以下代码

DAY(CURDATE()) AS current_day;

  table = tx_mask_termin
                pidInList = 123
                selectFields = tx_mask_termin.*, usr_plz.plz, usr_plz.ort
                leftjoin = usr_plz ON usr_plz.uid = tx_mask_termin.tx_mask_plzort
                where = tx_mask_termin.tx_mask_datum BETWEEN DAY(CURDATE()) AND DATE_ADD(LAST_DAY(NOW()), INTERVAL 1 DAY)
                orderBy = tx_mask_termin.tx_mask_datum ASC
                as = nextSchultermine

也许你会这样尝试。或者您可以编写自己的自定义DataProcessor


0
投票

因为

variables
DataProcessor
都在同一级别定义,并且没有嵌套
dataProcessing
你的方法必须失败。

原因是,变量在数据处理将要发生时不可用,因此您不能将它们作为 DataProcessor 的 TypoScript 的数据访问。

你仍然可以用 TypoScript 实现你想要的,因为有几个日期函数可以通过

stdWrap
.

https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/Functions/Stdwrap.html?highlight=strtotime#strtotime

60 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
60 {
    table = tx_mask_termin
    pidInList = 123
    selectFields = tx_mask_termin.*, usr_plz.plz, usr_plz.ort
    leftjoin = usr_plz ON usr_plz.uid = tx_mask_termin.tx_mask_plzort
    where.cObject = COA
    where.cObject {
       10 = TEXT
       10.value = now
       10.strtotime = 1
       10.noTrimWrap = |tx_mask_termin.tx_mask_datum BETWEEN | AND                    
       20 = TEXT
       20.value = +30 day
       20.strtotime = 1
    }
    orderBy = tx_mask_termin.tx_mask_datum ASC
    as = nextSchultermine
}

但是正如 Sivas 解决方案的评论中提到的,我建议改用自定义 DataProcessor。


0
投票

谢谢 Jo Hasenau!

你是我的男人!感谢您描述问题和对 stdWrap 日期函数的提示。因为 tx_mask_datum 列实际上是 DATE 而不是 TSTAMP,我可以这样实现:

60 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
60 {

    table = tx_mask_termin
    pidInList = 123
    selectFields = tx_mask_termin.*, usr_plz.plz, usr_plz.ort
    leftjoin = usr_plz ON usr_plz.uid = tx_mask_termin.tx_mask_plzort
    where.cObject = COA
    where.cObject {
        10 = TEXT
        10.value = now
        10.field = tstamp
        10.date = Y-m-d
        10.noTrimWrap = |tx_mask_termin.tx_mask_datum BETWEEN "|" AND
        20 = TEXT
        20 {
            strtotime = +30 day
            strftime = %Y-%m-%d
        }
        20.noTrimWrap = | "|"
    }
    orderBy = tx_mask_termin.tx_mask_datum ASC
    as = nextSchultermine
}

作为一名 PHP 开发人员,在 typo3 的世界里,我常常不清楚。

非常感谢!

© www.soinside.com 2019 - 2024. All rights reserved.