CodeIgniter动态菜单创建及分类列表展示问题求助
CodeIgniter 动态菜单与分类列表问题解决方案
嘿,我来帮你搞定这两个CodeIgniter相关的问题!
一、如何在CodeIgniter中创建动态菜单
动态菜单的核心是从数据库取数后整理成层级结构,再在视图中渲染,具体步骤如下:
1. 设计合适的数据库表
建议创建一个menus表,字段如下:
id:主键(自增)menu_name:菜单显示名称parent_id:父菜单ID(0代表顶级菜单)menu_url:菜单跳转的URL路径status:状态(1=启用,0=禁用)sort_order:菜单排序优先级
2. 模型层编写数据获取与结构整理方法
在你的模型文件(比如Menu_model.php)中添加以下方法,用来获取启用的菜单并整理成树形结构:
public function get_active_menus() { $this->db->where('status', 1); $this->db->order_by('sort_order', 'ASC'); $raw_menus = $this->db->get('menus')->result_array(); // 递归生成树形菜单结构 return $this->build_menu_hierarchy($raw_menus); } private function build_menu_hierarchy($menus, $parent_id = 0) { $hierarchy = []; foreach ($menus as $menu) { if ($menu['parent_id'] === $parent_id) { // 递归获取子菜单 $children = $this->build_menu_hierarchy($menus, $menu['id']); if (!empty($children)) { $menu['children'] = $children; } $hierarchy[] = $menu; } } return $hierarchy; }
3. 控制器中调用模型并传数据到视图
在控制器里加载模型,获取整理好的菜单数据,传给视图:
public function index() { $this->load->model('Menu_model'); $data['dynamic_menu'] = $this->Menu_model->get_active_menus(); $this->load->view('your_view_file', $data); }
4. 视图层渲染菜单
在视图文件里写一个递归函数来渲染多层菜单:
<!-- 渲染动态菜单 --> <?php echo $this->render_dynamic_menu($dynamic_menu); ?> <?php function render_dynamic_menu($menus) { $html = '<ul class="menu">'; foreach ($menus as $menu) { $html .= '<li> <a href="' . base_url($menu['menu_url']) . '">' . $menu['menu_name'] . '</a>'; // 如果有子菜单,递归渲染 if (isset($menu['children'])) { $html .= $this->render_dynamic_menu($menu['children']); } $html .= '</li>'; } $html .= '</ul>'; return $html; } ?>
二、解决分类列表的层级展示问题
看了你给出的数据表结构和期望的输出,我们需要把平级的数据整理成分类→子菜单→菜单的三级结构,具体实现如下:
1. 模型层获取数据
在你的Admin_model里添加获取菜单数据的方法:
public function get_menu_data() { // 只获取状态为启用的记录 $this->db->where('status', 1); // 按分类和子菜单排序,保证输出有序 $this->db->order_by('category_name', 'ASC'); $this->db->order_by('sub_category', 'ASC'); return $this->db->get('your_table_name')->result_array(); // 替换成你的实际表名 }
2. 控制器中整理数据结构
在控制器的index方法里,把平级数据转换成你需要的层级结构:
public function index(){ // 获取原始数据 $raw_menu = $this->Admin_model->get_menu_data(); $structured_menu = []; foreach ($raw_menu as $item) { $category = $item['category_name']; $submenu = $item['sub_category']; $menu_item = $item['name']; // 初始化分类节点 if (!isset($structured_menu[$category])) { $structured_menu[$category] = []; } // 初始化子菜单节点 if (!isset($structured_menu[$category][$submenu])) { $structured_menu[$category][$submenu] = []; } // 添加菜单到对应节点下 $structured_menu[$category][$submenu][] = $menu_item; } $data['menu'] = $structured_menu; $this->load->view('view_admin/home', $data); }
3. 视图层渲染层级结构
在view_admin/home.php里循环输出整理好的结构:
<?php foreach ($menu as $category => $submenus): ?> <div style="margin: 10px 0;"> <strong><?php echo $category; ?></strong> <ul style="margin-left: 20px; list-style: disc;"> <?php foreach ($submenus as $submenu => $items): ?> <li> <?php echo $submenu; ?> <ul style="margin-left: 20px; list-style: circle;"> <?php foreach ($items as $item): ?> <li><?php echo $item; ?></li> <?php endforeach; ?> </ul> </li> <?php endforeach; ?> </ul> </div> <?php endforeach; ?>
这样就能得到你期望的层级输出啦!
内容的提问来源于stack exchange,提问作者Jothees pvj
相关产品推荐
相关产品推荐

