2012-02-01 32 views
1

Smartyを使用するPHPアプリケーションでは、多次元連想配列にアイテムやアイテムのグループを記述する値をテンプレートに渡して、リストとして表示したいと考えています。Smartyの多次元連想配列を反復する

$data = array(
    array(
     'type' => 'group', 
     'name' => 'Group 1', 
     'items' => array(
      array(
       'type' => 'group', 
       'name' => 'Group 2', 
       'items' => array(
        array(
         'type' => 'item', 
         'name' => 'Item 1' 
        ), 
        array(
         'type' => 'item', 
         'name' => 'Item 2' 
        ) 
       ) 
      ), 
      array(
       'type' => 'item', 
       'name' => 'Item 3' 
      ) 
     ) 
    ), 
    array(
     'type' => 'item', 
     'name' => 'Item 4' 
    ) 
); 
$smarty->assign('data', $data); 

そして、私はメインのテンプレートファイルにそれを使用しています:

私はscript.phpにこのような何かを

{include file="display_data.tpl" data="$data"} 

そしてdisplay_data.tpl中:

{if $data.type eq 'item'} 
    <li>{$data.name} ({$data.type})</li> 
{elseif $data.type eq 'group'} 
    <li> 
     {$data.name} ({$data.type}) 
     {include file="display_data.tpl" data=$data.items} 
    </li> 
{else} 
    <ol> 
     {foreach from=$data key=k item=i} 
      {include file="display_data.tpl" data=$data[$k]} 
     {/foreach} 
    </ol> 
{/if} 

ただし、効果は次のとおりです。

<ol> 
    <li>Group 1 (group)</li> 
    <li>Item 4 (item)</li> 
</ol> 

どのような意味でも、私は内部 'items'配列を反復することはできません。私は間違って何をしていますか?

ご協力いただきありがとうございます。

答えて

1

私は「サブ」の項目のマークアップがされるべきだと思う:これはあなたの応答をさらに

+0

感謝を助け

{foreach from=$data key=k item=i} {$i.name} ({$i.type}) {if $i.items} {foreach from=$i.data key=k item=k} {$k.name} ({$k.type}) {if $k.items} {foreach from=$k.data key=k item=z} {$z.name} ({$z.type}) {/foreach} {/if} {/foreach} {/if} {/foreach} 

期待しています。この方法は、問題の例のようにアイテムツリーの最大深さを知っている場合に機能します。しかし、私が実際にやろうとしていたものの、動作させることができなかったのは、ツリーの深さを処理することでした。これが再帰テンプレートを使用する理由です。この問題に関するアイデアですか? – user485332