Typo3 FLUIDTEMPLATE中where子句变量替换失效求助
TYPO3 DatabaseQueryProcessor 中使用动态日期变量的解决方案
方法一:在 where 字段内直接生成动态条件
利用 TypoScript 的 TEXT 对象和 insertData 功能,在 where 中直接调用你的 userFunc 生成日期:
page = PAGE page { 10 = FLUIDTEMPLATE 10 { 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 # 用 TEXT 对象生成 where 条件 where.cObject = TEXT where.cObject { value = tx_mask_termin.tx_mask_datum BETWEEN {dayNow} AND {day30} insertData = 1 # 开启变量解析 data { dayNow = USER dayNow.userFunc = VereinLilaWinkel\LilaWinkelTemplate\Schultermine->dayNow day30 = USER day30.userFunc = VereinLilaWinkel\LilaWinkelTemplate\Schultermine->day30 } } orderBy = tx_mask_termin.tx_mask_datum ASC as = nextSchultermine } } } }
方法二:通过 TypoScript Register 传递变量
先将日期变量注册到 TypoScript 的 REGISTER 全局变量中,再在 where 中引用:
1. 修改 TypoScript 配置
page = PAGE page { 10 = FLUIDTEMPLATE 10 { # 先注册日期变量到 REGISTER stdWrap.cObject = USER stdWrap.cObject.userFunc = VereinLilaWinkel\LilaWinkelTemplate\Schultermine->registerDates 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 # 引用 REGISTER 中的变量,需开启 insertData where = tx_mask_termin.tx_mask_datum BETWEEN {REGISTER:dayNow} AND {REGISTER:day30} where.insertData = 1 orderBy = tx_mask_termin.tx_mask_datum ASC as = nextSchultermine } } } }
2. 更新你的 PHP 类
添加一个 registerDates 方法,将日期存入 REGISTER:
class Schultermine { // 原有的 dayNow 和 day30 方法可保留(如果模板中需要使用) public function dayNow($content, $conf) { return date('Y-m-d'); // 你的自定义逻辑 } public function day30($content, $conf) { return date('Y-m-d', strtotime('+30 days')); // 你的自定义逻辑 } // 新增注册变量的方法 public function registerDates($content, $conf) { $GLOBALS['TSFE']->register['dayNow'] = $this->dayNow($content, $conf); $GLOBALS['TSFE']->register['day30'] = $this->day30($content, $conf); return ''; // 无需返回内容,仅注册变量 } }
为什么原有方法无效?
FLUIDTEMPLATE 的 variables 是传递给 Fluid 模板渲染时使用的,而 dataProcessing 是在 Fluid 渲染之前由 TypoScript 执行的,因此 dataProcessing 无法直接访问 Fluid 的 variables 变量。必须使用 TypoScript 层面的变量传递方式(如 REGISTER),或者在 dataProcessing 内部直接生成所需的动态值。
内容的提问来源于stack exchange,提问作者user3395986
相关产品推荐
相关产品推荐

