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学习之变量的使用
May 29 PHP
session在PHP大型web应用中的使用
Jun 25 PHP
php递归获取目录内文件(包含子目录)封装类分享
Dec 25 PHP
ThinkPHP中自定义目录结构的设置方法
Aug 15 PHP
浅析php创建者模式
Nov 25 PHP
PHP CURL 内存泄露问题解决方法
Feb 12 PHP
Yii2 rbac权限控制之菜单menu实例教程
Apr 28 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
Jun 13 PHP
完美解决在ThinkPHP控制器中命名空间的问题
May 05 PHP
PHP实现下载远程图片保存到本地的方法
Jun 19 PHP
PHP大文件切割上传功能实例分析
Jul 01 PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 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
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
浅析vue中的nextTick
2020/12/28 Vue.js
python直接获取API传递回来的参数方法
2018/12/17 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
Python bisect模块原理及常见实例
2020/06/17 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
学年自我鉴定范文
2013/10/01 职场文书
财务部副经理岗位职责
2014/03/14 职场文书
租房协议书怎么写
2014/04/10 职场文书
职业生涯规划书前言
2014/04/15 职场文书
完美的中文自荐信
2014/05/24 职场文书
文明生主要事迹
2014/05/25 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
财务工作失职检讨书
2014/11/21 职场文书
个人廉洁自律总结
2015/03/06 职场文书
Java使用HttpClient实现文件下载
2022/08/14 Java/Android