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','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','age'
                ],]);

        //如果验证没通过,直接返回
        if (!($this->load($params) && $this->validate())) {
            return $provider;
        }

        //增加过滤条件
        $query->andFilterWhere(['id' => $this->id])
            ->andFilterWhere(['like',$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',//通过该返回值,我们可以任意控制列数据的显示
                        //$data指向的是当前行的数据结果集
                        'value' => function ($data) {
                            return '<img src="' . '/' . ltrim($data->head_img,'/') . '" width="60px">';
                        },[
                        'label' => '性别',//设置筛选选项
                        'filter' => [0 => '男',1 => '女'],'attribute' => 'sex','value' => function ($data) {
                            return ($data->sex == 0) ? '男' : '女';
                        }
                    ],[
                        'label' => '年龄','attribute' => 'age',[
                        '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,$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>

显示结果如下:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1、将Yii2.0advanced版中应用主体frontend或backend应用复制为api应用2、在应用主体api目录的controller新建SiteController.php:namespaceapi\controllers;useYii;useyii\rest\ActiveController;/*SiteController测试控制器*/classSiteControllerextendsActiveCon
Yii2restfulAPI文档一、配置模块:1.Config/main.php:  2.创建模块目录:  3.Module.php:  二、路由配置:  三、控制器:  四、Models:   五、测试:GET:  POST:  PUT:      DELETE:  
Yii在framework/i18n/data/%lang%.php文件中有很多翻译.这是例如germantranslations我想在我的Yii项目中使用Fullcalendar.要翻译此日历,我必须为当前语言提供一个monthNames/dayNames数组.FullcalendarmonthNamesDocumentationYii生成数组的最佳方法是什么:['January'
在Yii2中,官方的页面多语言解决方案有两个:方案1,使用Yii::t()函数,在页面中需要输出文字的地方,使用类似如下代码:<?=Yii::t(‘views/login’,‘hello’)?>这样做的后果是页面上大量充斥着类似的代码,导致页面可读性很差,而且对于同一个页面来说,Yii::t()函数的第一个参数基本上都是
Yii2.0对数据库查询的一些简单的操作123456789101112131415161718192021222324252627282930313233343536373839User::findOne($id);   //此方法返回 主键 id=1  的一条数据(举个例子);  User::find()->where(['name' =
数据查询User::find()->all();此方法返回所有数据;User::findOne($id);此方法返回主键id=1的一条数据(举个例子);User::find()->where(['name'=>'小伙儿'])->one();此方法返回['name'=>'小伙儿']的一条数据;User::find()->where(['n
最近打算提升自己的解决问题能力,于是打算从学习其他框架下手,让我们先去了解yii框架是如何运作的吧!https://www.yiichina.com/访问yii中文网站  让我们先把框架下载下来点击下载框架 科普一下:目前yii框架有三个版本yii1.0、yii1.1、yii2.0貌似即将推出3.0 这里我们
如何在Yii2中检查模型属性的类型(列类型)?ThisoldYiiForumanswer给了我一个结论,在Yii1中我可以使用类似的东西:$model->getMetaData()->columns['attribute-name']->type;但我没有成功将此解决方案移植到Yii2.有人可以帮忙吗?解决方法:您可以使用:$model->getTableSchema()
defined('YII_DEBUG')ordefine('YII_DEBUG',true);defined('YII_ENV')ordefine('YII_ENV','dev');require(__DIR__.'/../vendor/autoload.php');//注册类加载器require(__DIR__.'/../vendor/yii
在NGINX中配置:location/{   if(!-e$request_filename){    rewrite^/(.*)/index.phplast;}这样,当NGINX找不到文件的时候,就会将URL重写为index.php。对于URL中只有域名的情况,因为不存在对应的文件,所以会匹配到。再配置:location~\.php${  include
Yii2.0封装的类足够强大,Mailer的使用方法做一个总结:1、先在main-local.php中做好配置:return[//....'components'=>['mailer'=>['class'=>'yii\swiftmailer\Mailer',],],];详细如下:return[//....'components'=>[
每当我尝试登录我的Yii应用程序时,它都会显示错误CDbConnectionfailedtoopentheDBconnection:couldnotfinddriver.我google了很多个小时,从许多博客我知道我需要pdo_mysql,但已经安装了.在php.ini中我也对这些行做了评论;extension=php_pdo_mysql.dll;extension
我有一个模型Aziende,它与称为Annunci的花药模型相关(1:N),如下所示:'annunci'=>array(self::HAS_MANY,'Annunci','azienda_id'),我想算一下有多少记录确实有这种关系,在mySql中我会做:SELECTcount(*)FROM`aziende`aJOINannuncianONan.azienda_id=a.id我怎么能
我们有一个项目,为孟加拉国最大的服装行业之一建立一个ERP系统.他们有大约20,000名员工,其中约10%的员工每个月都会离职.我们是一家拥有5名PHP开发人员的小公司,对这么大的项目没有多少经验.我们之前使用Codeigniter/ZendFramework和MySQL数据库开发了不同的中小规模项目.对于
我在Yii中有一些表单,使用以下内容以下拉形式从相关表中获取数据列表:dropDownList(CHtml::listData(Company::model()->findAll(array('order'=>'companyASC'))));这是有效的,但这意味着对于每个下拉列表(其中很多)我将这个数组(‘order’=>’公司ASC’放在每一个中.这是最
本文采用Yii文档,经过自己的修改,让读者更容易理解预定义完整列表: boolean : CBooleanValidator 的别名,确保属性的值是CBooleanValidator::trueValue 或CBooleanValidator::falseValue .captcha : CCaptchaValidator 的别名,确保了特性的值等于 CAPTCHA 显示出来
前面已经安装好了yii框架,现在我们来建立第一个Yii应用1、进入您网站更目录2、执行命令:YiiRoot/framework/yiicwebapptestdrive说明:这里的YiiRoot为您Yii框架的安装目录。3、输入以上命令后,会出现一个提示信息:PHPWarning:PHPStartup:Unabletol
一、ThinkPHPThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架。它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟悉J2EE的开发人员相对比较容易上手,适合php框架初学者。ThinkPHP的宗旨是简化开发、提
我必须实现标题中提到的验证,即需要两个字段之一(电子邮件,电话).我在我的模型中这样做:[['email'],'either',['other'=>['phone']]],这是方法:publicfunctioneither($attribute_name,$params){$field1=$this->getAttributeLabel($attribute_nam
我试图得到(StatusCode)响应RESTapi,而它只返回字段名称和错误消息,如下所示[{"field":"Email","message":"Email\"ali@ali.ali\"hasalreadybeentaken."}]我添加了回复'response'=>['class'=>'