TP电商项目:无限级商品分类

需求分析:

1.商品分类管理无限级分类

2.添加商品时,要指定商品属于主分类和多个扩展分类

3.商品列表根据分类搜索商品

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

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

递归一 打印树形结构

建表:

商品分类表

递归二 找一个分类所有的子分类

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 '分类 ';

2做模型

找子分类id递归

public function getChildren($catId){

        //取出所有的分类

    $data=$this->select();

    ////递归从所有的分类中挑出子分类的ID

    return  $this->_getChildren($data,$cateId,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']==$cateId){


                $_ret[]=$v['id'];

                ////再找这个$v的子分类

                $this->_getChildren($data, $v['id']);


            }

            return $_ret;


        } 

}

递归:重新排序打印树形数据

public function getTree(){

        $data=$this->select();

        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; 

    }

第二步 控制器中做lst方法

<?php

namespace Admin\Controller;

use Think\Controller;

class CategoryController extends Controller {



public function lst(){

    //商品列表页

    $model=D('category');

$data=$model->getTree();

$this->assign(array(


    'data'=>$data,

    '_page_title'=>'分类列表',

    '_page_btn_name'=>'添加新分类',

    '_page_btn_link'=>U('add'),

));

  $this->display();

}

}

?>

第3步   视图层中做lst页面

<layout name="layout" />

<!-- 列表 -->

<form method="post" action="" name="listForm" onsubmit="">

    <div class="list-div" id="listDiv">


        <table cellpadding="3" cellspacing="1">

            <tr>

                <th>分类名称</th>

                <th>操作</th>

            </tr>

            <?php foreach ($data as $k => $v): ?>

            <tr class="tron">

                <td><?php echo str_repeat('-', 8*$v['level']) . $v['cat_name']; ?></td>

                <td align="center">

                <a href="<?php echo U('edit?id='.$v['id']); ?>">修改</a>

                <a onclick="return confirm('确定要删除吗?');" href="<?php echo U('delete?id='.$v['id']); ?>">删除</a>

              </td>

            </tr>

            <?php endforeach; ?>

        </table>

    </div>

</form>

<!-- 引入行高亮显示 -->

<script type="text/javascript" src="__PUBLIC__/Admin/Js/tron.js"></script>

注:str_repeat  str_repeat() 函数把字符串重复指定的次数 重复8*$v['level']次

插入数据

insert into `p39_category`

(`cat_name`,`parent_id`)

values('男装,女孩,内衣,珠宝','0'),

('个护化妆 ',0) ,

('iphone ',0),

('运动户外 ',0),

('汽车,汽车用品 ',0),

('母婴,玩具乐器 ',0),

('食品,酒类,生鲜,特产',0),

('营养保健',0),

('图书,音像,电子书',0),

('彩票,旅行,充值,票务',0),

('理财,众筹,白条,保险',0),

('大家电',1),

('生活电器',1),

('厨房电器',1),

('个护健康',1),

('五金家族',1),

('冰箱',16)

;

如图所示:



第四步 检验代码

网址输入:http://localhost:8989/php/TpShop/Admin/Category/lst

如图所示:




第五步 做删除功能

波利亚在《怎样解题表》中提出你是否以前见过它?我们在做商品列表页见过,照抄代码即可

public function delete(){


    $model=D('category');

    if(FALSE!==$model->delete(I('get.id'))){

        $this->success('删除成功',U('lst'));

    }else{


        $this->error("删除失败".$model->getError());

    }

}

第2小步 在分类模型添加钩子函数

protected function _before_delete($option){

//先找出所有子分类的ID

$children=$this->getChildren($option['where']['id']);

if($children)

{


$children=implode(',',$children);

$model=\Think\Model();


/*

定义和用法

implode() 函数返回由数组元素组合成的字符串。

注释:implode() 函数接受两种参数顺序。但是由于历史原因,explode() 是不行的,您必须保证 separator 参数在 string 参数之前才行。

注释:implode() 函数的 separator 参数是可选的。但是为了向后兼容,推荐您使用使用两个参数。

注释:该函数是二进制安全的。

<?php

$arr = array('Hello','World!','I','love','Shanghai!');

echo implode(" ",$arr);

?>

输出结果:

Hello World! I love Shanghai!

*/

//删除这些子分类

$model->delete($children);



}


}

另一种思路

protected function _before_delete(&$option){

        //先找出所有子分类的ID

        $children=$this->getChildren($option['where']['id']);


          $children[]=$option['where']['id'];

            //删除这些子分类

    $option['where']['id']=array(


0=>'IN',

1=>implode(',',$children),

);



                }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容

  • 思考问题的框架: 波利亚在《怎样解题表》里面提出过这样解决问题的建议: 你以前见过它吗?你是否见过相同的问题而形式...
    周行知阅读 435评论 0 1
  • 醒来:4:00 体重:49.5公斤,昨天体重51.1公斤,辟谷前体重53公斤 觉察:昨晚睡得早,九点半就睡了,所以...
    阿宝阳光阅读 384评论 1 2
  • 这里做几点说明: OpenDataPlane就是开源数据面设计,主要用于网络通信设备数据面。(不了解这些术语的实在...
    半天妖阅读 1,091评论 0 2
  • 背影爱情 每一段陌生的关系 都期待一个温柔的结局 可再如何坚固 都有瞬间崩析的可能
    05e4613d007d阅读 250评论 0 0
  • 今天哈,又是tmd没做事的一天,本来打算复习英语,都到图书馆了,但是又被一泡屎憋回宿舍了,然后,就11点多了。开始...
    戈壁滩里的鱼阅读 138评论 0 0