自有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或者Update
emmmmm。目前不知道如何修改字段名称。。
默认会向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进行权限分配。
- 添加想赋予权限的路由
- 创建权限 例如:createPost权限
- 创建系统所需角色并授予对应的权限
- 分配权限/修改代码,创建用户时根据环境修改权限。
10.ArrayDataProvider配合GridView的数据显示
有些时候数据来自第三方接口,并不是来自数据库。这就需要我们用到ArrayDataProvider配合view的widget 例如GridView、DetailView等来显示数据。
贴代码:
xxxController.php
<?php
public 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'],
]
]); ?>
并且也自定义了字段显示的列名。
效果图
附自定义按钮
'columns' =>[
['class' => 'yii\grid\SerialColumn'],
['label'=>'文件名', 'attribute' => '0'],
['label'=>'上传时间', 'attribute' => '1'],
[
'class' => 'yii\grid\ActionColumn',//下面开始自定义操作按钮
'template'=>'{view} {delete}'
],
]
图:
11.解决Yii2 Composer 不断检查前端资源导致速度慢问题
此文档说明怎样解决 composer 在 yii2 下安装慢。
注:从yii2-2.0.12开始,官方已经采用该方案,详情
国内镜像不可行说明
yii2 通过 fxp/composer-asset-plugin 插件来安前端开发所用到依赖包
最佳方案
使用方式
编辑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魔术方法 来实现这样的关联。极好用!~~*
13.实战场景记录—behaviors的使用
场景描述
在插入数据库数据的时候,设置字段 操作人员ID ,为当前登录用户ID。并且修改记录时 ,也记录当前操作人员的ID。
场景分析
在刚开始使用Yii时,没有掌握behaviors的使用,
只能通过
model−>authorID=Yii::
app->user->identity->id;
来设置操作员ID。
但是这样重复代码非常多。那么这个时候就可以用到behaviors了!
开始操作
在你需要的表的model里重写behaviors方法。
代码如下
<?php
namespace 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.实战场景记录—显示所有目录以及其文章数量
数据关联场景
显示效果如图:
如果模型里有关联(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},
]);
大功告成~