Quick Start for Yii2

来源:互联网 发布:python reshape函数 编辑:程序博客网 时间:2024/06/05 15:17

自有Yii2学习笔记。初稿(杂乱版)

1.yii2简易多国语言站点

在此路径加入你的翻译

advanced/vendor/yiisoft/yii2/messages/zh-CN/yii.php    'User Url'  => '个人网址',    'Email'     => '邮箱',

使用:

Yii::t('yii','Email')

2.yii2数据分页

在Gii生成的代码中找到$dataProvider,加入以下属性

'pagination' => ['pageSize' => 10, ],

Example

        $dataProvider = new ActiveDataProvider([            'query' => $query,            'pagination' => [                'pageSize' => 10,            ],        ]);

3.自定义用户身份验证类

修改配置文件

advanced/backend/config/main.php
'components' => [    'user' => [       'identityClass' => 'common\models\Users',       'enableAutoLogin' => true,       'identityCookie' => ['name' => '_identity-backend',       'httpOnly' => true],        ],],

4.修改日期显示格式

修改配置文件

advanced/backend/config/main.php
'components' => [        'formatter' => [            'class' => 'yii\i18n\Formatter',            'dateFormat' => 'php:Y/m/d',            'datetimeFormat' => 'php:Y年m月d日 H:i:s',            'timeFormat' => 'php:H:i:s',        ],],

使用DetailView widget显示数据

<?= DetailView::widget([        'model' => $model,        'attributes' => [            'created:datetime',            'activated:datetime',            'logged:datetime'        ],    ]) ?>

5.登录事件

yii2内含两个登录事件,登录前(beforeLogin),登录后(afterLogin)
on beforeLogin
on afterLogin
Example:登录后修改最后登录时间
修改配置文件

advanced/backend/config/main.php
'components' => [        'user' => [            'identityClass' => 'common\models\Users',            'enableAutoLogin' => true,            'identityCookie' => ['name' => '_identity-backend',            'httpOnly' => true],            'on afterLogin' => function($event){                $user = $event->identity;                $user->logged = time();                $user->save();            }        ],],

其中logged是你的字段名称

6.表单验证

1.$this->validate() 使用框架验证。【表单名必须和数据库字段名一致!】
2.自定义验证,并添加错误提示

<?php  if(Users::findByUsername($_POST['SignupForm']['username'])){        $this->addError('username','用户名已被注册!');  }

7.$model->Save / update字段绑定

这个bitch way 终于找到门道了。详见目录第十三条。

/*在Yii2中,使用Save或者Update保存数据会触发beforeSave或者Updateemmmmm。目前不知道如何修改字段名称。。默认会向created_at填入timestamp,如果数据存在则向updated_at填入timestamp。但是如果数据库没有这个字段会报错。因此。。暂时修改框架源码实现字段名称修改。PS:群里问了一下没人回复。暂时这么修改把。我觉得应该有好的修改方式修改这个文件。。。。。。。。。。。advanced/vendor/yiisoft/yii2/rbac/DbManager.php*/This is a bitch way,no try

8.URL美化以及Nginx设置

修改config/main.php

'components' => [        'urlManager' => [            'enablePrettyUrl' => true,            'showScriptName' => false,            'rules' => [            ],        ],]

nginx配置如下:
在虚拟域名配置里加入如下代码即可。

    if (!-e $request_filename){        rewrite ^/(.*) /index.php?r=$1 last;    }

9.yii2-admin安装配置

1.使用composer或者归档文件形式进行下载安装。
2.配置config/main文件

'modules' => [        "admin"=>[            'class' => 'mdm\admin\Module',            'layout' => 'left-menu'        ]],'aliases' =>[        "@mdm/admin" => "@vendor/mdmsoft/yii2-admin",],'components' => [        'authManager'=>[            'class' => 'yii\rbac\DbManager'        ],        'i18n' => [            'translations' => [                '*' => [                    'class' => 'yii\i18n\PhpMessageSource',                    'basePath' => '@frontend/messages', // if advanced application, set @frontend/messages                    'sourceLanguage' => 'en',                    'fileMap' => [                        //'main' => 'main.php',                    ],                ],            ],        ],],'as access' => [        'class' => 'mdm\admin\components\AccessControl',        'allowActions' => []],'language'  =>'zh-cn',

3.访问http://localhost/index.php?r=admin 或者 http://localhost/admin进行权限分配。

  1. 添加想赋予权限的路由
    这里写图片描述
  2. 创建权限 例如:createPost权限
  3. 创建系统所需角色并授予对应的权限
  4. 分配权限/修改代码,创建用户时根据环境修改权限。

10.ArrayDataProvider配合GridView的数据显示

有些时候数据来自第三方接口,并不是来自数据库。这就需要我们用到ArrayDataProvider配合view的widget 例如GridView、DetailView等来显示数据。
贴代码:
xxxController.php

<?phppublic function actionIndex($page = 1,$pageSize = 10){    //...一些获取数据的操作 最后保存到$list变量中    $list = Api::getData();    //必须是Array类型如果是Object需要通过(array)强转    $dataProvider = new ArrayDataProvider([         'allModels' => $list,         'pagination' => [         'pageSize' => $pageSize,               //分页大小         ],    ]);    return $this->render('index',['dataProvider' => $dataProvider]);}

在views的index.php 写如下内容:

    <?php echo GridView::widget([        'dataProvider' => $dataProvider,        'columns' =>[            ['label'=>'文件名',  'attribute' => '0'],            ['label'=>'上传时间',  'attribute' => '1'],            ['class' => 'yii\grid\ActionColumn'],        ]    ]); ?>

并且也自定义了字段显示的列名。
效果图
GridViews
附自定义按钮

        'columns' =>[            ['class' => 'yii\grid\SerialColumn'],            ['label'=>'文件名',  'attribute' => '0'],            ['label'=>'上传时间',  'attribute' => '1'],            [                    'class' => 'yii\grid\ActionColumn',//下面开始自定义操作按钮                    'template'=>'{view}&nbsp;&nbsp;{delete}'            ],        ]

图:
自定义按钮

11.解决Yii2 Composer 不断检查前端资源导致速度慢问题

文章转载自http://www.kriss.pub/2017/06/24/yii2-composer/
内容有删改

此文档说明怎样解决 composer 在 yii2 下安装慢。

注:从yii2-2.0.12开始,官方已经采用该方案,详情

国内镜像不可行说明


yii2 通过 fxp/composer-asset-plugin 插件来安前端开发所用到依赖包


最佳方案


使用 asset-packagist.org

使用方式

编辑composer.json

增加:

"repositories": {    "composer": {        "type": "composer",        "url": "https://asset-packagist.org"    }}

删除

"fxp-asset":{        "installer-paths": {            "npm-asset-library": "vendor/npm",            "bower-asset-library": "vendor/bower"            }

修改为taobao节点(非必须)

"extra": {    "npm-asset-repository": "https://registry.npm.taobao.org"},

修改项目配置文件(basic 的 config/web.php,advanced 的 common/config/main.php):
若没有则增加

'aliases' => [    '@bower' => '@vendor/bower-asset',    '@npm'   => '@vendor/npm-asset',],

12.实战场景记录—获取用户面试详情以及姓名等个人信息

场景分析
典型的数据关联场景。Yii2使用Gii生成的model,会自动根据 外键建立以下魔术函数。
例如:
面试评估表里生成了和 基本信息表关联
HlyAudition.php

 <?php    /**     * @return \yii\db\ActiveQuery     */    public function getHly()    {        return $this->hasOne(HlyBaseInfo::className(), ['id' => 'hly_id']);    }

那么在获得一个面试评估详情model后即可使用 $model->hly 来获得一个护理员的model
示例代码如下:

<?php                   $audition   =   $query::findOne($id);        return $this->render('view',[           'model'          => $audition->hly,           'dataProvider'   => $audition        ]);

这样会向view传送一个 面试评估详情的model 和其相关的 护理员基本信息model
这样view层即可这样使用:

$this->title = $model->name.' - 评估报告';// 张三 - 评估报告<?= DetailView::widget([        'model' => $dataProvider,        'attributes' => [            'id',            'hly_id',            [                'label'=>'姓名',                'value'=>$model->name,            ],            'create_date',            'update_date',         ]    ]);?>

这里有个用法 在使用detailView时(其它widget暂时未测试),
value可以使用和参数model中不同的model.达到一个widgets显示两个model的数据。
PS:如果没有外键,也可以通过自己手动创建get魔术方法 来实现这样的关联。极好用!~~*

其它使用参考
https://www.cnblogs.com/yiifans/p/3786374.html

13.实战场景记录—behaviors的使用

场景描述
在插入数据库数据的时候,设置字段 操作人员ID ,为当前登录用户ID。并且修改记录时 ,也记录当前操作人员的ID。
场景分析
在刚开始使用Yii时,没有掌握behaviors的使用,
只能通过model>authorID=Yii::app->user->identity->id;
来设置操作员ID。
但是这样重复代码非常多。那么这个时候就可以用到behaviors了!
开始操作
在你需要的表的model里重写behaviors方法。
代码如下

<?phpnamespace backend\models;use Yii;use yii\behaviors\AttributeBehavior;use yii\behaviors\BlameableBehavior;class HlyImages extends \yii\db\ActiveRecord{    public function behaviors()    {        return array_merge(parent::behaviors(), [            [                'class' => AttributeBehavior::className(),                'attributes' => [                    self::EVENT_BEFORE_INSERT => 'status',                ],                'value' => function ($event) {                    return '1';                },            ],            [                'class'              => BlameableBehavior::className(),                'createdByAttribute' => 'authorID',                'updatedByAttribute' => 'authorID ',            ],        ]);    }//...}

以上例子使用了两个behavior,更多使用见官方手册或yiichina某人教程

http://www.yiiframework.com/doc-2.0/guide-concept-behaviors.html
http://www.yiichina.com/tutorial/830

14.实战场景记录—显示所有目录以及其文章数量

数据关联场景
显示效果如图:
example
如果模型里有关联(getXXX方法) 可以直接在视图写如下代码:

<?= GridView::widget(['dataProvider' => $dataProvider,  'columns' => [       ['class' => 'yii\grid\SerialColumn'],       'category',       [           'label'=>'文章数量',           'value'=>function($model){              return count($model->Post);           }       ], ]  ]); ?>

15.实战场景记录—girdView checkboxColumn指定值

场景描述
在全选批量提交的时候,发现提交的key是当前model的ID,但是有的时候,我们需要的是其它数据,用来提交,然后做响应事情。
研究过程
首先使用’class’ => ‘yii\grid\CheckboxColumn’,
这个不必多说,第一眼想到这个需求的时候就是设置其value。
错误思路1.

 'columns' => [    'class' => 'yii\grid\CheckboxColumn',    'value'=>function($model){$model->class_id} ]

这个时候报错,原来CheckboxColumn并没有value属性。

然后翻看手册,看到了checkboxOptions属性。
错误思路2.

 'checkboxOptions' => function($model, $key, $index, $column) {     return ['value' => $model->class_id]; },

发现确实checkbox的value改变了。但是。。提交的时候的值并不是value..而是tr上面的data-key….
同样又尝试过…

     'rowOptions' => function($model, $key, $index, $column) {         return ['data-key'=>$model->class_id];     }

百度了一下。。
可以在dataProvider里面设置这个key。就可以啦~于是

    $dataProvider = new ActiveDataProvider([        'query' => $query,        'key' => function($model){$model->class_id},    ]);

大功告成~