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

Fluid array, if all elements are deleted the array is not empty, but a string

当我有一个不断变化的数组时:

<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 return 中的条件为真。

这可能会导致错误。在这种情况下,我在后端出错,但在前端没有。即使我在 <f:section name="Preview"><f:section name="Main">.

中使用了几乎相同的代码

我的想法是检查 {links} 的类型,只有 return 类型为数组时才为真。但我不确定这是否可以用流体实现。我还有哪些其他选择?

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

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

My idea was to check the type of {links} and only return true if the type is array. But I am not sure if this is possible with fluid.

是的。如果您需要某些东西的支持,您总是可以实现自己的 ViewHelper,流体不会开箱即用。要添加您需要的 ViewHelper,请在 some_extension/Classes/ViewHelpers/ 中创建一个名为 IfIsNonEmptyArrayViewHelper.php 的 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只是真实姓名的占位符。