You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:16:07