【问题标题】:Create multi level menu using Yii使用 Yii 创建多级菜单
【发布时间】:2014-03-05 16:27:14
【问题描述】:

yii中多级菜单的情况如何查询?

例如我有一个这样的表:

menu_name 将跟随 parrent_id,因此它将形成一个 hierarchical 菜单

如何在我的布局中使用Yii,以便输出为上面的html

我的代码:

<?php
Yii::import('zii.widgets.CMenu', true);

class ActiveMenu extends CMenu
{
    public function init(){

    $criteria = new CDbCriteria;
    $criteria->condition='published=:idpub AND menu_controller=:menu';
    $criteria->params=array(':idpub'=>1, ':menu'=>'#');

    $items = Menu::model()->findAll($criteria);

    echo "<ul id='yw1' class='nav'>";

        foreach ($items as $item)
        {
            echo "<li class='dropdown'>
                    <a href=".$item->menu_controller." data-toggle='dropdown' class='dropdown-toggle'>
                    <i class='icon-white icon-list'></i>".$item->menu_name."<b class='caret'></b></a>
                </li>";
        }

        echo "</ul>";

        parent::init();
    }
}

但在上面的代码中我只得到parents data。我要如何循环以将 childs data 包含在每个父母菜单中,例如这个 html 代码:

<ul id="yw1" class="nav">
    <li><a href="/app/home.html"><span class="icon-white icon-tasks"></span> Home</a></li>

    <li class="dropdown">
        <a href="#" data-toggle="dropdown" class="dropdown-toggle">
        <i class="icon-white icon-list"></i>Master<b class="caret"></b></a>
        <ul class="dropdown-menu">
            <li><a href="expedition"><span class="icon-bar icon-list"></span> Expedition</a></li>
        </ul>
        <ul class="dropdown-menu">
            <li><a href="partner"><span class="icon-bar icon-list"></span> Partner</a></li>
        </ul>
        <ul class="dropdown-menu">
            <li><a href="user"><span class="icon-bar icon-list"></span> User</a></li>
        </ul>
    </li>

    <li class="dropdown">
        <a href="#" data-toggle="dropdown" class="dropdown-toggle">
        <i class="icon-white icon-list"></i>Transaction<b class="caret"></b></a>
        <ul class="dropdown-menu">
            <li><a href="processin"><span class="icon-bar icon-list"></span> Process In</a></li>
        </ul>
        <ul class="dropdown-menu">
            <li><a href="processout"><span class="icon-bar icon-list"></span> Process Out</a></li>
        </ul>
        etc ....
        etc ....
        etc ....
    </li>
</ul>

谢谢

【问题讨论】:

  • 为什么要更改 CActiveMenu 中的实现?你也可以在你的视图中做到这一点

标签: php html yii


【解决方案1】:

您可以像这样为您的孩子创建一个递归函数

<?php
    class ActiveMenu extends CMenu
    {
        public function init(){
            $this->renderChilds();
        }

        protected function getChilds($parent_id)
        {
            $criteria = new CDbCriteria;
            $criteria->condition='published=:idpub AND menu_controller=:menu AND parent_id = :parent';
            $criteria->params=array(':idpub'=>1, ':menu'=>'#', ':parent'=>$parent_id);
            $items = Menu::model()->findAll($criteria);
            return $items;
        }            

        public function renderChilds($parent_id=0, $class='nav')
        {
             $items = $this->getChilds($parent_id);
             if (!empty($items))
             {
                 echo "<ul class='$class'>";
                 foreach ($items as $item)
                 {
                     echo "<li class='dropdown'>
                     <a href=".$item->menu_controller." data-toggle='dropdown' class='dropdown-toggle'>
                     <i class='icon-white icon-list'></i>".$item->menu_name."<b class='caret'></b></a>";
                     $this->renderChilds($item->id, 'dropdown-menu');                
                     echo "</li>";
                 }
                 echo "</ul>";
             }
         }

         ...
     }    

【讨论】:

  • 我试过一次,但 result : s24.postimg.org/3zu7b6jo5/bad.png 不是应该的
  • 您需要删除条件menu_controller=:menu 否则您只会在 menu_controller 中获得带有 '#' 值的行
猜你喜欢
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多