如何在Fluid中查找Typoscript定义的数组长度?

7

我在我的扩展的setup.txt typoscript中定义了一个数组,如下所示:

settings{
        halls {
            0 = Default
            1 = Mississauga   
            2 = Halifax
            3 = Niagara Falls 
            4 = Oakville 
            5 = Pickering 
        }}

在我的流体模板中,如何找到halls数组的长度?我想要一个if条件来判断长度是否大于1,如果是则执行一种操作,否则执行另一种操作。
我正在使用typo3 v4.5.32和extbase 1.3。
谢谢。 我尝试了这个方法,但它输出了两个< th >标签,而不是只有一个。第一个if语句旨在证明有多个元素,下一个if语句旨在仅在第一个元素时打印出< th >标签。
<f:for each="{settings.halls}" as="hall" key="number" iteration="itemIteration">
    <f:if condition="{itemIteration.isFirst !=  itemIteration.isLast}">
        <f:if condition="{itemIteration.index ==  0}">
            <th>
                <f:translate key="tx_bpscoupons_domain_model_coupon.hall" />
            </th>
        </f:if>
    </f:if>
</f:for>

为什么?

更新:这是解决fluid中“数组长度是否大于1”的功能缺失的方法。

<f:for each="{settings.halls}" as="hall" key="number" iteration="itemIteration">
    <f:if condition="{itemIteration.isFirst}">
        <f:then>
            <f:if condition="{itemIteration.isLast}">
                // if both first and last there is only one so skip
            </f:if>
        </f:then>
        <f:else>
            <f:if condition="{itemIteration.isLast}">
                //if there is more than one element in halls then eventually you'll get here once so print out th tags
                <th>
                    <f:translate key="tx_bpscoupons_domain_model_coupon.hall" />
                </th>
            </f:if>
        </f:else>
    </f:if>
</f:for>

并且打印输出数据:

<f:for each="{settings.halls}" as="hall" key="number" iteration="itemIteration">
    <f:if condition="{itemIteration.isFirst}">
        <f:then>
            <f:if condition="{itemIteration.isLast}">
                <f:then>
                </f:then>
                <f:else>
                    <f:if condition="{number} == {coupon.hall}">
                        <td>{hall}</td>
                    </f:if>
                </f:else>
            </f:if>
        </f:then>
        <f:else>
            <f:if condition="{number} == {coupon.hall}">
                <td>{hall}</td>
            </f:if>
        </f:else>
    </f:if>
</f:for>

丑陋但似乎有效。

更新2: 糟糕!!!我错过了“total”这个东西,这正是我需要的,但我正在寻找长度或计数,所以这段代码就是我想要的:

<f:for each="{settings.halls}" as="hall" key="number" iteration="itemIteration">
    <f:if condition="{itemIteration.total} > 1">
        <f:if condition="{itemIteration.isLast}">
          <th><f:translate key="tx_bpscoupons_domain_model_coupon.hall" /></th>
        </f:if>   
    </f:if>
</f:for>

即使是你自己回答了问题,请关闭问题。 - lorenz
4个回答

11

您可以使用f:count ViewHelper 查找数组的长度。就像其他ViewHelper一样,它可以用作内联符号(您可以在此处找到更多信息

正确的代码应该是:

<f:if condition="{settings.halls -> f.count()} > 1">
  <f:then>
      //your code for then
  </f:then>
  <f:else>
     //your code for else 
  </f:else>
</f:if>

8
针对我来说,<f:if condition="{settings.halls -> f:count()} > 1">中的 f:count 应该是 f:count 而不是 f.count - user2310852

2

<f:if condition="{f:count(subject: settings.halls)} > 1"> 做某事 </f:if>


如果在settings.halls数组中有多个项目,则在前端会出现“do something”字符串。 - Robee13

0

对于那些正在寻找自定义视图辅助器的人:


class ArrayCountViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper {

    /**
     * Get array count
     * 
     * @param mixed $array
     * @return string
     */
    public function render($array) {
        if (!is_array($array))
            return 0;
        return count($array);
    }
}

0
请参见上面的更新#2以获取答案。再次强调:
 <f:for each="{settings.halls}" as="hall" key="number" iteration="itemIteration">
    <f:if condition="{itemIteration.total} > 1">
       <f:if condition="{itemIteration.isLast}">
          <th><f:translate key="tx_bpscoupons_domain_model_coupon.hall" /></th>
       </f:if>   
    </f:if>
 </f:for>

这是一个权宜之计,但是有一种更简单的方法可以达到你想要的目标。请看我的回答。 - András Ottó

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接