ThinkPHP无限分类的使用

本文实例展示了ThinkPHP自动填充实现无限级分类的方法,是ThinkPHP常用功能之一,非常具有实用价值。现将完整实例分享给大家,供大家参考。

ThinkPHP无限分类的使用

具体实现步骤如下(本文采用TP框架的3.1.3版本):

第一步:表aoli_cate

CREATE TABLE `fenlei` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',

  `name` varchar(255) DEFAULT NULL COMMENT '父id',

  `pid` int(255) NOT NULL COMMENT '名字',

  `path` varchar(20) DEFAULT NULL,//path字段是给数据排序用

  PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

insert into fenlei(id,name,pid,path) values

(1,’新闻’,0,’0’),

(2,’中国新闻’,1,’0-1’),//path 最后一个数据是排序用的

(3,’美国新闻’,1,’0-1’),

(4,’北京新闻’,2,’0-1-2’),

(5,’华盛顿新闻’,3,’0-1-3’),

(6,’日本新闻’,1,’0-1’);

  

第二步:action部分

aoli/Home/Lib/Action/CataAction.class.php文件如下:

<?php

class CateAction extends Action{

  function index(){

    //实例化cate

    $cate=M('cate');

    //获取数据

    //将path和id连接起来,组合成为bpath数组

    $list=$cate->field("id,name,pid,path,concat(path,'-',id) as bpath")->order('bpath')->select();

    foreach($list as $key=>$value){

       //在查询获取的数组里面增加一个'count'数组;

       //统计bpath字段的字符串个数,并赋值给'count'数组。

       $list[$key]['count']=count(explode('-',$value['bpath']));

    }

    //展示数据

    $this->assign('alist',$list);

    $this->display();  

  }

  //添加栏目

  function add(){

    //实例化CateModel类

    $cate=new CateModel();

    //如果从CateModel模型接受数据成功

    if($vo=$cate->create()){

      //执行添加

      if($cate->add()){

        $this->success('添加栏目成功');  

      }else{

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

      }

      //dump($vo);  

    }else{

      //返回错误信息

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

    }

  }

}

?>

  

第三步:模型部分

aoli/Home/Lib/Model/CataModel.class.php文件如下:

<?php

class CateModel extends Model{//对应数据库中的表aoli_cate

  //在Model类定义 $_auto 属性,可以完成数据自动处理功能,用来处理默认值、数据过滤以及其他系统写入字段。$_auto属性是由多个填充因子组成的数组。

  protected $_auto=array(

    //示例   

    //对name字段在新增的时候回调getName方法

    //array('name','getName',1,'callback'),

    //'path'填充字段

    //'tclm'回调函数

    // 3 新增数据和更新数据的时候都处理

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

    array('path','tclm',3,'callback'),  

  ); 

   //回调函数

  function tclm(){

    //如果pid存在,就转成整形,不存在就赋值0,表示是根目录

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

    //可以查看pid

    //echo ($pid);

    //如果是根目录,就是在select表单没有选任何值提交的时候

    if($pid==0){

      //

      $data=0;

    }else{

      //如果id和pid相等

      $list=$this->where("id=$pid")->find();

      //把回调值$data赋值

      $data=$list['path'].'-'.$list['id'];//子类的path为父类的path加上父类的id

    }

    //回调值

    return $data;  

  }

}

?>

  

第四步:view视图部分

<!--提交到本类的add方法-->

<form action="__URL__/add" method="post">

//size="20"可以将select 框变大

 请选择父级栏目:<select name="pid" size="20">

         //value="0"表示为根目录

         <option value="0">根栏目</option>

         //展示数据

         <volist name="alist" id="vo">

          <option value="{$vo['id']}">

            <php>

              <!--以字段count统计出来的,path字段里面含的字符串来做总数-->

              for($i=0;$i<$vo['count'];$i++){

                //在值前面添加空格

                echo  ';  

              }

            </php>

            //输出值

            {$vo['name']}

          </option>

         </volist>

        </select><br />

 新的栏目名称:<input type="text" name="name" /><br />

 <input type="submit" value="添加栏目" />

</form>

  

以上就是ThinkPHP无限分类的使用的详细内容

更多学习内容请访问:

腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)

原文地址:https://www.cnblogs.com/a609251438/p/12574289.html