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以及微信公众号提供解决方案
  • 相关阅读:
    JavaScript对原始数据类型的拆装箱操作
    Javascript继承(原始写法,非es6 class)
    动态作用域与词法作用域
    自行车的保养
    探索JS引擎工作原理 (转)
    C语言提高 (7) 第七天 回调函数 预处理函数DEBUG 动态链接库
    C语言提高 (6) 第六天 文件(续) 链表的操作
    C语言提高 (5) 第五天 结构体,结构体对齐 文件
    C语言提高 (4) 第四天 数组与数组作为参数时的数组指针
    C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间
  • 原文地址:https://www.cnblogs.com/ewblgo/p/2976938.html
Copyright © 2011-2022 走看看