CodeIgniter菜单,包含来自单个DB表的子项

时间:2014-07-08 22:58:17

标签: php database codeigniter dynamic menu

进入整个MVC开发风格。

使用CI我认为我对控制器,模型和视图有了初步的认识。但是,我遇到了一个问题,这个问题对我来说很容易,而且我自己的问题很严重。编码方式。

我有一个DB表来驱动动态菜单。设计是:

DB design

样本数据为:

DB sample data

无论如何,我脑子里的逻辑是:

  1. 选择* where active = 1,然后
  2. 如果行 parent_id == 0 检查检索到的行的数据集 当前行的 parent_id == id
  3. 如果找不到,请生成<li class="no_subs"></li>元素
  4. 如果找到,请生成<li class="subs">元素,打开新的<ul>
  5. 为匹配的所有项目生成<li></li>,关闭<ul>,关闭 &#34;潜艇&#34; <li>
  6. 因此,基于上面的示例数据,生成的html将是:

    <li class="no_subs">Home</li>
    <li class="no_subs">News</li>
    <li class="subs">Training
          <ul>
             <li>Materials</li>
             <li>Tests</li>
         </ul>
    </li>
    <li class="subs">Other
          <ul>
             <li>Usefull links</li>
         </ul>
    </li>
    

    到目前为止,我所能做的就是生成顶级菜单。 任何想法如何解决这个问题?

    谢谢,

1 个答案:

答案 0 :(得分:0)

您可以两次加入同一张桌子以实现目标

  1. 将数据放在parent_id == 0active == 1的位置,这样您就可以获得唯一的菜单标题。
  2. 使用id == parent_id所在的同一表格加入数据。所以你会得到这张表。
  3. id |名字| parent_id |活跃的|链接| as_id | as_name | as_parent_id | as_active | as_link

    **这两个步骤可以在单个SQL查询中完成。

    然后我认为这段代码可以帮助你...

           $sub_menu_started = false;
            for ($i=0; $i < count($result); $i++) { 
                if (empty($result[$i]['as_name'])) {
                    echo '<li class="no_subs">'.$result[$i]['name'].'</li>';
                }
                else {
                    if(!$sub_menu_started) {
                        echo '<li class="subs">'.$result[$i]['name'];
                        echo '<ul><li>'.$result[$i]['as_name'].'</li>';
                        $sub_menu_started = true;
                    }
                    else {
                        if ($result[$i]['id'] == $result[$i-1]['id']) {
                            echo '<li>'.$result[$i]['as_name'].'</li>';
                            if($result[$i]['id'] != $result[$i+1]['id']) {
                                echo '</ul></li>';
                                $sub_menu_started = false;
                            }
                        }                       
                    }   
                }
            }
            if ($sub_menu_started) {
                echo '</ul></li>';
            }