2017-04-08 65 views
0

我有汽车的名称测试数据库表像下父母 - 孩子 - 大子类标记在笨视图

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

+0

将$ menu的输出添加为代码不在图片中 –

+0

图片已移除。输出代码格式。 –

+0

我没有测试,但有一看功能 功能arrayToMenu($阵列) \t { \t $出来= '

    '; \t的foreach($数组作为$键=> $ ELEM) \t { \t $出来。= '
  • '。$ ELEM [ '名'。(!空($ ELEM [ '孩子'])?arrayToMenu( $ elem ['child']):'')。''
  • '; \t} \t return $ out。'
'; \t} – Snm

回答

1

递归函数可能会有所帮助。它可以被放置在一个辅助文件,然后你可以从视图中这样称呼它以实例printMenu($menu);

UPDATE: 如果您需要排除的第一个元素数组中,因为它似乎要识别它作为父母,你可以做这样的事情:

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']); 
     } 
    } 
} 

VIEW:

<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的例子。

+0

到目前为止,我可以得到最好的答案。谢谢@Michael K –