代码之家  ›  专栏  ›  技术社区  ›  Michael Moussa Tejay Cardon

如何递归嵌套smarty foreach循环,同时仍能使用$smarty.foreach.<loopname>.first/last?

  •  1
  • Michael Moussa Tejay Cardon  · 技术社区  · 15 年前

    我有一个智能模板文件,在其中循环遍历由嵌套数组表示的分层数据。子数据的表示方式与父数据完全相同,因此我希望递归地 {include} 要呈现此内容的Smarty模板:

    “my.tpl”的来源 :

    {foreach from=$children item="child" name="childrenLoop"}
        {* display stuff here *}
        {if $smarty.foreach.childrenLoop.last}
            {* do something special here when it is the last item *}
        {/if}
    
        {assign var="grandChildren" value=$child->getChildren()}
        {if $grandChildren|@count > 0}
            {include file="my.tpl" children=$grandChildren}
        {/if}
     {/foreach}
    

    我的问题是当 {包含} 完成执行, $smarty.foreach.childrenLoop.* 告诉我关于 {include}'s 循环,而不是当前循环。所以如果内环有10个项目,外环有5个, {$smarty.foreach.childrenLoop.total} 当我退出内环时是10,而不是5。不用说,这把我的产出搞得一团糟。

    我想我可以通过在循环中使用include传递的值来绕过这个问题。我似乎能够正确地命名循环:

    {foreach from=$children item="child" name="childrenLoop_`$suffix`"}
    

    …但是我不知道如何访问它的属性,而且Smarty手册没有帮助:

    {$smarty.foreach.childrenLoop_$suffix.total} {* NOPE! *}
    {$smarty.foreach[childrenLoop_$suffix].total} {* NOPE! *}
    

    我能在这里做什么?

    1 回复  |  直到 15 年前
        1
  •  1
  •   hsz    15 年前

    也许试试

    {assign var="chSuffix" value="childrenLoop_$suffix"}
    {foreach from=$children item="child" name="$chSuffix"}
        {$smarty.foreach.$chSuffix.total}
    {/foreach}