thinkphp5实现无限级分类


Posted in PHP onFebruary 18, 2019

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');
}

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

PHP 相关文章推荐
ftp类(myftp.php)
Oct 09 PHP
回答PHPCHINA上的几个问题:URL映射
Feb 14 PHP
分页详解 从此分页无忧(PHP+mysql)
Nov 23 PHP
php 数组的指针操作实现代码
Feb 08 PHP
解析crontab php自动运行的方法
Jun 24 PHP
ThinkPHP之getField详解
Jun 20 PHP
PHP常用数组函数介绍
Jul 28 PHP
PHP中的session安全吗?
Jan 22 PHP
php实现爬取和分析知乎用户数据
Jan 26 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 PHP
php微信开发之谷歌测距
Jun 14 PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 09 PHP
php实现文章评论系统
Feb 18 #PHP
php无限级分类实现评论及回复功能
Feb 18 #PHP
PHP-FPM 的管理和配置详解
Feb 17 #PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 #PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 #PHP
PHP封装的mysqli数据库操作类示例
Feb 16 #PHP
PHP fprintf()函数用法讲解
Feb 16 #PHP
You might like
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
javascript中caller和callee详解
2015/08/10 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
美国专业消费电子及摄影器材网站:B&H Photo Video
2019/12/18 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
应届大学生的推荐信
2013/11/20 职场文书
班长自荐书范文
2014/02/11 职场文书
校本教研活动总结
2014/07/01 职场文书
Django展示可视化图表的多种方式
2021/04/08 Python
muduo TcpServer模块源码分析
2022/04/26 Redis