文章分类 CRUD

分类

在我们开发博客文章功能之前,需要准备好博客文章分类,因为每一篇文章都必须发布在某一个分类下,文章依赖于分类。 我们将会为 hyblog 项目准备以下分类:

  • 新闻资讯:发布新闻类文章
  • 个人博文:发布个人的博客文章

生成数据模型与CRUD

我们需要创建 分类数据模型(Model)来跟数据库进行交互,我们约定所有的数据模型都要放到 common/models 因为数据模型无论系统前台(frontend)和后台(backend)都会用到。

我们先定义我们的分类数据表字段如下:

CREATE TABLE `category` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '分类名称',
  `desc` varchar(255) DEFAULT NULL COMMENT '分类描述',
  `is_valid` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用 1-启动 2-关闭',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分类管理表';

根据上面的sql在数据库生成对应的分类表

使用gii生成数据模型

提示:Gii 使用教程,如果此处出现报错:You are not allowed to access this page. 请尝试在gii配置中加入 allowedIPs' => ['你项目的IP']

打开 http://admin.hyblog.com/gii 进入 gii 操作界面,选择 Model Generator 输入你要生成模型的数据表信息。

点击 preview 预览要生成的模型,确认生成的位置和模型都没有问题后点击 generate 生成模型,完成后即可在项目对应的位置中查看是否生成模型文件。

使用 gii 生成 crud

首先我们修改一下 gii crud 的模版,打开配置文件 backend/config/main-local.php 添加如下配置

if (!YII_ENV_TEST) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
        'allowedIPs' => ['127.0.0.1', '::1'],  //如果是本地环境此处配置可略去
        'generators' => [
            'crud' => [    //生成器名称
                'class' => 'yii\gii\generators\crud\Generator',
                'templates' => [   //设置我们自己的模板
                    //模板名 => 模板路径
                    'myCrud' => '@backend/giitpl/crud/default',
                ]
            ]
        ],
    ];
}

此处的配置的目的是将原有的 crud 模版更换为自定义模版 myCrud,hyblog 中默认提供的模版

依旧在 gii 页面选择 CRUD Generator 输入相应的配置信息,并且在 code template 选择自定义模版myCrud

点击生成 crud 代码

代码生成之后,主要的分类增删改查的功能已经具备了,yii2 提供的 gii 代码生成器确实非常使用,加上修改默认模版,可以快速构建所需的模型,crud操作等功能

配置权限及菜单

hyblog里面整合了权限管理及菜单管理等基础功能,非常方便初学者学习,不会在学习中因为复杂的功能难以理解而无法继续。接下来我们就开始分配权限及创建菜单,让我们生成的分类管理功能界面化。

权限配置

先把我们刚才生成的代码加入到右边的权限池里面,只有加入权限池里面的权限我们才会做权限控制,所以每次新增功能如果你想对其做权限控制都要先加入到权限池。

配置菜单

菜单配置可以查看视频教程

因为我们用的是 admin 超级账户,拥有所有权限,所以不需要配置权限和角色,直接配置菜单即可

我们配置菜单: 站点》内容管理》分类管理

1.站点:只需要配置名称 站点,1级菜单不需要绑定路由

2.内容管理:配置名称 内容管理,父级选择站点,数据可以配置菜单前的图标,2级菜单不需要绑定路由

图标配置的图标是 Font Awesome 图标库,格式:{"icon":"fa fa-book"},其他图标可以工具 选择 Font Awesome 字体图表库 获取图标代码

3.分类管理:配置名称 分类管理,分级选择 内容管理,3级菜单需要绑定分类路由 category/index

配置完成之后,在顶部导航栏会出现 站点 菜单,点击之后左侧会出现 内容管理》分类管理 菜单,点击分类管理即可看到我们之前生成的分类管理的 CRUD:

分类管理

自动生成的代码虽然功能是可用的,还是需要做一些微调,比如把英文替换成中文,创建时间和更新时间改成系统自动写入等等。

如果想开发多语言版本可以查阅文档的国际化模块,此处为了教程简便就直接替换为中文

首先找到我们的分类模型: common/models/Category 修改 attributeLabels 替换成中文:

    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => '名称',
            'desc' => '描述',
            'is_valid' => '是否启用',
            'created_at' => '创建时间',
            'updated_at' => '更新时间',
        ];
    }

接下来在模型终添加自动更新 创建时间更新时间 行为方法,添加该行为之后,每次创建就会自动添加 created_atupdated_at 的值,每次更新分类会更新 updated_at 的值,非常实用的行为方法。

/**
 * 时间自动更新行为
 *
 * @return array
 */
public function behaviors()
{
    return [
        [
            'class' => TimestampBehavior::className(),
            'attributes' => [
                # 创建之前
                ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                # 修改之前
                ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at']
            ],
            #设置默认值
            'value' => date('Y-m-d H:i:s')
        ]
    ];
}

别忘了在头部引入相关类的命名空间,不然会报错哦

use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;

修改完成之后我们可以看到,之前的英文已经大部分替换成了中文,点击 Create Category 弹出的 modal 框也变成了中文,但是还是需要替换页面上的英文,以及对 modal表单提交页面 做处理。

打开页面所在的文件目录: backend/themes/hyii2/views/category 我们可以看到这里自动生成的页面,页面中文替换就不演示了,找到也看中相应的英文替换成中文即可,主要讲一下如何处理表单。 打开 _form.php 可以看到如下代码分布:

  • 去掉表单中的 created_atupdate_at 两行,之前说过时间会自动生成并写入数据库
  • 修改 desctextInput 改成 textarea,描述的内容输入较多,textarea 比较适合
  • 修改 is_validtextInput 改成 dropDownList 下拉框

链接: ActiveForm 教程

<?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'desc')->textarea(['row' => 3]) ?>

    <?= $form->field($model, 'is_valid')->dropDownList(['1' => '是', '2' => '否']) ?>

    <div class="form-group">
        <?= Html::Button($model->isNewRecord ? '创建' : '更新', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary','id'=>'j-btn']) ?>
    </div>

<?php ActiveForm::end(); ?>

替换列表中 is_valid 显示,将 index.phpGridView 下的 is_valid 替换成如下代码:

[
    'attribute' => 'is_valid',
    'label' => '是否启用',
    'value' => function($model) {
        return $model->is_valid == 1 ? '是' : '否';
    },
    'filter' => [
        1 => '是',
        2 => '否'
    ]    
],

替换成功之后查看效果:

使用分类功能添加两个分类:1.新闻资讯 2.个人博文;可以尝试 编辑删除 的功能是否有效!分类的 CRUD 功能便可以使用了。

上一篇 下一篇
yii2 入门教程 - 博客系统搭建
第1章. 基本信息
第2章. 开发环境部署