ThinkPHP 利用自动完成机制实现无限级分类

陈默
陈默
发布时间:2026-10-13| 5人浏览过
原创

本文将详细解析如何利用 ThinkPHP 框架的模型自动完成特性,构建一个支持无限层级的分类系统。通过自动生成层级排序字段(sort)并在模板中渲染缩进效果,实现清晰的数据展示。

结果与目标

最终目标是建立一个基于数据库的无限级分类树,具备以下特征:

  1. 数据录入便捷:新增分类时,只需指定父级 ID,系统自动计算并写入层级排序依据。
  2. 前端展示直观:通过 CSS 缩进或文本前缀(如 ---),将平铺的列表还原为树状结构。
  3. 底层逻辑解耦:业务逻辑集中在 Model 层,控制器保持简洁。

原理与数据结构设计

实现无限级分类的核心在于如何快速检索和展示父子关系。本方案采用一种直观的路径标记法:

  • sort 字段:存储该分类所在的路径,格式为 ID1-ID2-ID3-...。例如顶级分类 ID=5 的 sort 为 0-5,其子节点 ID=8 的 sort 为 0-5-8。
  • 排序方式:由于字符串排序天然支持这种路径结构(短路径排在前面,同级按 ID 排),直接对 concat(sort, '-', id) 进行升序排列即可完美还原树的层级顺序。

真实操作顺序

第一步:定义数据模型(Model)

这是实现自动化的核心环节。我们需要继承 Model 类,配置 _auto 数组以激活自动处理机制。

具体代码如下,重点解释 createsort 函数的执行逻辑:

<?php
class ColumnModel extends Model{
	// 定义自动完成规则
	protected $_auto=array(
		array('name','trim',0,'function'),//过滤用户不小心输入的空白字符
		array('sort','createsort',0,'callback'), // 关键:使用 callback 调用自定义函数生成排序值
	);

	/**
	* 自动完成sort字段
	* 根据POST过来的fid来查询上级sort,以确定本级sort
	*/
	protected function createsort(){
		$fid=$_POST['fid']?(int)$_POST['fid']:0;//如果用户没有选择父栏目,则默认父栏目id为0
		if($fid!='0'){
			$list=$this->where("id=$fid")->find();
			$data=$list['sort'].'-'.$fid;
		}else{
			$data='0';
		}
		return $data;
	}
}
?>

参数说明:

  • array('sort','createsort',0,'callback'):当模型进行写操作(新增/编辑)时,调用 createsort() 方法的结果赋值给 sort 字段。

第二步:编写控制器(Controller)

控制器负责加载数据和接收表单提交。在处理列表展示时,利用 TP 内置的方法动态拼接排序关键字段,省去大量 PHP 层面的循环运算。

Index 模块(展示层)代码:

<?php
class IndexAction extends Action {
public function index(){
	$Column=new ColumnModel();
	// 核心技巧:在SQL层面拼接 nsort = sort-id 组合键
	$list=$Column->field("id,name,fid,sort,concat(sort,'-',id) nsort")->order('nsort asc')->select();
	
	foreach($list as $key=>$val){
		// 计算层级数
		$layer=count(explode('-',$list[$key]['nsort']));
		$list[$key]['blank']='';
		// 根据层级数添加前缀空格或符号
		for($i=0;$i<$layer;$i++){
			if($i==$layer-1){
				$list[$key]['blank'].='---|';
			}else{
				$list[$key]['blank'].='---';
			}
		}
	}
	$this->assign('list',$list);
	$this->display();
}

public function add(){
	$Column=new ColumnModel;
	$Column->create(); // 触发 _auto 自动处理逻辑
	if($Column->add()){
		$this->success('添加成功');
	}else{
		$this->error($Column->getError());
	}
} 
} 
?>

Add 模块(提交页)界面示意:

第三步:搭建前端模板(View)

模板的主要职责是提供一个下拉菜单,方便用户在添加新分类时选择父级。同时,在列表中利用上一步计算出的 blank 变量展示层级。

模板核心代码(index.html):

<form action="__URL__/add" method="post">
栏目

关于模型层级的视觉呈现:

完成判断

部署完成后,请在后台尝试以下操作以验证:

  1. 测试自动填充:选择一个非根节点的父分类进行新建。检查数据库中对应记录的 sort 字段是否正确继承了父级的路径。
  2. 测试展示层级:刷新首页列表。观察包含多个层级关系的分类名称前是否准确显示了 --- 等缩进标识。
  3. 测试下拉关联:在下拉菜单查看是否能顺畅地遍历所有已存在的分类作为新的父级。

以上就是使用 ThinkPHP 自动完成实现无限级分类的详细内容,更多关于 ThinkPHP 无限级分类的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。