YII2框架中ActiveDataProvider与GridView的配合使用操作示例


Posted in PHP onMarch 18, 2020

本文实例讲述了YII2框架中ActiveDataProvider与GridView的配合使用操作。分享给大家供大家参考,具体如下:

YII2中ActiveDataProvider可以使用yii\db\Query或yii\db\ActiveQuery的对象,方便我们构造复杂的查询筛选语句。

配合强大的GridView,快速的显示我们想要的数据。

通过上面的两个工具,我们快速的显示用户表信息。用户表结构如下:

YII2框架中ActiveDataProvider与GridView的配合使用操作示例

我们创建一个用户模型MyUser.php,代码如下:

<?php

namespace app\models;

use yii\db\ActiveRecord;
use yii\data\ActiveDataProvider;

class MyUser extends ActiveRecord
{

  //返回要操作的表名
  public static function tableName()
  {
    return '{{%user}}';
  }

  //设置规则
  //注意,如果没有给字段设置规则,GridView的筛选项是不会出现的
  public function rules()
  {
    return [
      [['id', 'name', 'sex', 'age'], 'trim'],
      [['id', 'sex', 'age'], 'integer'],
      ['name', 'string'],
    ];
  }

  //查询
  public function search($params)
  {
    //首先我们先获取一个ActiveQuery
    $query = self::find();
    //然后创建一个ActiveDataProvider对象
    $provider = new ActiveDataProvider([
      //为ActiveDataProvider对象提供一个查询对象
      'query' => $query,
      //设置分页参数
      'pagination' => [
        //分页大小
        'pageSize' => 3,
        //设置地址栏当前页数参数名
        'pageParam' => 'p',
        //设置地址栏分页大小参数名
        'pageSizeParam' => 'pageSize',
      ],
      //设置排序
      'sort' => [
        //默认排序方式
        'defaultOrder' => [
          'id' => SORT_DESC,
        ],
        //参与排序的字段
        'attributes' => [
          'id', 'name', 'sex', 'age'
        ],
      ],
    ]);

    //如果验证没通过,直接返回
    if (!($this->load($params) && $this->validate())) {
      return $provider;
    }

    //增加过滤条件
    $query->andFilterWhere(['id' => $this->id])
      ->andFilterWhere(['like', 'name', $this->name])
      ->andFilterWhere(['sex' => $this->sex])
      ->andFilterWhere(['age' => $this->age]);

    return $provider;
  }
}

然后,创建控制器TestController.php,代码如下:

<?php

namespace app\controllers;

use YII;
use yii\web\Controller;
use app\models\MyUser;

class TestController extends Controller
{
  public function actionTest()
  {

    $user = new MyUser();
    //调用模型search方法,把get参数传进去
    $provider = $user->search(YII::$app->request->get());

    return $this->render('test', [
      'model' => $user,
      'provider' => $provider,
    ]);
  }
}

视图页面test.php,代码如下:

<?php
use yii\helpers\Url;
use yii\helpers\Html;
use yii\grid\GridView;
?>

<div id="page-wrapper">
  <div class="row">
    <div class="col-lg-12">
      <button class="btn btn-primary" id="showSelBtn">显示我选中的</button>
    </div>
  </div>
  <div class="row">
    <div class="col-lg-12">
      <?php echo GridView::widget([
        //设置GridView的ID
        'id' => 'myUserGridView',
        //设置数据提供器
        'dataProvider' => $provider,
        //设置筛选模型
        'filterModel' => $model,
        'columns' => [
          //复选框列
          ['class' => 'yii\grid\CheckboxColumn'],
          //显示序号列
          ['class' => 'yii\grid\SerialColumn'],
          [
            //设置字段显示标题
            'label' => 'ID',
            //字段名
            'attribute' => 'id',
            //格式化
            'format' => 'raw',
            //设置单元格样式
            'headerOptions' => [
              'style' => 'width:120px;',
            ],
          ],
          [
            'label' => '姓名',
            'attribute' => 'name',
            'format' => 'raw',
          ],
          [
            'label' => '头像',
            'attribute' => 'head_img',
            'format' => 'raw',
            //通过该返回值,我们可以任意控制列数据的显示
            //$data指向的是当前行的数据结果集
            'value' => function ($data) {
              return '<img src="' . '/' . ltrim($data->head_img, '/') . '" width="60px">';
            },
          ],
          [
            'label' => '性别',
            //设置筛选选项
            'filter' => [0 => '男', 1 => '女'],
            'attribute' => 'sex',
            'format' => 'raw',
            'value' => function ($data) {
              return ($data->sex == 0) ? '男' : '女';
            }
          ],
          [
            'label' => '年龄',
            'attribute' => 'age',
            'format' => 'raw',
          ],
          [
            'header' => '操作',
            'class' => 'yii\grid\ActionColumn',
            //设置显示模板
            'template' => '{upd} {del}',
            //下面的按钮设置,与上面的模板设置相关联
            'buttons' => [
              'upd' => function ($url, $model, $key) {
                return '<a href="' . Url::toRoute(['test/upd', 'id' => $key]) . '" rel="external nofollow" class="btn btn-warning">修改</a>';
              },
              'del' => function ($url, $model, $key) {
                return '<a href="' . Url::toRoute(['test/del', 'id' => $key]) . '" rel="external nofollow" class="btn btn-danger">删除</a>';
              },
            ],
          ],
        ],
      ]); ?>
    </div>
  </div>
</div>

<?php echo Html::jsFile('@web/js/jquery-3.3.1.min.js'); ?>
<script type="text/javascript">
  $("#showSelBtn").on("click", function () {
    var keys = $("#myUserGridView").yiiGridView('getSelectedRows');
    alert(keys);
  });
</script>

显示结果如下:

YII2框架中ActiveDataProvider与GridView的配合使用操作示例

YII2框架中ActiveDataProvider与GridView的配合使用操作示例

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
用cookies来跟踪识别用户
Oct 09 PHP
一步一步学习PHP(1) php开发环境配置
Feb 15 PHP
PHP面向对象概念
Nov 06 PHP
PHP 第二节 数据类型之字符串类型
Apr 28 PHP
PHP中的类型约束介绍
May 11 PHP
php中关于socket的系列函数总结
May 18 PHP
PHP7.0版本备注
Jul 23 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
Oct 09 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
Dec 25 PHP
实现PHP框架系列文章(6)mysql数据库方法
Mar 04 PHP
php版阿里云OSS图片上传类详解
Dec 01 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
Oct 11 PHP
YII2框架使用控制台命令的方法分析
Mar 18 #PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 #PHP
YII2框架中日志的配置与使用方法实例分析
Mar 18 #PHP
YII2框架中查询生成器Query()的使用方法示例
Mar 18 #PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 #PHP
Laravel框架下的Contracts契约详解
Mar 17 #PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 #PHP
You might like
详解PHP显示MySQL数据的三种方法
2008/06/05 PHP
php生成圆角图片的方法
2015/04/07 PHP
详解PHP用substr函数截取字符串中的某部分
2016/12/03 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
css配合jquery美化 select
2013/11/29 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
详解JavaScript函数callee、call、apply的区别
2019/03/08 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python字典简介以及用法详解
2016/11/15 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
python实现websocket的客户端压力测试
2019/06/25 Python
python3实现mysql导出excel的方法
2019/07/31 Python
一行python实现树形结构的方法
2019/08/09 Python
最小二乘法及其python实现详解
2020/02/24 Python
css3中transition属性详解
2014/09/02 HTML / CSS
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
幼儿园门卫安全责任书
2015/05/08 职场文书
经营场所使用证明
2015/06/19 职场文书
学风建设主题班会
2015/08/17 职场文书
《给予树》教学反思
2016/03/03 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python