• 专注于网站建设,网络推广,关键词优化,SEO优化,专业的网站建设开发团队!
首页 > IT技术 > PHP > 内容

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

2015-06-11 22:25:11   来源:叶景网络

实现无限级分类一般只用一个数据表,通常可通过递归和非递归两种方法来实现。递归方法必须使用递归调用方式才能进行数据遍历,删除等操作,所以需要发送多次查询数据库语句,非常影响执行效率。那么非递归该怎样来实现无限分类呢?简单来说可用一张表四个字段和一条语句来实现。
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中非递归无限级分类的实现代码
<?php
/**
 * 分类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 .= '&nbsp;';
                }
                $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 全部情况下验证(默认),这里选择该验证。
 */
<?php
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方法才真正写入数据库中。

叶景网络,网络推广,网站建设
特别推荐RECOMMEND
搜索引擎网站关键词seo优化的意义
视频推广怎么做
网站seo优化怎么做关键词排上首页?
SEO介绍什么叫搜索引擎网站关键词优化
seo优化怎样做提升关键词排名
热点图文Hot
PHP通过soap调用.net接口asmx文件 PHP通过soap调用.ne
PHP开发环境配置 PHP开发环境配置
wamp集成环境的虚拟域名配置方法 wamp集成环境的虚拟
wamp独立安装配置 wamp独立安装配置
关注排行RANKING
1

PHP通过soap调用.net接口asmx文件

PHP通过soap调用.net接口asmx文件 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网...

2

PHP开发环境配置

PHP开发环境配置 下载PHP安装程序,并解压缩。(下载页面为http: www php net downloads php,下...

3

wamp集成环境的虚拟域名配置方法

wamp集成环境的虚拟域名配置方法 最近,发现身边很多人用wamp集成环境,这个虽然比较快捷,一步到位,但是只能访...

4

wamp独立安装配置

wamp独立安装配置 apache 中的 httpd conf LoadModule php5_module "D: lamp php5 php5apache2_2 dll " 加载模块并开启

5

php 获取今天明天昨天时间戳

php 获取今天明天昨天时间戳 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网...

6

PHP获取服务器信息 MySql版本和浏览器信息

PHP获取服务器信息 MySql版本和浏览器信息 1、$_SESSION[ PHP_SELF ] -- 获取当前正在执行脚本的文件名 2...

7

smarty 截取字符串函数 truncate的用法

smarty 截取字符串函数 truncate的用法 smarty truncate 截取字符串,从字符串开始处截取某长度的字符,默认的长度为8...

8

php编程常用函数方法等

php编程常用函数方法等 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网站...

9

如何让ThinkPHP的模板引擎达到最佳效率

如何让ThinkPHP的模板引擎达到最佳效率 默认情况下ThinkPHP框架系统默认使用的模板引擎是内置模板引擎。内置模板引擎支持模板文...