在Yii2框架中使用netstedsets与ztree实现无限极分类管理教程

无限极分类

无限极分类的方式很多种,例如可以使用pid为父节点id的方式,只是这样的方式读取的时候使用递归,比较麻烦,且影响性能。

而现在我们要说的是netstedsets来解决无限极分类的问题。

先来看看netstedsets的原理:

这里写图片描述
如图所示:家用电器分类为1-6,大家电2-3,小家电4-5,电脑手机分类为7-12,台式机8-9,笔记本10-11。

我们在设计数据库的时候,就可以通过left_key,right_key来界定属于某个分类。同样我们可以使用deep来界定分类的等级。

在Yii2中,加载netstedsets包。

我们这里使用:https://packagist.org/packages/creocoder/yii2-nested-sets
通过composer将包加载到我们的项目中。

具体使用过程:

1.在使用前,我们需要准备工作。先创建一个新的类,我们可以放在models中。

创建一个GoodsCategoryQuery类,必须继承ActiveQuery类
这里写图片描述

然后:

我们需要在商品分类的类里面需要添加新的行为,并且需要重写一下find()方法。
这里写图片描述

2. 创建商品分类的根节点

让我们首先创建一个根节点,我们的商品分类表有更多的其他字段,我们可以通过如下代码实现创建:
这里写图片描述

这个时候我们需要添加子节点了,我们需要考虑前端怎么去展示我们的节点。我们可以选择使用前端插件zTree来实现分类的回显。

3. 加载zTree插件

我们可以通过网站下载zTree插件:http://www.treejs.cn/v3/main.php#_zTreeInfo
然后将zTree放在静态文件插件目录下,例如/statics/plugins/ztree
通过demo,我们可以知道zTree需要获取的前端json格式为:

var zNodes =[
        {id:1, pId:0, name:"[core] 基本功能 演示", open:true},
        {id:101, pId:1, name:"最简单的树 --  标准 JSON 数据", file:"core/standardData"},
        {id:102, pId:1, name:"最简单的树 --  简单 JSON 数据", file:"core/simpleData"},
        {id:103, pId:1, name:"不显示 连接线", file:"core/noline"},
        {id:104, pId:1, name:"不显示 节点 图标", file:"core/noicon"},
        {id:105, pId:1, name:"自定义图标 --  icon 属性", file:"core/custom_icon"},
        {id:106, pId:1, name:"自定义图标 --  iconSkin 属性", file:"core/custom_iconSkin"},
        ] 

那么,我们可以在商品的分类的model里添加一个获取该数据格式的方法:
这里写图片描述
然后根据demo在前端加载zTree插件。代码太多,可以参照demo文件,这里就不列举代码了。
demo位置:/statics/plugins/zTree/demo/cn/index.html

4.增加子节点

首先在渲染添加界面时,需要传zTree需要的数据。
渲染添加页面:
这里写图片描述

然后就可以创建子节点了:
这里写图片描述

我们就可以实现如下效果:

这里写图片描述

在 HTML 实现家用电器商品分类可以使用无序列表 `<ul>` 与有序列表 `<ol>` 标签,同时结合 CSS 样式实现。以下是一个简单的例子: ```html <ul class="category"> <li>冰箱 <ul> <li>单门冰箱</li> <li>双门冰箱</li> <li>三门冰箱</li> </ul> </li> <li>洗衣机 <ul> <li>滚筒洗衣机</li> <li>波轮洗衣机</li> </ul> </li> <li>电视 <ul> <li>液晶电视</li> <li>等离子电视</li> </ul> </li> </ul> ``` 使用 Yii2 框架的嵌套集合实现无限极商品分类可以先在数据库创建一个分类表,包含字段 `id`、`name`、`parent_id`,其 `parent_id` 表示父级分类的 ID。 然后在 Yii2 创建一个名为 `Category` 的模型类,对应分类表。在 `Category` 模型类使用 `yii\db\ActiveRecord` 类实现嵌套集合,示例如下: ```php use yii\db\ActiveRecord; use creocoder\nestedsets\NestedSetsBehavior; class Category extends ActiveRecord { public function behaviors() { return [ 'tree' => [ 'class' => NestedSetsBehavior::className(), 'treeAttribute' => 'tree', 'leftAttribute' => 'lft', 'rightAttribute' => 'rgt', 'depthAttribute' => 'depth', ], ]; } } ``` 然后在视图文件使用递归函数输出分类列表,示例如下: ```php <?php use yii\helpers\Html; function renderNode($node) { $result = '<li>' . Html::encode($node->name); if ($node->children) { $result .= '<ul>'; foreach ($node->children as $child) { $result .= renderNode($child); } $result .= '</ul>'; } $result .= '</li>'; return $result; } echo '<ul class="category">'; foreach ($categories as $category) { echo renderNode($category); } echo '</ul>'; ?> ``` 在控制器查询分类数据,将数据传递给视图文件,示例如下: ```php public function actionIndex() { $categories = Category::find()->roots()->all(); return $this->render('index', [ 'categories' => $categories, ]); } ``` 以上就是使用 Yii2 框架的嵌套集合实现无限极商品分类的示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值