thinkphp5实现无限级分类

tp5对分类数据表的信息读取与展示,我们即可以控制器完成,也可以在对应的模型中完成。本案例,我们在模型中完全成。况且,对数据表的增,删改查操作,本来就是模型的本职工作。

首先声明一下,我们采用递归的方式来实现无限分类。但无限分类的实现,不是只是递归一种方式,还有一种是全路径方式,也可以实现,不过,这种方式通常用在全路径导航菜单中。所以,这里我们还是用最常见的递归函数来实现:无限分类。

首先我们先创建一个静态方法:getCate,为什么要静态方式,因为静态方法执行效率高,不需要实例化,而且,分类查询是使用非常频繁的操作,很多查询都要依赖分类查询的结果。

当前的getCate方法,有三个参数:

第一个是$pid,是父类的id,默认为0,表示从顶级开始查起。

第二个参数是返回的查询结果,我们放在一个数组中返回,注意,这个变量是引入方式传入的。

在递归函数中,返回结果有三种方式:

第一种就是大家比较熟悉的,使用全局变量$_GLOBALS[],这个方法有副作用,我们不用它;

第二种方式也不错,是在函数中用static关键字,声明一个静态变量,它可以将每一次的递归执行结果进行累计,最后再返回,非常好理解,但占用资源过多,执行效率低;

第三种,就是采用引用参数的方式,来返回结果,这也是目前主流的技术。尽管理解起来有难度,但执行效率是最高的,我们要玩,就玩大的,所以这里,我们就直接采用引用,来返回查询结果。

第三个参数,可以没有,它是用来设置一下分类之间的层次显示的,可以让结果看上去更直观清晰。

<?php

namespace app\admin\model;

use think\Collection;
use think\Model;

class Category extends Model
{
 //创建一个静态方法getCate,来获取分类信息

 /**
  * @param int $pid: 当前分类的父id
  * @param array $result:引用返回值
  * @param int $blank:设置分类之间的显示提示
  */
 public static function getCate($pid=0, &$result=[], $blank=0)
 {
  //1.分类表查询:$pid
  $res = self::all(['pid'=>$pid]);

  //2.自定义分类名称前面的提示信息
  $blank += 2;

  //3.遍历分类表
  foreach ($res as $key => $value) {

   //3-1自定义分类名称的显示格式
   $cate_name = '|--'.$value->cate_name;
   $value->cate_name = str_repeat(' ',$blank).$cate_name;

   //3-2将查询到的当前记录保存到结果$result中
   $result[] = $value;

   //3-3关键:将当前记录的id,做为下一级分类的父id,$pid,继续递归调用本方法
   self::getCate($value->id, $result, $blank);
  }

  //4.返回查询结果,调用结果集类make方法打包当前结果,转为二维数组返回
  return Collection::make($result)->toArray();
 }
}

控制器中调用代码:

public function edit(Request $request)
{
 //1.获取一下分类id
 $cate_id = $request -> param('id');

 //2.查询要更新的数据
 $cate_now = CategoryModel::get($cate_id);

 //3.递归查询所有的分类信息
 $cate_level = CategoryModel::getCate();

 //4.模板赋值
 $this -> view -> assign('cate_now', $cate_now);
 $this -> view -> assign('cate_level', $cate_level);

 //5.渲染模板
 return $this -> view -> fetch('category_edit');
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 解析thinkphp的左右值无限分类

    以前一直使用父子无限分类,这种分类结构清晰,使用也简单.但若分类数量很大的话,在查询上性能不佳.比如在做导航菜单中,我要根据某一分类查询出整个分类树的话(祖辈).性能消耗是非常大的,要么做递归,要么做多次查询.故,对于分类的数据量很大的情况,我推荐使用左右值,以减少查询上的麻烦. 复制代码 代码如下: _id    /**         +----------------------------------------------------------         * 构造函数     

  • thinkphp5使用无限极分类

    本文实例为大家分享了thinkphp5使用无限极分类的具体代码,供大家参考,具体内容如下 1. 先根据普通递归完成无限极分类 2. 再根据分号的类的level 添加字符,再次存入数组的_name字段,最后按照_name字段输出 /** * 获得树状数据 * @param $data 数据 * @param $title 数据库中字段名 * @param string $fieldPri 数据库中主键id * @param string $fieldPid 数据库中父id * @return ar

  • ThinkPHP无限级分类原理实现留言与回复功能实例

    本文所述留言板程序使用了无限级分类的原理,可以实现无限级留言与回复.留言列表gclist保留了留言层次空格,使留言--回复层次分明.分享给大家供大家参考.具体分析如下: 功能上,本程序可以实现无限级留言与回复,即对留言回复,对回复的留言回复.当然你也可以作有限制的控制,使其只对留言回复,关键是在模板代码中去掉回复的留言中的"回复该留言"即可.欢迎去拍砖! 程序效果如下图所示: 完整源码点击此处本站下载. 数据表: 复制代码 代码如下: -- ----------------------

  • 使用ThinkPHP的自动完成实现无限级分类实例详解

    一.实现效果 二.主要代码 1.模板 2.控制器 ·index模块 ·add模块 3.模型 三.代码 以便于各位看官复制测试 1.模板 <form action="__URL__/add" method="post"> 栏目<select name="fid" size=20> <option value="0">栏目</option> <volist name='list

  • thinkphp实现无限分类(使用递归)

    本文实例为大家分享了thinkphp实现无限分类的详细代码,希望对大家学习无限分类有所启发. 数据库:test 数据表:(tp_category): Common/conf/config.php 'DB_CONFIG2' => array( 'db_type' => 'mysql', 'db_user' => 'root', 'db_pwd' => '', 'db_host' => 'localhost', 'db_port' => '3306', 'db_name'

  • TP5.0框架实现无限极回复功能的方法分析

    本文实例讲述了TP5.0框架实现无限极回复功能的方法.分享给大家供大家参考,具体如下: 最近做项目的时候用到了评论回复,使用ThinkPHP5.0框架做回复碰到了一些问题,简单总结一下.(李昌辉) 1.首先是数据表的设计: create table zy_huifu ( code int auto_increment primary key, #回复代号 puser varchar(50), #回复人员 listcode int, #文章代号 time varchar(50), #回复时间 co

  • thinkPHP框架实现的无限回复评论功能示例

    本文实例讲述了thinkPHP框架实现的无限回复评论功能.分享给大家供大家参考,具体如下: 如果只是简单的单回复的评论的话,那样操作是很简单的.但问题就是如何实现无限的回复评论呢!那么如果只是单回复的话,需要建好多的数据表,是根本不可能实现的.那么用TP框架实现无限回复评论(GitHub源代码下载地址:https://github.com/Jonybin/responsemessage)下载完成后,注意数据库的使用. control控制器部分: function CommentList($pid

  • ThinkPHP自动填充实现无限级分类的方法

    本文实例展示了ThinkPHP自动填充实现无限级分类的方法,是ThinkPHP常用功能之一,非常具有实用价值.现将完整实例分享给大家,供大家参考.具体实现步骤如下: 表aoli_cate如下图所示: 一.action部分: aoli/Home/Lib/Action/CataAction.class.php文件如下: <?php class CateAction extends Action{ function index(){ $cate=M('cate'); $list=$cate->fie

  • thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法

    本文实例讲述了thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法.分享给大家供大家参考,具体如下: 这里使用thinkphp递归循环栏目按照树形结构无限极输出,并保存为一个数组,利于模板调用 具体代码如下: private function categoryTree($parentid,$level) //因为是本类中使用所以定于为私有函数 { $Category= D('Category'); $result = $Category->where("`parentid`=&q

  • Thinkphp无限级分类代码

    本篇就一点一点教大家写一个无限级分类出来,其实掌握一个知识,最主要的是要掌握无限级分类的逻辑,那么写起来就很容易的多了. 首先看数据库表:xp_cate 控制器:CateAction.class.php <?php class CateAction extends Action{ function index(){ $cate=M('Cate'); $list=$cate->field("id,name,pid,path,concat(path,'-',id) as bpath&qu

  • PHP实现的无限分类类库定义与用法示例【基于thinkPHP】

    本文实例讲述了PHP实现的无限分类类库定义与用法.分享给大家供大家参考,具体如下: /* 功能:基于TP2.0的无限分类. 用法: 第一种用法,不采用数据库,可以不需要TP,例子如下 <?php require('Category.class.php');//导入Category.class.php类 //测试数据 $data[]=array('cat_id'=>1,'pid'=>0,'name'=>'中国'); $data[]=array('cat_id'=>2,'pid'

随机推荐