3

再帰関数を使用して php で作成した配列があります。次元数がわかりません。Smarty で使用するにはどうすればよいですか?

私はこのコードを使用しようとしています:

{foreach $myArr as $items}
    <li>
          {$items.title}
          {if $item.submenu}
                 <ul>
                 {foreach $items.submenu as $items2}
                     <li>{$items2.title}</li>
                 {/foreach}
                 </ul>
          {/if}
    </li>
{/foreach}

しかし、このコードは 2 レベルのみです。私のアレイには 3 か 4 か ... レベルがあるかもしれません。

アップデート:

私は解決策を見つけました。私の解決策では Smarty 関数を使用しています:

        {function name=menu level=0}
            <ul>
                {foreach $data as $items}
                    <li>
                        <a href="{$items.url}">
                            {$items.title}
                        </a>
                        {if is_array($items.submenu)}
                            {menu data=$items.submenu level=$level+1}
                        {/if}
                    </li>
                {/foreach}
            </ul>
        {/function}


{menu data=$menuItems}
4

1 に答える 1

0

私は別のアプローチをとります。私の提案: メニューで配列を作成する代わりに。2 つまたは 1 つのクラスを作成します。

最初のクラスは、項目をキー/値の方法で保持する Menu クラスです。2 番目のクラスは、メニュー項目になります。

そうすれば、モデルでの関数呼び出しとビューでの印刷を通じて、必要なすべての反復/ロジックを実行できます。

何かのようなもの:

class Menu {

    protected $_items = array();
    protected $_parent_child = array();

    public function add_menu_item($name, $id, $parent_id) {
        if (array_key_exists($id, $this->_items))
            return;

        $this->_items[$i] = array('name' => $name, 'id' => $id, 'parent' => $parent_id) // model with data
        $this->_parent_child[$parent_id] = $this->_items[$id];
    }


    public function get_nodes_by_parent($id=null /*for root*/) {
        if (array_key_exists($id, $this->_parent_child))
            return $this->_parent_child[$id];

        return array(); // or null or something     
    }



}

メニュー テンプレート:

{foreach($menuClass->get_nodes_by_parent() as $item ) {
    <ul>
        <li>{$item['name']}</li>
        {include 'sub_cats' id=$item['id'], menuclass=$menuclass}
    </ul>
{endforeach}

サブカテゴリ テンプレート:

{foreach($menuClass->get_nodes_by_parent($id) as $item ) {
    <ul>
        <li>{$item['name']}</li>
        {include 'sub_cats' id=$item['id']}
    </ul>
{endforeach}

これは完全ではなく、テストもされていません。しかし、それが私のアプローチです。

于 2013-02-14T07:33:12.770 に答える