流体数组,如果删除所有元素,则数组不为空,而是字符串

时间:2015-03-18 16:31:55

标签: typo3 fluid typo3-6.2.x

当我有一个不断变化的阵列时:

<flux:form.section name="links" label="Links">
    <flux:form.object name="link" label="Link">

        <flux:field.input name="linktext" label="Linktext"/>

    </flux:form.object>
</flux:form.section>

首先检查数组是否在我用流体渲染之前设置:

<f:if condition="{links}">
<ul class="menulinks">
    <f:for each="{links}" as="linkelement"> 
        <li>{linkelement.link.linktext}</li>
    </f:for>
</ul>
</f:if>

这很有效。但是如果设置了项目然后删除了,则{links}不为空。它被设置为带有空格" "的字符串。这意味着if-Tag中的条件返回true。

这可能会导致错误。在这种情况下,我在后端有一个错误,但没有在前端。即使我在<f:section name="Preview"><f:section name="Main">使用了几乎相同的代码。

我的想法是检查{links}的类型,如果类型是数组,则只返回true。但我不确定这是否可以用液体。我还有其他选择吗?

我在后端看到的错误报告:

The argument "each" was registered with type "array", but is of type "string" in view helper "TYPO3\CMS\Fluid\ViewHelpers\ForViewHelper"

1 个答案:

答案 0 :(得分:1)

  

我的想法是检查{links}的类型,如果类型是数组,则只返回true。但我不确定这是否可以用液体。

是的。如果您需要对某些东西的支持,您可以随时实现自己的ViewHelper,流体不会带来开箱即用。要添加所需的ViewHelper,请在IfIsNonEmptyArrayViewHelper.php中创建一个名为some_extension/Classes/ViewHelpers/的php文件。实施非常简单:

<?php
namespace Vendor\SomeExtension\ViewHelpers;

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

    /**
     * @param mixed $variable
     * @return string
    */
    public function render($variable) {
        if (is_array($variable) && !empty($variable)) {
            return $this->renderThenChild();
        }
        return $this->renderElseChild();
    }
}

之后,您只需将自己的流体命名空间添加到模板中,如下所示:{namespace ns=Vendor\SomeExtension\ViewHelpers}

现在你可以写下这样的条件:

<ns:ifIsNonEmptyArray variable="{links}">
    <ul class="menulinks">
         <f:for each="{links}" as="linkelement"> 
             <li>{linkelement.link.linktext}</li>
         </f:for>
    </ul>
</ns:ifIsNonEmptyArray>

当然,ns,Vendor和SomeExtension只是实名的占位符。