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 相关文章推荐
如何隐藏你的.php文件
Jan 04 PHP
php mssql 时间格式问题
Jan 13 PHP
php下图片文字混合水印与缩略图实现代码
Dec 11 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
destoon实现公司新闻详细页添加评论功能的方法
Jul 15 PHP
PHP会话处理的10个函数
Aug 11 PHP
php文件上传你必须知道的几点
Oct 20 PHP
PHP中empty,isset,is_null用法和区别
Feb 19 PHP
PHP中实现中文字串截取无乱码的解决方法
May 29 PHP
PHP fopen函数用法实例讲解
Feb 15 PHP
因str_replace导致的注入问题总结
Aug 08 PHP
php实现推荐功能的简单实例
Sep 29 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高手?学会“懒惰”的编程
2006/12/05 PHP
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
php中如何同时使用session和cookie来保存用户登录信息
2013/07/05 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
php框架知识点的整理和补充
2021/03/01 PHP
仿微博字符限制效果实现代码
2012/04/20 Javascript
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
详解vue渲染函数render的使用
2017/12/12 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
详解vue中组件参数
2018/07/09 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
轻松掌握python设计模式之策略模式
2016/11/18 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
python统计字符的个数代码实例
2020/02/07 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
处理textarea中的换行和空格
2019/12/12 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
介绍一下Linux中的链接
2016/06/05 面试题
EJB的激活机制
2013/10/25 面试题
综合实践教学反思
2014/01/31 职场文书
人力资源总监工作说明
2014/03/03 职场文书
三方股份合作协议书
2014/10/13 职场文书
运动会班级前导词
2015/07/20 职场文书