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 相关文章推荐
让CodeIgniter的ellipsize()支持中文截断的方法
Jun 12 PHP
php防止sql注入简单分析
Mar 18 PHP
PHP将进程作为守护进程的方法
Mar 19 PHP
PHP图像处理类库及演示分享
May 17 PHP
PHP微信红包API接口
Dec 05 PHP
php文档工具PHP Documentor安装与使用方法
Jan 25 PHP
Json_encode防止汉字转义成unicode的方法
Feb 25 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 PHP
PHP无限极分类函数的实现方法详解
Apr 15 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 PHP
详解PHP 二维数组排序保持键名不变
Mar 06 PHP
laravel Validator ajax返回错误信息的方法
Sep 29 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/02 无线电
社区(php&amp;&amp;mysql)三
2006/10/09 PHP
PHP的FTP学习(四)
2006/10/09 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
php使用memcoder将视频转成mp4格式的方法
2015/03/12 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
Python的组合模式与责任链模式编程示例
2016/02/02 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
关于python字符串方法分类详解
2019/08/20 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
python实现串口通信的示例代码
2020/02/10 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
趣味运动会活动方案
2014/02/12 职场文书
《我要的是葫芦》教学反思
2014/02/23 职场文书
安全环保标语
2014/06/09 职场文书
2014年护士长工作总结
2014/11/11 职场文书
考察邀请函范文
2015/01/31 职场文书
材料员岗位职责范本
2015/04/11 职场文书
检讨书怎么写
2015/05/07 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
Vue全家桶入门基础教程
2021/05/14 Vue.js
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python