TYPO3 10.4.31:如何通过内容元素字段动态设置FLUIDTEMPLATE路径?
可行性与实现方案
你的思路完全可行,但直接在TEXT的value中使用{field:selectForm}无法自动解析字段值,需要调整TypoScript写法来实现动态拼接,具体步骤如下:
1. 给内容元素添加表单选择字段
首先在你的站点扩展(sitepackage)中,为内容元素新增一个下拉选择字段,让编辑人员能选择对应表单。修改Configuration/TCA/Overrides/tt_content.php:
// 新增自定义内容元素类型 \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem( 'tt_content', 'CType', [ '嵌入表单', 'embedded_form', 'content-form' ], 'textmedia', 'after' ); // 配置内容元素显示字段 $GLOBALS['TCA']['tt_content']['types']['embedded_form'] = [ 'showitem' => ' --div--;常规, --palette--;;general, header;标题, select_form;选择表单, --div--;访问设置, --palette--;;hidden, --palette--;;access, ', ]; // 定义select_form字段 $GLOBALS['TCA']['tt_content']['columns']['select_form'] = [ 'exclude' => true, 'label' => '选择表单', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ ['联系表单', 'contact'], ['订阅表单', 'subscribe'], ['反馈表单', 'feedback'], ], 'default' => '', ], ];
2. 修改TypoScript动态拼接表单路径
调整你的lib.embeddedForm配置,通过TEXT对象的data属性获取字段值,再拼接成完整的表单路径:
lib.embeddedForm = FLUIDTEMPLATE lib.embeddedForm { template = TEXT template { # 获取内容元素中select_form字段的值 data = field:select_form # 拼接成完整的persistenceIdentifier wrap = <formvh:render persistenceIdentifier="EXT:sitepackage/Resources/Private/Templates/form/Forms/|.form.yaml" /> # 仅当选择了表单时才输出 if.isTrue.field = select_form } }
如果需要更灵活的拼接,也可以用COA组合多个TEXT对象:
lib.embeddedForm = FLUIDTEMPLATE lib.embeddedForm { template = COA template { 10 = TEXT 10.value = <formvh:render persistenceIdentifier="EXT:sitepackage/Resources/Private/Templates/form/Forms/ 20 = TEXT 20.data = field:select_form 30 = TEXT 30.value = .form.yaml" /> if.isTrue.field = select_form } }
3. 关联内容元素与TypoScript
将自定义内容元素与lib.embeddedForm关联,在setup.typoscript中添加:
tt_content.embedded_form =< lib.embeddedForm
4. 验证文件路径
确保你站点扩展中存在对应的表单文件,比如:
EXT:sitepackage/Resources/Private/Templates/form/Forms/contact.form.yamlEXT:sitepackage/Resources/Private/Templates/form/Forms/subscribe.form.yaml
完成以上步骤后,编辑人员就能在后台选择内容元素类型为「嵌入表单」,并通过下拉框选择要展示的表单,前端会自动渲染对应路径的表单。
内容的提问来源于stack exchange,提问作者Benjamin
相关产品推荐
相关产品推荐

