您的位置:首页 > 编程语言 > PHP开发

thinkphp3.1无限级分类模块的设计

2016-03-09 00:00 639 查看
实现无限级分类一般只用一个数据表,通常可通过递归和非递归两种方法来实现。递归方法必须使用递归调用方式才能进行数据遍历,删除等操作,所以需要发送多次查询数据库语句,非常影响执行效率。那么非递归该怎样来实现无限分类呢?简单来说可用一张表四个字段和一条语句来实现。
1、一张表四个字段

1DROPTABLEIFEXISTS`wb_columns`;
2CREATETABLE`eway_columns`(
3`colId`smallint(5)unsignedNOTNULLAUTO_INCREMENT,
4`colPid`smallint(5)unsignedNOTNULLDEFAULT'0',
5`colPath`varchar(100)NOTNULLDEFAULT'',
6`colTitle`varchar(100)NOTNULLDEFAULT'',
7PRIMARYKEY(`colId`),
8KEY`colPath`(`colPath`)
9)ENGINE=MyISAMCHARSET=utf8;
2、一条语句

1SELECTconcat(colPath,'-',colId)ASbpath,colId,colPid,colPath,colTitle,FROM".C('DB_PREFIX')."columnsORDERBYbpath,colId;
在上面的一条语句的SQL查询中,使用MYSQL中的concat函数将colPath和colId字段通过字符"-"连接起来,并将该字段设置为bpath别名。然后先通过bpathpb字段进行排序,如果有相同的路径再通过colId字段进行排序,这样就会以分类的各级层次结构将结果返回。
下面是在thinkphp3.1中非递归无限级分类的实现代码

01<?php
02/**
03*分类Columns的控制器ColumnsAction.class.php
04*/
05classColumnsActionextendsAction{
06//分类列表
07publicfunctionindex(){
08
09$catarray=$this->Catlist();
10
11$this->assign('catarray',$catarray);
12
13$this->display();
14}
15
16//分类添加表单
17publicfunctioninsert(){
18$catarray=$this->Catlist();
19
20$this->assign('catarray',$catarray);
21
22$this->display();
23
24}
25
26publicfunctionadd(){
27$D=D($module);
28if($vo=$D->create()){//因为使用模型类处理,自动完成必须通过create方法才能生效。
29$list=$D->add();
30if($list!==false){
31$this->success("添加成功");
32}else{
33$this->error('添加失败');
34}
35
36}else{
37$this->error($D->getError());
38}
39}
40//实现树型层级的分类
41functionCatlist(){
42$Columns=newModel;
43$Module=M("News");
44$list=$Columns->query("SELECTconcat(colPath,'-',colId)ASbpath,colId,colPid,colPath,colTitle,FROM".C('DB_PREFIX')."columnsORDERBYbpath,colId");
45
46foreach($listas$k=>$v){
47$list[$k]['count']=count(explode('-',$v['bpath']));
48$list[$k]['total']=$Module->where('catid='.$v['colId'])->count();
49$str='';
50if($v['colPid']<>0){
51for($i=0;$i<$list[$k]['count']*2;$i++){
52$str.=' ';
53}
54$str.='|-';
55}
56$list[$k]['space']=$str;
57}
58
59return$list;
60}
61
62
63/**
64*分类Columns的模型类ColumnsModel.class.php
65*作用:在添加分类或修改分类时自动处理colPath字段并保存到数据库中
66*callback:回调方法,表示填充的内容是一个当前模型的方法
67*Model::MODEL_INSERT或者1新增数据时候验证
68*Model::MODEL_UPDATE或者2编辑数据时候验证
69*Model::MODEL_BOTH或者3全部情况下验证(默认),这里选择该验证。
70*/
71<?php
72classColumnsModelextendsModel{
73protected$_auto=array(//thinkphp的自动填充
74array('colPath','colPath',3,'callback'),
75
76);
77
78functioncolPath(){
79$colPid=isset($_POST['colPid'])?(int)$_POST['colPid']:0;
80$colId=$_POST['colId'];
81if($colPid==0){
82return0;
83}
84
85$fat=$this->where('colId='.$colPid)->find();//查询的是父级ID
86$data=$fat['colPath'].'-'.$fat['colId'];//得到父级的colPath,连上父级ID,返回的是子级的colPath
87return$data;
88}
89}
需要注意的是,这是使用模型的自动完成功能,所以必须通过create方法才能生效,Create方法创建的数据对象是保存在内存中,并没有实际写入到数据库中,直到使用add方法才真正写入数据库中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: