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 相关文章推荐
PHP.MVC的模板标签系统(一)
Sep 05 PHP
PHP MemCached高级缓存配置图文教程
Aug 05 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
第二章 PHP入门基础之php代码写法
Dec 30 PHP
destoon公司主页模板风格的添加方法
Jun 20 PHP
PHP中文编码小技巧
Dec 25 PHP
php将数组转换成csv格式文件输出的方法
Mar 14 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
PHP获取当前相对于域名目录的方法
Jun 26 PHP
php微信公众平台开发(四)回复功能开发
Dec 06 PHP
基于laravel Request的所有方法详解
Sep 29 PHP
laravel 解决强制跳转 https的问题
Oct 22 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
给多个地址发邮件的类
2006/10/09 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
vue Render中slots的使用的实例代码
2017/07/19 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
2018/03/25 jQuery
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
python 全文检索引擎详解
2017/04/25 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
Python3最长回文子串算法示例
2019/03/04 Python
python实现加密的方式总结
2020/01/19 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
2020/03/14 Python
python中threading和queue库实现多线程编程
2021/02/06 Python
美国排名第一的葡萄酒俱乐部:Firstleaf Wine Club
2020/01/02 全球购物
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers