热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于THINKPHP3.0无限级分类

提供各种官方和用户发布的代码示例,代码参考,欢迎大家交流学习
无限极分类在做项目中经常会用到,无限极分类的实现方法也多种实现形式,下面我分享一个基于thinkphp3.0的无极限分类,同时也支持普通传值的无极限分类。说明该类很久以前我在互联网上找到是,原编写者信息没有,这里我只是在原有的基础上做了些修改和格式化。
分类表需包含3个基本字段:cid,fid,name 即:分类cid,父级fid,分类名称。
表结构:CREATE TABLE `think_category` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`fid` int(11) DEFAULT NULL,
`name` varchar(30) DEFAULT NULL
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
有两种使用方法:
第一种是基于THINKPHP3.0的使用:下载后将Category.class.php放到当前项目的ORG目录下(其他的目录也可只要能正常引用) import("@.ORG.Category");
$cat = new Category('Category', array('cid', 'fid', 'name', 'fullname'));
$s = $cat->getList(); //获取分类结构
$s = $cat->getList('', 1); //获取fid=1的子分类结构
$s = $cat->getList($condition, 1); //$condition为查询条件,获取fid=1的子分类结构
$s = $cat->getPath(3); //获取分类id=3的路径
$data = array("fid" => 0, "name" => "新分类名称");
$s = $cat->add($data); //添加分类,$data需要包含上级分类fid
$data = array("cid" => 2, "name" => "修改后分类名称");
$s = $cat->edit($data); //修改分类,$data需要包含分类ID
$s = $cat->del(10); //删除分类id=10的分类
第二种使用方法不需要使用TP的支持,但是数据结构需一样。

分类类文件Category.class.php内容:
/**
+------------------------------------------------------------------------------
* 分类管理
+------------------------------------------------------------------------------
*/
class Category {

private $model; //分类的数据表模型
private $rawList = array(); //原始的分类数据
private $formatList = array(); //格式化后的分类
private $error = ""; //错误信息
private $icon = array('  │', '  ├ ', '  └ '); //格式化的字符
private $fields = array(); //字段映射,分类id,上级分类fid,分类名称name,格式化后分类名称fullname

/**
+----------------------------------------------------------
* 构造函数,对象初始化
+----------------------------------------------------------
* @param array,object $model 数组或对象,基于TP3.0的数据表模型名称,若不采用TP,可传递空值。
* @param array $field 字段映射,分类cid,上级分类fid,分类名称,格式化后分类名称fullname
+----------------------------------------------------------
*/

public function __construct($model = '', $fields = array()) {
if (is_string($model) && (!empty($model))) {
if (!$this->model = D($model))
$this->error = $model . "模型不存在!";
}
if (is_object($model))
$this->model = &$model;

$this->fields['cid'] = $fields['0'] ? $fields['0'] : 'cid';
$this->fields['fid'] = $fields['1'] ? $fields['1'] : 'fid';
$this->fields['name'] = $fields['2'] ? $fields['2'] : 'name';
$this->fields['fullname'] = $fields['3'] ? $fields['3'] : 'fullname';
}

/**
+----------------------------------------------------------
* 获取分类信息数据
+----------------------------------------------------------
* @param array,string $condition 查询条件
* @param string $orderby 排序
+----------------------------------------------------------
*/
private function _findAllCat($condition, $orderby = NULL) {
$this->rawList = empty($orderby) ? $this->model->where($condition)->select() : $this->model->where($condition)->order($orderby)->select();
}

/**
+----------------------------------------------------------
* 返回给定上级分类$fid的所有同一级子分类
+----------------------------------------------------------
* @param int $fid 传入要查询的fid
+----------------------------------------------------------
* @return array 返回结构信息
+----------------------------------------------------------
*/
public function getChild($fid) {
$childs = array();
foreach ($this->rawList as $Category) {
if ($Category[$this->fields['fid']] == $fid)
$childs[] = $Category;
}
return $childs;
}

/**
+----------------------------------------------------------
* 递归格式化分类前的字符
+----------------------------------------------------------
* @param int $cid 分类cid
* @param string $space
+----------------------------------------------------------
*/
private function _searchList($cid = 0, $space = "") {
$childs = $this->getChild($cid);
//下级分类的数组
//如果没下级分类,结束递归
if (!($n = count($childs)))
return;
$m = 1;
//循环所有的下级分类
for ($i = 0; $i <$n; $i++) {
$pre = "";
$pad = "";
if ($n == $m) {
$pre = $this->icon[2];
} else {
$pre = $this->icon[1];
$pad = $space ? $this->icon[0] : "";
}
$childs[$i][$this->fields['fullname']] = ($space ? $space . $pre : "") . $childs[$i][$this->fields['name']];
$this->formatList[] = $childs[$i];
$this->_searchList($childs[$i][$this->fields['cid']], $space . $pad . " "); //递归下一级分类
$m++;
}
}

/**
+----------------------------------------------------------
* 不采用数据模型时,可以从外部传递数据,得到递归格式化分类
+----------------------------------------------------------
* @param array,string $condition 条件
* @param int $cid 起始分类
* @param string $orderby 排序
+----------------------------------------------------------
* @return array 返回结构信息
+----------------------------------------------------------
*/
public function getList($cOndition= NULL, $cid = 0, $orderby = NULL) {
unset($this->rawList, $this->formatList);
$this->_findAllCat($condition, $orderby, $orderby);
$this->_searchList($cid);
return $this->formatList;
}

/**
+----------------------------------------------------------
* 获取结构
+----------------------------------------------------------
* @param array $data 二维数组数据
* @param int $cid 起始分类
+----------------------------------------------------------
* @return array 递归格式化分类数组
+----------------------------------------------------------
*/
public function getTree($data, $cid = 0) {
unset($this->rawList, $this->formatList);
$this->rawList = $data;
$this->_searchList($cid);
return $this->formatList;
}

/**
+----------------------------------------------------------
* 获取错误信息
+----------------------------------------------------------
* @return string 错误信息字符串
+----------------------------------------------------------
*/
public function getError() {
return $this->error;
}

/**
+----------------------------------------------------------
* 检查分类参数$cid,是否为空
+----------------------------------------------------------
* @param int $cid 起始分类
+----------------------------------------------------------
* @return boolean 递归格式化分类数组
+----------------------------------------------------------
*/
private function _checkCatID($cid) {
if (intval($cid)) {
return true;
} else {
$this->error = "参数分类ID为空或者无效!";
return false;
}
}

/**
+----------------------------------------------------------
* 检查分类参数$cid,是否为空
+----------------------------------------------------------
* @param int $cid 分类cid
+----------------------------------------------------------
*/
private function _searchPath($cid) {
//检查参数
if (!$this->_checkCatID($cid))
return false;
$rs = $this->model->find($cid); //初始化对象,查找上级Id;
$this->formatList[] = $rs; //保存结果
$this->_searchPath($rs[$this->fields['fid']]);
}

/**
+----------------------------------------------------------
* 查询给定分类cid的路径
+----------------------------------------------------------
* @param int $cid 分类cid
+----------------------------------------------------------
* @return array 数组
+----------------------------------------------------------
*/
public function getPath($cid) {
unset($this->rawList, $this->formatList);
$this->_searchPath($cid); //查询分类路径
return array_reverse($this->formatList);
}

/**
+----------------------------------------------------------
* 添加分类
+----------------------------------------------------------
* @param array $data 一维数组,要添加的数据,$data需要包含上级分类ID。
+----------------------------------------------------------
* @return boolean 添加成功,返回相应的分类ID,添加失败,返回FALSE;
+----------------------------------------------------------
*/
public function add($data) {
if (empty($data))
return false;
return $this->model->data($data)->add();
}

/**
+----------------------------------------------------------
* 修改分类
+----------------------------------------------------------
* @param array $data 一维数组,$data需要包含要修改的分类cid。
+----------------------------------------------------------
* @return boolean 组修改成功,返回相应的分类ID,修改失败,返回FALSE;
+----------------------------------------------------------
*/
public function edit($data) {
if (empty($data))
return false;
return $this->model->data($data)->save();
}

/**
+----------------------------------------------------------
* 删除分类
+----------------------------------------------------------
* @param int $cid 分类cid
+----------------------------------------------------------
* @return boolean 删除成功,返回相应的分类ID,删除失败,返回FALSE
+----------------------------------------------------------
*/
public function del($cid) {
$cid = intval($cid);
if (empty($cid))
return false;
$conditon[$this->fields['cid']] = $cid;
return $this->model->where($conditon)->delete();
}

}
?>
这个编辑器太不给力了,编辑框又这么小,详细的使用方法和测试包去我的blog下载吧,http://blog.51edm.org/post/78

AD:真正免费,域名+虚机+企业邮箱=0元

推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 本文讨论了在PHP中将空格转换为问号的问题,并提供了解决方案。文章指出,空格不是标准的空格,而是特殊的0xC2 0xA0字符。作者尝试使用mb_convert_encoding函数将utf8字符串转换为gbk编码,但未成功。文章建议检查编辑器是否对空格进行了特殊处理,并提供了使用base64_encode函数打印结果的方法。最后,给出了完整的代码示例。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 如何更改电脑系统的自动校时服务器地址?
    本文介绍了如何通过注册表编辑器更改电脑系统的自动校时服务器地址。通过修改注册表中的数值数据或新建字符串数值的方式,可以将默认的时钟同步服务器地址更改为自己所需要的域名或IP地址。详细步骤包括双击时间区域,点击internet时间,勾选自动校正域名设置定时等操作。 ... [详细]
  • 使用chrome编辑器实现网页截图功能的方法
    本文介绍了在chrome浏览器中使用编辑器实现网页截图功能的方法。通过在地址栏中输入特定命令,打开控制台并调用命令面板,用户可以方便地进行网页截图操作。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文介绍了Python版Protobuf的安装和使用方法,包括版本选择、编译配置、示例代码等内容。通过学习本教程,您将了解如何在Python中使用Protobuf进行数据序列化和反序列化操作,以及相关的注意事项和技巧。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文详细介绍了Vim编辑器中的三种模式(命令模式、末行模式和编辑模式)以及它们之间的操作区别和切换方法。Vim编辑器凭借其多种命令快捷键和高效率的操作方式,得到了广大厂商和用户的认可。对于想要高效操作文本的用户来说,了解这些模式的使用方法是必不可少的。 ... [详细]
author-avatar
风nds
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有