YII2中ActiveDataProvider与GridView的配合使用

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

配合强大的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]) . '" class="btn btn-warning">修改</a>';
                            },
                            'del' => function ($url, $model, $key) {
                                return '<a href="' . Url::toRoute(['test/del', 'id' => $key]) . '" 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>

显示结果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 YiiYii2 GridView 控件,实现全选和批量操作非常简单。下面是一些技巧和小结: 1. 实现全选 在 GridView 的头部添加一个复选框即可实现全选功能。代码如下: ```php <?= $form->field($searchModel, 'id')->checkbox(['class' => 'select-on-check-all']) ?> ``` 其,`select-on-check-all` 是一个自定义的 CSS 类,用于绑定全选的事件。在 JavaScript 文件,可以这样实现: ```javascript $('.select-on-check-all').on('click', function() { $('input[type="checkbox"]').prop('checked', this.checked); }); ``` 2. 批量操作 要实现批量操作,我们需要先将选的项的 ID 收集起来,然后将它们一起传递给后端进行处理。代码如下: ```php <?= Html::a(Yii::t('app', 'Delete selected'), ['bulk-delete'], [ 'class' => 'btn btn-danger', 'data' => [ 'confirm' => Yii::t('app', 'Are you sure you want to delete these items?'), 'method' => 'post', ], ]) ?> ``` 在这个例子,我们创建了一个按钮,当用户点击它时,将调用 `bulk-delete` 动作进行批量删除。在 JavaScript 文件,可以这样实现: ```javascript $('a[data-confirm]').on('click', function() { var ids = $('input[type="checkbox"]:checked').map(function() { return $(this).val(); }).get(); if (ids.length > 0) { var message = $(this).data('confirm'); if (!confirm(message)) { return false; } $('<input>').attr({ type: 'hidden', name: 'ids', value: ids.join(',') }).appendTo($(this).closest('form')); } }); ``` 这段代码会在用户点击批量操作按钮时,收集选的项的 ID 并将它们作为一个名为 `ids` 的表单字段提交给后端。在后端,我们可以通过 `Yii::$app->request->post('ids')` 获取这个值。 以上就是 YiiYii2 GridView 的全选和批量操作的实现方法。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值