欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-21 21:14:10
本文实例讲述了yii2框架中activedataprovider与gridview的配合使用操作。分享给大家供大家参考,具体如下:yii2中activedataprovider可以使用yii\db\q...

本文实例讲述了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的配合使用操作示例