流体数组,如果删除所有元素数组不是空的,而是一个字符串
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只是真实姓名的占位符。
当我有一个不断变化的数组时:
<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只是真实姓名的占位符。