Typo3 Fluid将一根弦分隔成可以比较的元素

时间:2016-01-11 11:22:23

标签: typo3 fluid

这是我第一次使用液体。

挑战: 在一种形式中,我试图标记那些强制性的字段(突出显示或指示符)。 必填字段以字符串形式提供(在数组{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

2 个答案:

答案 0 :(得分:0)

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

TypoScript中的某个地方

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

<强> typo3conf / EXT / myext /类别/ 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')}">

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

答案 1 :(得分:0)

要使v:函数运行,有两件重要的事情要做:

  1. 包括TER
  2. 中的vhs扩展程序
  3. 定义命名空间
  4. 命名空间是通过添加

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

    在文件顶部。

    <强>提示:

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

    在我的情况下,它是一个缺失的结尾",并且在相同的变量周围缺少{}

    因为新手花了我三天的时间来解决。