1. 开启gii模块


common/config/main-local.php加入下面代码

  1. return [
  2. 'modules' => [
  3. 'gii' => [
  4. 'class' => 'yii\gii\Module',
  5. 'allowedIPs' => ['::1','127.0.0.1'], //只允许本地访问gii
  6. 'generators'=> [
  7. /*重新定义gii model & crud的生成模板*/
  8. 'module'=> [
  9. 'class' => 'yii\gii\generators\module\Generator',
  10. 'templates'=> [
  11. 'backend'=>'@common/gii/generators/module/default'
  12. ]
  13. ],
  14. 'model'=> [
  15. 'class' => 'yii\gii\generators\model\Generator',
  16. 'baseClass'=> 'base\BaseActiveRecord',
  17. 'ns'=> 'common\models',
  18. 'templates'=> [
  19. 'common'=>'@common/gii/generators/model/default',
  20. 'backend'=>'@common/gii/generators/model/backend'
  21. ]
  22. ],
  23. 'crud'=> [
  24. 'class' => 'yii\gii\generators\crud\Generator',
  25. 'templates'=> [
  26. 'backend'=>'@common/gii/generators/crud/default'
  27. ],
  28. 'baseControllerClass' => 'BaseBackendController',
  29. 'messageCategory'=> 'backend'
  30. ]
  31. ]
  32. ]
  33. ]
  34. ];

2. 访问gii


URL:http://localhost/项目目录/backend/index.php/gii

或者http://localhost/项目目录/backend/index.php/?r=gii

3. 生成模块


以后台模块为示例:
Module Class 填写要生成module的路径
Module ID 填写模块名
Code Template 选择我们自定义好的Module生成模板

如果生成成功会显示如下:

4. 生成公共模型


生成一个公共模型,方便不同入口应用复用和继承。

生成成功会显示如下:

5. 生成后台私有模型


生成后台私有模型,并继承公共模型,在该类中实现后台私有的方法。

生成成功会显示如下:

6. 生成CRUD操作和视图


去掉用不到的视图文件

生成成功会显示如下:

7. URL访问默认控制器


crud组件common\gii\Crud来实现基础的action

Crud里的index方法已经做好了分页处理。
index视图:backend/modules/test/views/default/index.php
如非必要,不要直接书写原生的SQL

joinWidth方法来关联表,需要在Test类定义好表关联。(注意joinWith里的大小写)
关于关联表的具体用法请参考:
http://www.yiichina.com/doc/guide/2.0/db-active-record

backend/modules/test/models/Test.php

  1. public function getHabitusArticle()
  2. {
  3. /**
  4. * 第一个参数为要关联的字表模型类名称,
  5. *第二个参数指定 通过子表的 customer_id 去关联主表的 id 字段
  6. */
  7. return $this->hasMany(HabitusArticle::className(), ['hid' => 'hid']);
  8. }

backend/modules/test/controllers/DefaultController.php

  1. /**
  2. *
  3. * 查询
  4. */
  5. public function actionIndex()
  6. {
  7. $model = $this->findModel();
  8. $search_model = new TestSearch;
  9. $query = $model::find()->select(['*'])->joinWith('habitusArticle')->orderBy('`test`.`hid` asc');
  10. $query = $search_model->search($query);
  11. //$query;
  12. //如果要打印SQL
  13. //$query = $query->createCommand();
  14. //echo $query->sql;die;
  15. echo Yii::$app->crud->index($query, ['model'=> $model]);
  16. }

得到的SQL:

  1. SELECT * FROM `test` LEFT JOIN `habitus_article` ON `test`.`hid` = `habitus_article`.`hid` ORDER BY `hid`

8. 字段显示值的格式化


先要在modles里定义字段的别名。

backend/modules/test/models/Test.php

  1. /**
  2. * @inheritdoc
  3. */
  4. public function attributeLabels()
  5. {
  6. return [
  7. 'hid' => 'Hid',
  8. 'name' => '名称',//定义别名
  9. 'remark' => '描述',//定义别名
  10. 'percent' => 'Percent',//....
  11. 'hearttrait' => 'Hearttrait',
  12. 'common' => 'Common',
  13. 'nacs' => 'Nacs',
  14. 'attack' => 'Attack',
  15. 'listorder' => 'Listorder',
  16. 'datetime' => 'Datetime',
  17. 'status' => 'Status',
  18. 'created_by' => 'Created By',
  19. 'updated_by' => 'Updated By',
  20. ];
  21. }

对于字段值重写,只需定义好Model里的attributeFormats()方法来实现字段格式化输出。(非Yii2方法)
如下:
访问index方法时,datetime字段会被格式为"Y-m-d H:i:s"格式,
访问xls方法时,datetime字段会被格式为"Y年m月d日"格式,
匿名函数中的$value表示字段原始值,$data表示select所列出的所有字段值

backend/modules/test/models/Test.php


  1. /**
  2. * 字段格式化
  3. */
  4. public function attributeFormats()
  5. {
  6. return [
  7. 'datetime'=>[//字段名
  8. [
  9. 'action'=> ['index'],
  10. 'data'=> function($value, $data){
  11. return date("Y-m-d H:i:s", $value);
  12. }
  13. ],
  14. [
  15. 'action'=> ['xls'],
  16. 'data'=> function($value, $data){
  17. return date("Y年m月d日", $value);
  18. }
  19. ],
  20. ]
  21. ];
  22. }

9. 表单搜索设置


用好yii\db\Query查询构建器包括关联表查询,尽量不要直接写sql语句。
控制器和视图中所用的字典类,获取数据的方法都应写到Model里。

backend/modules/test/models/TestSearch.php
配置好search方法,根据需求来确定字段搜索是like还是=或者其他。
可参考Yii2的yii\db\QueryandFilterWhere等方法和操作符格式
andFilterWhere可放心使用,搜索时字段非空才会执行。
http://www.yiichina.com/doc/guide/2.0/db-query-builder

backend/modules/test/models/TestSearch.php

  1. public function search($query, $params = [])
  2. {
  3. $params = $params ? : Yii::$app->request->getQueryParams();
  4. $this->attributes = $params;
  5. $start_time = ArrayHelper::getValue($params, 'start_time');//相当于isset($params['start_time']) ? $params['start_time'] : NULL;
  6. $end_time = ArrayHelper::getValue($params, 'end_time');
  7. $query->andFilterWhere([
  8. 'status' => $this->status,
  9. ]);
  10. $query->andFilterWhere(['like', 'name', $this->name])
  11. ->andFilterWhere(['like', 'remark', $this->remark])
  12. ->andFilterWhere(['between', 'datetime', $start_time ? strtotime($start_time.' 00:00') : NULL, $end_time ? strtotime($end_time.' 23:59') : NULL]);
  13. return $query;
  14. }

得出的sql是:

  1. SELECT * FROM `test` WHERE ((`status`=:qp0) AND (`name` LIKE :qp1)) AND (`datetime` BETWEEN :qp2 AND :qp3) ORDER BY `hid`
  1. 字段排序


backend/modules/test/models/Test.php
需要继承自 base\BaseActiveRecord
定义参与排序的字段:

  1. class Test extends \common\models\test\Test{
  2. //排序字段
  3. public $sortFields = ['percent', 'datetime'];

backend/modules/test/controllers/DefaultController.php

  1. $model = $this->findModel();
  2. $search_model = new TestSearch;
  3. $query = $model::find()->select(['*']);
  4. $query = $search_model->search($query);
  5. $sort = $search_model->sortOrderBy('`test`.`hid` asc');//默认的排序字段
  6. $query->orderBy($sort);

backend\modules\test\views\default_form.php

设置排序链接和样式

  1. <th width="120" class="<?=$model->sortQueryParams('percent', 'class');?>" onClick="window.location.href='<?=$model->sortQueryParams('percent', 'link');?>';">占百分比</th>

效果:

  1. 视图及表单,


视图里尽量避免编写复杂的逻辑。

由于默认生成的表单控件都是input,
接下来需要修改createupdate的视图文件(表单)。
按照业务需求设置好字段的表单控件和验证规则

backend\modules\test\views\default_form.php

表单元素为必填项的在lable上的class加上form-required,即:

  1. <label class="col-sm-2 control-label form-required"><?=$model->getAttributeLabel('name');?></label>

常用的表单控件类型有:
backend/modules/test/models/Test.php 里定义好了Status的字典

  1. /**
  2. * @status
  3. */
  4. public static function Status($key = false){
  5. $array = [
  6. '0'=> '有效',
  7. '2'=> '锁定'
  8. ];
  9. if ($key === false){
  10. return $array;
  11. }else{
  12. return isset($array[$key]) ? $array[$key] : '';
  13. }
  14. }

单行文本框:

  1. <?= Html::input('text', 'Test[name]', $model->name, ['class' => 'form-control']) ?>

或者

  1. <?= Html::activeInput('text', $model, 'name', ['class' => 'form-control']) ?>

多行文本框:

  1. <?= Html::textarea('Test[name]', $model->name, ['class' => 'form-control']) ?>
  2. <?= Html::activeTextarea($model, 'name', ['class' => 'form-control']) ?>

下拉列表:

  1. <?=Html::dropDownList('Test[status]', $model->status, $model::Status(), ['class' => 'form-control m-b']);?>
  2. <?=Html::activeDropDownList($model, 'status', $model::Status(), ['class' => 'form-control m-b']);?>

复选框

  1. <?= Html::checkboxList('Test[status]', $model->status, $model::Status());?>
  2. <?= Html::activeCheckboxList($model, 'status', $model::Status());?>

单选框

  1. <?= Html::radioList('Test[status2]', $model->status, $model::Status());?>
  2. <?= Html::activeRadioList($model, 'name', $model::Status()) ?>

单选列表

  1. <?= Html::listBox('Test[status3]', $model->status, $model::Status(), ['class'=>'form-control']);?>
  2. <?= Html::activeListBox($model, 'status', $model::Status(), ['class'=>'form-control']);?>

多选列表

  1. <?= Html::listBox('Test[status4]', $model->status, $model::Status(), ['multiple'=>true, 'class'=>'form-control']);?>
  2. <?= Html::activeListBox($model, 'status', $model::Status(), ['multiple'=>true, 'class'=>'form-control']);?>

切换开关

  1. <?= Html::checkbox('Test[status5]', $model->status, ['class'=> 'js-switch']);?> <?= Html::checkbox('HabitusTest[status6]', $model->status, ['class'=> 'js-switch']);?>
  2. <?= Html::activeCheckboxList($model, 'status', $model::Status(), ['class'=> 'js-switch']);?>

下拉选择带搜索

  1. <?=Html::dropDownList('Test[status9]', '120000', $model::City(), ['prompt'=>'--请选择--', 'data-placeholder'=>'选择省份...', 'class'=>'chosen-select', 'style'=>'width:350px;', 'tabindex'=>'2']);?>
  2. <?=Html::activeDropDownList($model, 'status', $model::City(), ['prompt'=>'--请选择--', 'data-placeholder'=>'选择省份...', 'class'=>'chosen-select', 'style'=>'width:350px;', 'tabindex'=>'2']);?>

下拉多选带搜索

  1. <?=Html::dropDownList('Test[status9]', ['120000','110000'], $model::City(), ['multiple'=>true, 'data-placeholder'=>'选择省份...', 'class'=>'chosen-select', 'style'=>'width:350px;', 'tabindex'=>'2']);?>
  2. <?=Html::activeDropDownList($model, 'status', $model::City(), ['multiple'=>true, 'data-placeholder'=>'选择省份...', 'class'=>'chosen-select', 'style'=>'width:350px;', 'tabindex'=>'2']);?>

表单验证规则 示例
更详细的验证方法参考:[jQuery.validate][10] 插件

  1. <script>
  2. $(function () {
  3. $("#view-form-form").validate({
  4. //debug:true, //如果只调试验证不提交数据,可开启这里
  5. rules: {
  6. 'Test[name]':{
  7. required:true,//必填
  8. maxlength: 50 //最大长度
  9. },
  10. //其他的字段的验证...
  11. },
  12. ignore:"",//验证包括hidden的input元素
  13. messages: {
  14. 'Test[name]':{
  15. required:'请输入体质名称',//未输入提示
  16. maxlength:'体质名称输入太长'//超出最大长度提示
  17. },
  18. }
  19. });
  20. });
  21. </script>
  1. 保存表单数据到数据库


瘦控制器 胖模型

$model->sava()前会根据Model类的rules()方法定义规则去校验数据

backend/modules/test/models/Test.php

  1. /**
  2. * @inheritdoc
  3. */
  4. public function rules()
  5. {
  6. return [
  7. [['name'], 'required'],//必填
  8. [['percent', 'listorder', 'datetime', 'status', 'created_by', 'updated_by'], 'integer'],//必需为数字
  9. [['name'], 'string', 'max' => 300],//最长300
  10. [['remark', 'hearttrait', 'common', 'nacs', 'attack'], 'string', 'max' => 500]//字符串,最长500
  11. ];
  12. }

guide: 详细的rules
数据验证不通过时可以根据打印$model->getErrors()查看具体错误信息

对于表单提交过来的数据不是最终保存到数据库里的格式时,如时间戳等,
可以通过自定义rules或者重组表单数据来实现:(还有其他方法也可以实现)

backend/modules/test/models/Test.php

  1. public function validateCountry($attribute, $params)
  2. {
  3. $this->$attribute = 'new '.$this->$attribute;//这里可以重新设置name的值
  4. //也可以使用自定义验证规则
  5. //if (!in_array($this->$attribute, ['USA', 'Web'])) {
  6. //$this->addError($attribute, 'The country must be either "USA" or "Web".');
  7. //}
  8. }
  9. /**
  10. * @inheritdoc
  11. */
  12. public function rules()
  13. {
  14. return [
  15. ['name', 'validateCountry'],
  16. [['name'], 'required'],
  17. [['percent', 'listorder', 'datetime', 'status', 'created_by', 'updated_by'], 'integer'],
  18. [['name'], 'string', 'max' => 300],
  19. [['remark', 'hearttrait', 'common', 'nacs', 'attack'], 'string', 'max' => 500]
  20. ];
  21. }

或者我们用behaviors来实现一些字段的数据的自动化填充

backend/modules/test/models/Test.php

  1. public function behaviors()
  2. {
  3. return [
  4. [
  5. 'class' => 'yii\behaviors\BlameableBehavior',
  6. 'createdByAttribute' => 'created_by',//create时,created_by字段的值会自动填充为当前操作用户的ID:Yii::$app->user->identity->id;
  7. 'updatedByAttribute' => 'updated_by',
  8. ],
  9. 'timestamp' => [
  10. 'class' => 'yii\behaviors\TimestampBehavior',
  11. 'attributes' => [
  12. //insert数据库前datetime的值会自动填充为当前的时间戳
  13. BaseActiveRecord::EVENT_BEFORE_INSERT => ['datetime'],
  14. //BaseActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
  15. ],
  16. ],
  17. ];
  18. }

注:本文由王智磊(王大宝儿)整理编写,也参考借鉴了很多大神的笔记,分享代码,分享成功,欢迎各位交流和转载,转载请注明出处(博客园:王大宝儿)http://www.cnblogs.com/wangzhilei/

Yii2用Gii自动生成Module+Model+CRUD的更多相关文章

  1. Yii2框架---GII自动生成

    本地环境配置完成后.访问路径直接加上/gii 例如 localhost/gii 即可生成YII活动记录类 即可生成模块

  2. Mybatis配置、逆向工程自动生成代码(CRUD案例)

    目的: mybatis简介 搭建mybatis环境 基于SSM逆向工程的使用 Mybatis增删改查案例 mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及 ...

  3. 使用generator自动生成mybatis model、mapper.xml、mapper等(转)

    原文链接:http://www.cnblogs.com/lichenwei/p/4145696.html Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件 ...

  4. codesmith 自动生成C# model 实体模板

    <%-- Name:自动生成 Author: 陈胜威 Description: 直接生成model类 --%> <%@ Template Language="C#" ...

  5. 根据现有的数据库自动生成Django model

    Django引入外部数据库还是比较方便的,首先在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自动生成models模型文件 python ma ...

  6. idea集成 MyBatis Generator 插件,自动生成dao,model,sql map文件

    1.集成到开发环境中 以maven管理的功能来举例,只需要将插件添加到pom.xml文件中即可.(注意此处是以plugin的方式,放在<plugins></plugins>中间 ...

  7. 如何避免在EF自动生成的model中的DataAnnotation被覆盖掉

    摘自ASP.NET MVC 5 网站开发之美 6.4 Metadata与数据验证 如果使用Database-First方式生成*.edms,那么所生成的类文件会在*.tt文件的层级之下,扩展名tt是一 ...

  8. yii gii自动生成的curd添加批量删除实例

    1.在视图中 CGridView中的columns添加,作用是添加多选框  代码如下 复制代码 array(        'selectableRows' => 2,        'foot ...

  9. yii2.0用gii自动补全代码做的简单增删改查,以及图片上传和展示

    首先已经用gii根据model层生成了控制器,模型,视图层. 表结构为如图所示:表名为zhoukao1,

随机推荐

  1. DB2 移动数据总结一

    数据移动参考的连接 IMPORT http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.cm ...

  2. python+unittest+requests实现接口自动化

    前言: Requests简介 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2  ...

  3. <数据挖掘导论>读书笔记1

    数据预处理: 1.聚集:将两个或者多个对象合并成单个对象. 2.抽样:一种选择数据对象子集进行分析的常用方法.抽象方法:简单随机抽样 和渐进抽样 3.维度约:我觉得翻译的不好,英文明细是降维.降维技术 ...

  4. javascript 中合并排序算法 详解

    javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: <script type="text/javascript& ...

  5. Java 实例 - 标签(Label)

     Java 实例 Java 中的标签是为循环设计的,是为了在多重循环中方便的使用break 和coutinue . 以下实例当在循环中使用 break 或 continue 循环时跳到指定的标签处: ...

  6. [转]OLAP的12条准则

    OLAP的12条准则 Multidimensional conceptual view OLAP模型必须提供多维概念视图 User-analysts would view an enterprise ...

  7. SQL 工具系列一

    1.误删除数据恢复篇 ApexSQL Recover   可以恢复Delete Truncate  drop,恢复 二进制大型对象 测试版本  每10行才会恢复 评估版本下载地址:只能用14天 所以基 ...

  8. MYSQL连接字符串参数解析(解释)

    被迫转到MySQL数据库,发现读取数据库时,tinyint类型的值都被转化为boolean了,这样大于1的值都丢失,变成true了.查阅资料MySQL中无Boolean类型,都是存储为tinyint了 ...

  9. mac隐藏和显示隐藏文件

    显示:defaults write com.apple.finder AppleShowAllFiles -bool true隐藏:defaults write com.apple.finder Ap ...

  10. [android] 天气app布局练习(二)

    主要练习一下GridView MainActivity.java package com.example.weatherreport; import java.util.ArrayList; impo ...