当我有一个不断变化的阵列时:
<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"
答案 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只是实名的占位符。