如何基于单表创建CodeIgniter动态菜单?附表结构示例
在CodeIgniter中实现三级动态树形菜单
嘿,这个需求在CodeIgniter里实现其实挺清晰的,咱们一步步来搞定它:
1. 先在Model层处理数据,把扁平数据表转成层级结构
首先创建一个Menu_model.php文件,负责从数据库获取数据并整理成我们需要的三级数组结构:
<?php class Menu_model extends CI_Model { public function get_hierarchical_menu() { // 查询所有菜单数据 $query = $this->db->get('menu'); $menu_data = $query->result_array(); $hierarchical_menu = []; foreach ($menu_data as $item) { $main_menu = $item['menu']; $sub_menu = $item['submenu']; $child_menu = $item['childmenu']; // 初始化主菜单节点 if (!isset($hierarchical_menu[$main_menu])) { $hierarchical_menu[$main_menu] = []; } // 初始化子菜单节点 if (!isset($hierarchical_menu[$main_menu][$sub_menu])) { $hierarchical_menu[$main_menu][$sub_menu] = []; } // 添加子子菜单 $hierarchical_menu[$main_menu][$sub_menu][] = $child_menu; } return $hierarchical_menu; } } ?>
这段代码会把数据库里的扁平数据转换成主菜单 => 子菜单 => 子子菜单数组的层级结构,自动帮我们去重重复的主菜单和子菜单。
2. 在Controller层调用模型,传递数据到视图
创建一个Menu.php控制器,加载模型并获取处理好的菜单数据,传给视图:
<?php class Menu extends CI_Controller { public function index() { // 加载模型 $this->load->model('Menu_model'); // 获取层级菜单数据 $data['menu'] = $this->Menu_model->get_hierarchical_menu(); // 加载视图并传递数据 $this->load->view('menu_view', $data); } } ?>
3. 在View层渲染树形菜单
最后创建menu_view.php视图文件,通过嵌套循环来渲染出带树形符号的菜单:
<?php foreach ($menu as $main_title => $submenus): ?> <?= $main_title ?> <?php $sub_count = count($submenus); $sub_index = 0; ?> <?php foreach ($submenus as $sub_title => $childmenus): ?> <?php $sub_index++; ?> <?php $is_last_sub = ($sub_index == $sub_count) ? true : false; ?> <?= $is_last_sub ? '└─' : '├─' ?> <?= $sub_title ?> <?php $child_count = count($childmenus); $child_index = 0; ?> <?php foreach ($childmenus as $child_title): ?> <?php $child_index++; ?> <?php $is_last_child = ($child_index == $child_count) ? true : false; ?> <?= $is_last_sub ? ' ' : '│ ' ?> <?= $is_last_child ? '└─' : '├─' ?> <?= $child_title ?> <?php endforeach; ?> <?php endforeach; ?> <?php endforeach; ?>
这段视图代码会根据是否是最后一个子菜单/子子菜单,切换对应的树形符号(├─、└─、│),完美还原你想要的菜单样式。
额外提示
如果未来菜单层级可能扩展,你可以把视图里的渲染逻辑改成递归函数,这样不管多少层级都能通用。另外,也可以把树形符号改成CSS样式来渲染,更灵活可控。
内容的提问来源于stack exchange,提问作者Jothees P
相关产品推荐
相关产品推荐

