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),

);



                }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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