php中添加分类的界面设计,thinkphp3.1无限级分类模块的设计

本文介绍了如何在MySQL中使用一张表和一条SQL语句非递归地实现无限级分类。通过创建包含`colId`, `colPid`, `colPath`, `colTitle`字段的表,结合`concat`函数进行排序,可以高效获取分类层次结构。在ThinkPHP3.1框架中,通过模型的自动填充功能处理`colPath`字段,实现了添加和显示分类的树形结构。代码示例展示了控制器和模型类的关键部分。
摘要由CSDN通过智能技术生成

实现无限级分类一般只用一个数据表,通常可通过递归和非递归两种方法来实现。递归方法必须使用递归

调用方式才能进行数据遍历,删除等操作,所以需要发送多次查询数据库语句,非常影响执行效率。那么

非递归该怎样来实现无限分类呢?简单来说可用一张表四个字段和一条语句来实现。

1、一张表四个字段

DROP TABLE IF EXISTS `wb_columns`;

CREATE TABLE `eway_columns` (

`colId` smallint(5) unsigned NOT NULL AUTO_INCREMENT,

`colPid` smallint(5) unsigned NOT NULL DEFAULT '0',

`colPath` varchar(100) NOT NULL DEFAULT '',

`colTitle` varchar(100) NOT NULL DEFAULT '',

PRIMARY KEY (`colId`),

KEY `colPath` (`colPath`)

) ENGINE=MyISAM  CHARSET=utf8;

2、一条语句

SELECT concat(colPath,'-',colId) AS bpath, colId,colPid,colPath, colTitle,  FROM " . C

('DB_PREFIX') . "columns ORDER BY bpath, colId;

在上面的一条语句的SQL查询中,使用MYSQL中的concat函数将colPath和colId字段通过字符"-"连接起来

,并将该字段设置为bpath别名。然后先通过bpathpb 字段进行排序,如果有相同的路径再通过colId字段

进行排序,这样就会以分类的各级层次结构将结果返回。

下面是在thinkphp3.1中非递归无限级分类的实现代码

/**

* 分类Columns的控制器ColumnsAction.class.php

*/

class ColumnsAction extends Action{

//分类列表

public function index(){

$catarray=$this->Catlist();

$this->assign('catarray',$catarray);

$this->display();

}

//分类添加表单

public function insert() {

$catarray=$this->Catlist();

$this->assign('catarray',$catarray);

$this->display();

}

public function add() {

$D = D($module);

if ($vo = $D->create()) {//因为使用模型类处理,自动完成必须通过create方法才能生效。

$list = $D->add();

if ($list !==false) {

$this->success("添加成功");

} else {

$this->error('添加失败');

}

} else {

$this->error($D->getError());

}

}

//实现树型层级的分类

function Catlist() {

$Columns = new Model;

$Module = M("News");

$list = $Columns->query("SELECT concat(colPath,'-',colId) AS bpath,

colId,colPid,colPath, colTitle,  FROM " . C('DB_PREFIX') . "columns ORDER BY bpath, colId");

foreach ($list as $k => $v) {

$list[$k]['count'] = count(explode('-', $v['bpath']));

$list[$k]['total'] = $Module->where('catid=' . $v['colId'])->count();

$str = '';

if ($v['colPid'] <> 0) {

for ($i = 0; $i < $list[$k]['count'] * 2; $i++) {

$str .= ' ';

}

$str .= '|-';

}

$list[$k]['space'] = $str;

}

return $list;

}

/**

* 分类Columns的模型类ColumnsModel.class.php

* 作用:在添加分类或修改分类时自动处理colPath字段并保存到数据库中

* callback :回调方法 ,表示填充的内容是一个当前模型的方法

* Model:: MODEL_INSERT 或者1新增数据时候验证

* Model:: MODEL_UPDATE 或者2编辑数据时候验证

* Model:: MODEL_BOTH 或者3 全部情况下验证(默认),这里选择该验证。

*/

class ColumnsModel extends Model{

protected $_auto=array(//thinkphp的自动填充

array('colPath','colPath',3,'callback'),

);

function colPath(){

$colPid=isset($_POST['colPid'])?(int)$_POST['colPid']:0;

$colId=$_POST['colId'];

if($colPid==0){

return 0;

}

$fat=$this->where('colId='.$colPid)->find();//查询的是父级ID

$data=$fat['colPath'].'-'.$fat['colId'];//得到父级的colPath,连上父级ID,返回的

是子级的colPath

return $data;

}

}

需要注意的是,这是使用模型的自动完成功能,所以必须通过create方法才能生效,Create方法创建的数

据对象是保存在内存中,并没有实际写入到数据库中,直到使用add方法才真正写入数据库中。

完整的实例下载WBlog博客程序。

本文首发网志博客,欢迎转载!转载请注明本文地址,谢谢。

本文地址:http://www.w3note.com/web/32.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值