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

如何在Powermail FlexForm字段中添加SplitProcessor?

解决Powermail表单提交后拆分FlexForm换行文本为数组的方案

方法1:直接在Fluid模板用ViewHelper拆分

不用额外添加Processor,直接在Create.html里借助TYPO3的v:iterator.explode ViewHelper,把换行分隔的字符串转成数组,步骤如下:

  1. 替换{field.flexform_field}为你实际的FlexForm字段变量名
  2. 在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:

  1. 在你的扩展里创建处理器类,比如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);
        }
    }
}
  1. 在ext_localconf.php里注册这个Processor:
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['powermail']['processors']['splitFlexformField'] = [
    'processor' => \YourVendor\YourExtension\Processor\SplitFlexformFieldProcessor::class,
    'before' => ['sendMail'], // 设置在发送邮件前执行
];
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:43:16