Typo3 Fluid 将字符串分成元素以便进行比较

Typo3 Fluid separating a string into elements to be able to compare

第一次使用液体。

挑战: 在一种形式中,我试图标记那些必填的字段(突出显示或指示器)。 必填字段以字符串形式提供(在数组 {settings.registration.requiredFields} 中)

方法 我认为可以创建一个部分,我将当前字段名传递给该部分并将该字段名与 requiredFields 列表进行比较。

问题

1) 我发现部分字符串无法比较。

2) 所以我想用 v:interator.explode 将字符串分解成一个数组,然后可以与 f:for 进行比较,并在那里完成标记,如 here

经过几个小时的谷歌搜索后,我发现我需要添加 vhsflux 扩展名。没有成功。

在输出中显示语句而不是结果。

<v:iterator.explode content="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam" glue=" " as="bar">
                <div class="event-registration-value event-title">

                </div>
            </v:iterator.explode>

来自(测试)输入

          <v:iterator.explode content="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam" glue=" " as="bar">
            <div class="event-registration-value event-title">
                {bar}
            </div>

        </v:iterator.explode>

我需要做什么才能得到这个 运行?

PS: 我使用的是 typo3 7.6.2

由于您没有提及我假设的表单的任何扩展,您只是创建自己的表单,在这种情况下,您也可以轻松添加自己的 ViewHelper,这将完全满足您的需要,即:

在你的 TypoScript 中的某处:

plugin.tx_myext.settings.registration.requiredFields = foo bar baz

typo3conf/ext/myext/Classes/ViewHelpers/IsFieldRequiredViewHelper.php:

<?php
namespace Vendor\Myext\ViewHelpers;

use TYPO3\CMS\Core\Utility\GeneralUtility;

class IsFieldRequiredViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractConditionViewHelper {

    /**
     * @param string $fieldName Current field name
     * @param string $requiredFields List of required names separated by spaces
     *
     * @return string the rendered string
     */
    public function render($fieldName, $requiredFields) {
        $requiredArray = GeneralUtility::trimExplode(' ', $requiredFields, true);

        return (in_array($fieldName, $requiredArray))
            ? $this->renderThenChild()
            : $this->renderElseChild();
    }
}

因此,在您的 Fluid 模板中,您可以通过多种方式使用它,几个示例:

{namespace myvhs=Vendor\Myext\ViewHelpers}


<!-- 1: Use your condition with then/else blocks -->
<myvhs:isFieldRequired
        fieldName="foo"
        requiredFields="{settings.registration.requiredFields}">

    <f:then>This field IS required</f:then>
    <f:else>It's optional...</f:else>

</myvhs:isFieldRequired>

<!-- 2: or just with `then` implicit block: -->
<myvhs:isFieldRequired
        fieldName="bar"
        requiredFields="{settings.registration.requiredFields}">Fill the bellow input...</myvhs:isFieldRequired>

<!-- 3: Add `required-field` class inline -->
<input type="text" class="{myvhs:isFieldRequired(fieldName: 'baz', requiredFields: settings.registration.requiredFields, then: 'required-field')}">

(请注意,您当然需要更改供应商和扩展名称以适合您当前的情况)

要获得 v: 函数 运行 有两件重要的事情要做:

  1. 包括 TER 的 vhs 扩展
  2. 定义命名空间

命名空间是通过添加

来定义的
 {namespace v=FluidTYPO3\Vhs\ViewHelpers}

在文件顶部。

提示:

如果模板在添加后损坏,可能不是 namespace 行,而是 <v:...> 语句中的拼写错误。

在我的例子中,缺少结尾 " 并且围绕相同的变量缺少 {}

作为新手我花了三天时间解决了