在 CodeIgniter (CI) 框架中实现无限级分类(如商品分类、地区分类等)通常需要结合递归算法。以下是一个完整的实现示例,包括数据库设计、模型、控制器和视图。
1. 数据库设计
假设我们有一个分类表 categories
,结构如下:
字段名 | 类型 | 说明 |
---|---|---|
id | INT | 分类ID (主键) |
parent_id | INT | 父分类ID (0表示顶级) |
name | VARCHAR(255) | 分类名称 |
sort_order | INT | 排序字段 |
SQL 示例:
CREATE TABLE categories ( id INT AUTO_INCREMENT PRIMARY KEY, parent_id INT DEFAULT 0, name VARCHAR(255) NOT NULL, sort_order INT DEFAULT 0);
2. 模型 (Category_model.php
)
在模型中,编写一个递归方法获取无限级分类数据。
<?phpdefined('BASEPATH') OR exit('No direct script access allowed');class Category_model extends CI_Model { public function __construct() { parent::__construct(); $this->load->database(); } /** * 获取所有分类 */ public function get_categories() { $query = $this->db->get('categories'); return $query->result_array(); } /** * 递归生成树形结构 * * @param array $categories 所有分类数据 * @param int $parent_id 父分类ID * @return array */ public function build_tree($categories, $parent_id = 0) { $tree = array(); foreach ($categories as $category) { if ($category['parent_id'] == $parent_id) { // 递归获取子分类 $children = $this->build_tree($categories, $category['id']); if ($children) { $category['children'] = $children; } $tree[] = $category; } } return $tree; }}?>
3. 控制器 (Category.php
)
在控制器中调用模型方法,并将数据传递到视图。
<?phpdefined('BASEPATH') OR exit('No direct script access allowed');class Category extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model('Category_model'); } /** * 显示分类树 */ public function index() { // 获取所有分类数据 $categories = $this->Category_model->get_categories(); // 生成树形结构 $tree = $this->Category_model->build_tree($categories); // 传递数据到视图 $data['tree'] = $tree; $this->load->view('category_tree', $data); }}?>
4. 视图 (category_tree.php
)
在视图中递归渲染分类树。
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>无限级分类树</title> <style> ul { list-style-type: none; } li { margin-left: 20px; } </style></head><body> <h1>分类树</h1> <ul> <?php echo $this->render_tree($tree); ?> </ul></body></html><?php/** * 递归渲染分类树 * * @param array $tree 分类树数据 * @return string */function render_tree($tree) { $html = ''; foreach ($tree as $node) { $html .= '<li>' . $node['name']; if (!empty($node['children'])) { $html .= '<ul>' . render_tree($node['children']) . '</ul>'; } $html .= '</li>'; } return $html;}?>
5. 示例数据
假设 categories
表中有以下数据:
id | parent_id | name | sort_order |
---|---|---|---|
1 | 0 | 电子产品 | 1 |
2 | 1 | 手机 | 2 |
3 | 1 | 电脑 | 1 |
4 | 2 | 智能手机 | 1 |
5 | 2 | 功能手机 | 2 |
6 | 0 | 服装 | 2 |
7 | 6 | 男装 | 1 |
8 | 6 | 女装 | 2 |
6. 输出结果
访问 Category
控制器的 index
方法后,页面会渲染出以下分类树:
分类树 - 电子产品 - 手机 - 智能手机 - 功能手机 - 电脑 - 服装 - 男装 - 女装
7. 优化建议
缓存分类数据:
如果分类数据不经常变化,可以将生成的树形结构缓存到文件或 Redis 中,减少数据库查询。
排序支持:
在递归时可以根据
sort_order
字段对分类进行排序。前端交互:
可以使用 JavaScript 库(如 jQuery)实现分类树的展开/折叠功能。
性能优化:
如果分类数据量非常大,可以考虑使用非递归方式生成树形结构,减少递归深度。
通过以上代码,你可以在 CodeIgniter 框架中实现无限级分类,并利用递归生成树形结构。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。