You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:23:20