Quick Start for Yii2

本文介绍了Yii2框架的多项实用技巧,包括多语言支持、数据分页、自定义用户认证、日期格式化、登录事件处理、表单验证、URL美化等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自有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进行权限分配。

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

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'],
        ]
    ]); ?>

并且也自定义了字段显示的列名。
效果图
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方法。
代码如下

<?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.实战场景记录—显示所有目录以及其文章数量

数据关联场景
显示效果如图:
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},
    ]);

大功告成~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值