Yii2搭建CMS栏目管理模块需采用邻接表设计cms_category表,实现树形结构、RBAC权限控制、Gii生成CRUD、GridView递归渲染及AJAX排序,确保增删改查完整且安全。

Yii 搭建 CMS 系统的栏目管理模块,核心在于结构清晰、权限可控、增删改查完整,并能自然对接内容模型。不需重造轮子,而是利用 Yii2 的 ActiveRecord、Gii 代码生成、RBAC 权限控制和 GridView 展示能力快速落地。
栏目数据模型设计
栏目本质是树形结构(支持多级分类),建议使用「邻接表」而非嵌套集,兼顾简洁与维护性。
- 表名建议:cms_category,字段至少包含:
id、name、slug(URL别名)、parent_id(0 表示一级栏目)、sort_order、status(1启用/0禁用)、created_at/updated_at - 在 models/CmsCategory.php 中继承
ActiveRecord,添加规则验证:slug唯一且仅含字母数字和短横线;parent_id必须存在或为 0;status限定为 0 或 1 - 加一个便捷方法获取子栏目:
public function getChildren() { return $this->hasMany(self::class, ['parent_id' => 'id']); }
后台控制器与 CRUD 实现
使用 Gii 自动生成基础 CRUD,再针对性增强逻辑,比手写更稳更快。
- 运行
./yii gii/crud --controllerClass=backend\controllers\CategoryController --modelClass=app\models\CmsCategory - 修改 CategoryController 的
actionIndex():用ActiveDataProvider查询时排除parent_id = 0的根节点(如需展示全部,可加搜索条件) - 重写
actionCreate()和actionUpdate(),确保slug自动生成(若为空):$model->slug = \yii\helpers\Inflector::slug($model->name); - 删除前校验:覆盖
actionDelete(),先检查是否存在子栏目或关联文章,有则禁止删除并提示
树形栏目列表与前端交互
GridView 默认不支持树形展示,需轻量改造,避免引入重型插件。
- 在视图 views/category/index.php 中,用递归方式渲染层级(可封装为小部件或视图片段),例如:
echo $this->render('_tree', ['nodes' => $dataProvider->getModels(), 'level' => 0]); - 每个栏目行右侧增加「添加子栏目」按钮,链接指向
?r=category/create&parent_id=123,并在模型中预填parent_id - 排序操作不依赖拖拽:在 GridView 列中加入「上移」「下移」按钮,通过 AJAX 调用
actionSortUp/actionSortDown交换相邻记录的sort_order
路由与权限控制集成
栏目管理属于后台敏感操作,必须绑定 RBAC 并配置独立路由规则。
- 在 backend/config/main.php 的
urlManager中添加美化规则:'category' => 'category/index'、'category/create' => 'category/create'等 - 用
./yii rbac/init初始化权限组件后,创建权限项:category/index、category/create、category/update、category/delete - 在 CategoryController 开头加上:
public function behaviors() { return ArrayHelper::merge(parent::behaviors(), ['access' => [ 'rules' => [['actions' => ['index','create','update','delete'], 'allow' => true, 'roles' => ['@'], 'matchCallback' => function ($rule, $action) { return \Yii::$app->user->can('category/' . $action->id); }]]]]); }


















