如何:在流体中找到一个typoscript定义数组的长度?

时间:2013-12-31 15:20:03

标签: typo3 typoscript fluid

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

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

如何在我的流体模板中找到大厅阵列的长度?如果长度大于1,我希望if条件做一件事,如果不长,我想要做另一件事。

我正在使用带有extbase 1.3的typo3 v4.5.32。

谢谢。 我尝试了这个,但它推出了两个标签而不是一个。第一个if用来证明有多个元素,下一个用于打印出一个只有它是第一个元素。

 <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>

为什么呢?

更新:这是我的工作,因为缺乏“阵列长度&gt; 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: DOH!我错过了总数,只是我需要的但是我在寻找长度或数量,所以这段代码就是我想要的:

             <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>

4 个答案:

答案 0 :(得分:4)

您可以使用f:count ViewHelper找到数组的长度。就像其他ViewHelper一样,它可以用作内联表示法(你可以找到更多here

正确的代码是:

<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>

答案 1 :(得分: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>

答案 2 :(得分: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);
    }
}

答案 3 :(得分:0)

<f:if condition="{f:count(subject: settings.halls)} > 1"> do something </f:if>