如何在Powermail FlexForm字段中添加SplitProcessor?
解决Powermail表单提交后拆分FlexForm换行文本为数组的方案
方法1:直接在Fluid模板用ViewHelper拆分
不用额外添加Processor,直接在Create.html里借助TYPO3的v:iterator.explode ViewHelper,把换行分隔的字符串转成数组,步骤如下:
- 替换
{field.flexform_field}为你实际的FlexForm字段变量名 - 在Create.html里编写处理逻辑:
{namespace v=FluidTYPO3\Vhs\ViewHelpers} {# 拆分换行分隔的字符串为数组 #} <v:iterator.explode content="{field.flexform_field}" delimiter=" " as="infoArray"> {# 结合用户选择的选项展示对应内容 #} <f:for each="{infoArray}" as="info" iteration="i"> <f:if condition="{userSelectedOption} == {i.index + 1}"> <p>{info}</p> </f:if> </f:for> </v:iterator.explode>
注意:delimiter里要填入实际的换行符(直接按回车),如果是LF换行也可以用
\n,根据你的FlexForm输入格式调整。
方法2:自定义Powermail Processor处理字段
如果希望在表单提交阶段就把字段转成数组,后续模板直接调用,可自定义一个Processor:
- 在你的扩展里创建处理器类,比如
Classes/Processor/SplitFlexformFieldProcessor.php:
<?php namespace YourVendor\YourExtension\Processor; use In2code\Powermail\Domain\Model\Mail; use In2code\Powermail\Processor\AbstractProcessor; class SplitFlexformFieldProcessor extends AbstractProcessor { public function process(Mail $mail): void { // 获取FlexForm字段值,替换'FLEXFORM_INFO'为你的字段标识符 $flexValue = $mail->getAnswers()->filterByProperty('marker', 'FLEXFORM_INFO')->current()->getValue(); if (!empty($flexValue)) { // 拆分换行转数组 $infoArray = explode("\n", trim($flexValue)); // 将数组存入Mail临时属性,模板通过{mail.temporary.infoArray}访问 $mail->addTemporaryData('infoArray', $infoArray); } } }
- 在
ext_localconf.php里注册这个Processor:
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['powermail']['processors']['splitFlexformField'] = [ 'processor' => \YourVendor\YourExtension\Processor\SplitFlexformFieldProcessor::class, 'before' => ['sendMail'], // 设置在发送邮件前执行 ];
- 在Create.html里直接使用数组:
<f:for each="{mail.temporary.infoArray}" as="info" iteration="i"> <f:if condition="{userSelectedOption} == {i.index + 1}"> <p>{info}</p> </f:if> </f:for>
方法3:用TypoScript在模板渲染前处理
如果不想编写PHP类,也可以通过TypoScript的stdWrap.split处理字段值:
在你的模板TypoScript配置中添加:
page.10.variables.infoArray = TEXT page.10.variables.infoArray.data = powermail_field:FLEXFORM_INFO page.10.variables.infoArray.split { token = \n cObjNum = 1 1.current = 1 }
之后在Create.html里直接用{infoArray}作为数组遍历即可。
内容的提问来源于stack exchange,提问作者user500665
相关产品推荐
相关产品推荐

