zoukankan      html  css  js  c++  java
  • thinkphp3.1无限级分类模块的设计

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

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

    非递归该怎样来实现无限分类呢?简单来说可用一张表四个字段和一条语句来实现。
    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方法才真正写入数据库中。
    完整的实例下载WBlog博客程序。
    本文首发网志博客,欢迎转载!转载请注明本文地址,谢谢。 

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

    专注于手机端的app,小程序,H5以及微信公众号提供解决方案
  • 相关阅读:
    mySQL安装的时候一直卡在starting server这里解决办法
    编译安装nginx
    用户访问网站原理及流程
    mysql备份及恢复
    sed
    mysql 基础
    nginx优化
    mysql 三种日志
    tr
    date
  • 原文地址:https://www.cnblogs.com/ewblgo/p/2976938.html
Copyright © 2011-2022 走看看