如何用php实现添加无限分类?类似织梦后台那种可以无限添加分类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用php实现添加无限分类?类似织梦后台那种可以无限添加分类相关的知识,希望对你有一定的参考价值。

参考技术A 数据库设置3个字段 id name fid fid就是顶级id的意思

id name fid
1 分类1 0
2 分类2 0
3 分类1-1 1
4 分类1-2 1
5 分类2-1 2
6 分类2-2 2

数据库就是这种模式,fid为0的是最大分类。id为3 和 4的分类 是id 为 1 分类的子分类 ,所以fid都为 1 。5和6 是id 为 2的子分类。

你查找数据库的时候查找 fid=0的数据 ,找出顶级分类 1 和 2 ,再查找fid分别为 1 和 2的分类,就是对应的子类,你用foreach遍历出来就是了,

PHP.32-TP框架商城应用实例-后台10-商品分类-需求分析创建无限级商品分类,递归

商品管理需求分析

1、实现商品无限级分类管理【类似京东三级分类】

2、添加商品时要指定商品属于一个主分类和多个扩展分类【扩展分类可以是其他主分类】

3、商品列表中可以根据分类搜索商品

a)  搜索一个分类小的商品时,这个分类所有子分类下的商品也应该被搜索出来

b)  搜索时要考虑商品的主分类和扩展分类

 

无限级的商品分类

思路:递归打印树形结构;递归查找分类所有子分类【以便删除时使用】

1、建表

drop table if exists p39_category;
create table p39_category(
    id mediumint unsigned not null auto_increment comment \'Id\',
    cat_name varchar(30) not null comment \'分类名称\',
    parent_id mediumint unsigned not null default \'0\' comment \'上级分类id,0:顶级分类\',
    primary key(id)
)engine=InnoDB default charset=utf8 comment \'分类\';
category

2、创建模型CategoryModel.class.php,会用到两种递归函数

  注:模型类中要设置添加/修改时允许接收的的字段,和验证字段

            //添加调用create方法允许接收的字段
		protected $insertFields = array(\'cate_name\', \'parent_id\');
		  //修改调用create方法允许接收的字段
		protected $updateFields = array(\'id\', \'cate_name\', \'parent_id\');
		protected $_validate = array(
			array(\'cat_name\', \'require\', \'分类名称不能为空!\', 1, \'regex\', 3),
		);

  

  注:当找到一个分类的所有子分类时,要清空静态变量$_ret,防止再次调用该递归函数时,变量中有值【即限制其只调用一次】

<?php
    namespace Admin\\Model;
    use Think\\Model;
    
    class CategoryModel extends Model
    {    
        //添加调用create方法允许接收的字段
        protected $insertFields = array(\'cate_name\', \'parent_id\');
        //修改调用create方法允许接收的字段
        protected $updateFields = array(\'id\', \'cate_name\', \'parent_id\');
        protected $_validate = array(
            array(\'cat_name\', \'require\', \'分类名称不能为空!\', 1, \'regex\', 3),
        );
        
        //递归函数一:找一个分类所有子分类的ID【用于给出某id号,获取其子分类】
        public function getChildren($catId)
        {
            //取出所有的分类
            $data = $this->select();
            
            //递归从所有的分类中挑选出子分类的ID
            return $this->_getChildren($data, $catId, TRUE);
        }
        /*****递归从数据中找子分类*****/
        private function _getChildren($data, $catId, $isClear = FALSE)
        {
            static $_ret = array();        //保存找到的子分类的ID
            if($isClear)                //设标记清零,防止静态变量存储有数据
                $_ret = array();
            //循环所有分类找子分类
            foreach ($data as $k => $v)
            {
                if($v[\'parent_id\'] == $catId)
                {
                    $_ret[] = $v[\'id\'];
                    //再找这个$v的子分类
                    $this->_getChildren($data, $v[\'id\']);
                }
            }
            return $_ret;
        }
        
        //递归函数二:重新排序数据打印树形数据
        public function getTree()
        {
            $data = $this->select();
            var_dump($data);die();
            return $this->_getTree($data);
        }
        /*****递归从数据中找子分类*****/
        private function _getTree($data, $parent_id=0, $level=0)
        {
            static $_ret = array();                
            foreach ($data as $k => $v)
            {
                if($v[\'parent_id\'] == $parent_id)
                {
                    $v[\'level\'] = $level;        //用来标记这个分类是第几级
                    $_ret[] = $v;
                    //找子分类
                    $this->_getTree($data, $v[\'id\'], $level+1);
                }
            }
            return $_ret;
        }
        
    }
?>
CategoryModel.class.php

 3、创建控制器CategoryController.class.php

利用getTree函数创建分类列表

添加一个商品分类页面lst.html

暂时导入category表数据,做列表测试

INSERT INTO `p39_category` (`id`, `cat_name`, `parent_id`) VALUES
(1, \'家用电器\', 0),
(2, \'手机、数码、京东通信\', 0),
(3, \'电脑、办公\', 0),
(4, \'家居、家具、家装、厨具\', 0),
(5, \'男装、女装、内衣、珠宝\', 0),
(6, \'个护化妆\', 0),
(21, \'iphone\', 2),
(8, \'运动户外\', 0),
(9, \'汽车、汽车用品\', 0),
(10, \'母婴、玩具乐器\', 0),
(11, \'食品、酒类、生鲜、特产\', 0),
(12, \'营养保健\', 0),
(13, \'图书、音像、电子书\', 0),
(14, \'彩票、旅行、充值、票务\', 0),
(15, \'理财、众筹、白条、保险\', 0),
(16, \'大家电\', 1),
(17, \'生活电器\', 1),
(18, \'厨房电器\', 1),
(19, \'个护健康\', 1),
(20, \'五金家装\', 1),
(22, \'冰箱\', 16);
insert into category 

 

 

 

以上是关于如何用php实现添加无限分类?类似织梦后台那种可以无限添加分类的主要内容,如果未能解决你的问题,请参考以下文章

ecshop 文章标题怎么添加颜色和文章的时间呢?类似织梦那种,在添加文章时设置?除在数据库里面修改外。

如何用php创建一个无限遍历数组,并打印

手把手教你用php实现无限极分类功能

PHP中无限极分类函数的实现

dedecms织梦自定义函数递归拿所有分类(无限分类)

织梦后台在include文件夹下面添加了一个common.func.php文件后,后台变成乱码了