PHP.34-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 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM