Parent - Child - Codeigniter视图中的Grand Child类别标记

时间:2017-04-08 11:42:18

标签: php twitter-bootstrap codeigniter

我有一个测试数据库表,其名称为autos,如下面的

enter image description here

我在模型中使用递归函数来获取数组中的数据并将其转储。它看起来很像跟随

Array
(
[menu] => Array
    (
        [0] => Array
            (
                [id] => 1
                [name] => Automobiles
                [parent] => 0
                [child] => Array
                    (
                        [0] => Array
                            (
                                [id] => 2
                                [name] => Honda
                                [parent] => 1
                                [child] => Array
                                    (
                                        [0] => Array
                                            (
                                                [id] => 3
                                                [name] => Cars
                                                [parent] => 2
                                                [child] => Array
                                                    (
                                                        [0] => Array
                                                            (
                                                                [id] => 4
                                                                [name] => Civic
                                                                [parent] => 3
                                                                [child] => Array
                                                                    (
                                                                        [0] => Array
                                                                            (
                                                                                [id] => 5
                                                                                [name] => Prosmetic
                                                                                [parent] => 4
                                                                            )

                                                                    )

                                                            )

                                                    )

                                            )

                                    )

                            )

在我看来,我正在创建一个标准引导程序multi-level dropdown,但我没有得到所有子菜单

enter image description here

问题:我没有得到所有孩子

我相信我找到了我的视图代码中的原因。以下是呈现下拉列表的代码片段

<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">Menu<span class="caret"></span></button>
    <ul class="dropdown-menu">
        <?php for($i=0;$i<count($menu);$i++){?>
            <?php if(!empty($menu[$i]['child'])){?>
                <li class="dropdown-submenu">
                    <a class="test" href="#"><?php echo $menu[$i]['name']?> <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                        <?php for($j=0;$j<count($menu[$i]['child']);$j++){?>
                            <li><a href="#"><?php echo $menu[$i]['child'][$j]['name']?></a></li>
                        <?php }?>
                    </ul>
                </li>
            <?php }else{?>
                <li><a tabindex="-1" href="#"><?php echo $menu[$i]['name']?></a></li>
        <?php }}?>
    </ul>
</div>

我只能得到一级孩子,因为我只是检查一级孩子。如何在视图中重复(递归)执行此操作。我不能只是继续检查孩子的子孩子等等。必须有办法。有人能指出我正确的方向吗?

编辑:我的模型

function getCategoriesByParentId($category_id) {
    $data = $this->db->select('*')->from('autos')->WHERE('parent',$category_id)->get()->result_array();
    for($i=0;$i<count($data);$i++)
    {
        if($this->getCategoriesByParentId($data[$i]['id']))
        {
            $data[$i]['child']=$this->getCategoriesByParentId($data[$i]['id']);
        }
    }
    return $data;
}

我的控制器

public function index()
{
    $this->load->model('Test_model');
    $data['menu']=$this->Test_model->getCategoriesByParentId(0);
    //echo '<pre>';print_r(($data));echo '</pre>';exit;

    $data['title']='testing';
    $this->load->view('head',$data);
    $this->load->view('dropdown');
}

我插入了更多类别和子类别。现在菜单看起来像这样

enter image description here

1 个答案:

答案 0 :(得分:1)

递归函数可能会有所帮助。它可以放在一个帮助文件中,然后你可以从像printMenu($menu);

这样的视图中调用它

更新示例: 如果您需要排除数组中的第一个元素,因为您似乎想要将其标识为父元素,您可以执行以下操作:

HELPER:(例如menu_helper.php放入文件夹帮助程序)

function printMenu($a) {

  if (!is_array($a)) {
    return;
  } 

  foreach($a as $m) {         
      if($m['parent'] > 0){
          echo '<li><a tabindex="-1" href="#">'. $m['name'] .'</a></li>';             
      }

      if(is_array($m['child'])){
        printMenu($m['child']);
      }
  }
}

查看:

<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">Menu<span class="caret"></span></button>
    <ul class="dropdown-menu">
        <?php if($has_children){ ?>
            <li class="dropdown-submenu">
                <a class="test" href="#"><?php echo $menu[0]['name']?> <span class="caret"></span></a>
                <ul class="dropdown-menu">                      
                    <?php printMenu($menu); ?>
                </ul>
            </li>
        <?php } else {?>
            <li><a tabindex="-1" href="#"><?php echo $menu[0]['name']?></a></li>
        <?php } ?>
    </ul>
</div>

<强> CONTROLLER

public function index()
{
    $this->load->helper('menu'); // OUR NEW HELPER FILE
    $this->load->model('Test_model');
    $data['menu'] = $this->Test_model->getCategoriesByParentId(0);
    $data['has_children'] = 1; //REPLACE WITH A QUERY OR FUNCTION TO CHECK IF CHILDREN EXISTS IN YOU MENU
    $this->load->view('dropdown', $data);
}

上面的示例仅适用于具有一个父级的数组。如果您需要多个父母,则必须为每个父母调用该函数。这不是最佳的,如果您需要在Codeigniter中对多个深度的菜单进行更高级的处理,您可以检查此项目中的库:https://github.com/edomaru/codeigniter_multilevel_menu

图书馆暂时没有更新,我不知道它是否与CI 3兼容,但也许您可以通过检查源代码获得一些如何进行的想法。他们甚至在那里有一个Bootstrap 3示例。