YII2 GridView数据小部件

GridView数据小部件

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
            ['attribute'=>'id','contentOptions'=>['width'=>'5%']],
            'username',
            'nickname',
            'realname',
            'email:email',
            ['attribute'=>'created_at','format'=>['date','php:Y-m-d H:i']],
            [
                'class' => 'yii\grid\ActionColumn',
                'template'=>'{view} {update} {delete} {approve}',

            ],
        ],
    ]); ?>

1. GridView小部件

  • 是YII中功能最强大的小部件之一
  • 适合快速建立系统管理后台
  • 用 dataProvider 指定数据提供者
  • 用 filterModel 提供数据过滤功能呢3
  • 用 columns 制定需展示功能及格式

2. 列类

  • 序号列: 行号,从1开始并自动增长
  • 数据列: 显示数据
  • 动作列: 显示动作按钮
  • 复选框列:显示复选框列

3. 数据列的自定义

  • attribute 指定需展示的属性
  • label 标签名
  • value 值
  • format 格式
  • filter 自定义过滤条件的输入框
  • contentOptions 设定数据列的HTML属性

数据提供者 DataProvider

1. 什么是数据提供者

  • 数据提供者可获取数据并提供给其他组件或页面使用
  • 可对获取的数据进行分页和排序
  • 常用来给数据小部件提供数据,方便用户交互地进行数据的分页和排序。
  • 实现了 yii\data\DataProviderInterface 接口类
common/models/PostSearch.php
    public function search($params)
    {
        $query = Post::find();

        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            //分页
            'pagination' => [
                'pageSize'=> 2
            ],
            //排序
            'sort'=>[
                'defaultOrder'=>['id'=>SORT_DESC]
            ]
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        // grid filtering conditions
        $query->andFilterWhere([
            'id' => $this->id,
            'status' => $this->status,
            'type' => $this->type,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
            'created_by' => $this->created_by,
            'updated_by' => $this->updated_by,
        ]);

        $query->andFilterWhere(['like', 'subject', $this->subject])
            ->andFilterWhere(['like', 'content', $this->content])
            ->andFilterWhere(['like', 'tag', $this->tag]);

        return $dataProvider;
    }

2. 数据提供者的种类

  • ActiveDataProvider 用yii\db\Query 或 yii\db\ActiveQuery 从数据库查询数据,并以数组项的方式或 ActiveRecord 实例的方式返回。
  • SqlDataProvider 执行一段SQL语句并讲数据库作为数组返回
  • ArrayDataProvider 将一个大的数组依据分页和排序设定返回一部分数据

ActiveDataProvider 继承自 BaseDataProvider ,实现了 DataProviderInterface 接口。在此接口中拥有一下方法:

  • getCount() 当前页的数据条数
  • getTotalCount() 所有页面的数据条数
  • getPagination() 获取分页对象信息
  • getSort() 获取排序
  • getModels() 获取DataProvider中的数据,可能是对象数组或是普通数组。

数据提供者 DataProvider 的自定义

  • 通过 pagination 自定义分页条数pageSize
  • 通过 sort 设置需排序的字段以及排序方式
       // add conditions that should always apply here
       $dataProvider = new ActiveDataProvider([
           'query' => $query,
           //分页
           'pagination' => [
               'pageSize'=> 2
           ],
           //排序
           'sort'=>[
               'defaultOrder'=>['id'=>SORT_DESC],
               'attributes'=>['id','title']
           ]
       ]);

字符串截取

方式1

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        ['attribute'=>'id', 'contentOptions'=>['width'=>'5%']],
        'post_id',
        'status',
        ['attribute'=>'content','value'=>function($model){
            $str = strip_tags($model->content);
            $len = mb_strlen($str);
            return mb_substr($str,0,20,'utf-8').($len>20?'...':'');
        }],
        'url:url',
        // 'email:email',
        // 'remind',
        // 'created_at',
        // 'created_by',
        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

方式2:使用get方法
模型中添加get属性方法,推荐使用。

/*字符截取*/
public function getBegin()
{
    $str = strip_tags($this->content);
    $len = mb_strlen($str);
    return mb_substr($str,0,20,'utf-8').($len>20?'...':'');
}

视图中直接使用

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        ['attribute'=>'id', 'contentOptions'=>['width'=>'5%']],
        'post_id',
        'status',
        ['attribute'=>'content','value'=>'begin'],
        'url:url',
        // 'email:email',
        // 'remind',
        // 'created_at',
        // 'created_by',
        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

Getter和Setter

1.属性定义的格式
getter方法名以get开头,get后跟属性名。
setter方法名以set开头,set后跟属性名。
2.属性的使用
定义好方法后即可像普通属性一样使用,但本质区别是当属性被读取时,对应的getter将被调用,而当属性被赋值时,对应的setter也被调用。
3.注意问题
要使用getter和setter来定义属性,类必须从 yii\base\Object 或其子类继承。此种方法不是只能用于模型类,只要是从 yii\base\Object 类继承的类都可使用。
若只定义getter而没有setter的属性是只读属性对其赋值不会抛出异常。
此种方法定义的属性一般多数都是只读的,一般不用持久化保存,多数是一个业务逻辑需要的计算结果。

GridView动作列自定义

动作列的配置属性

  • template 定义动作列中那些按钮,大括号内括起来的就是按钮,这些动作是控制器的actionID。
  • buttons 是一个按钮的渲染函调函数数组,数组中的键是按钮名,值是对应的按钮渲染函调函数。
  • controller 是应该执行动作的控制器ID,若没有设置将使用当前控制器。
[
    'class' => 'yii\grid\ActionColumn',
    'template'=>"{view} {update} {delete} {approve}",
    'buttons'=>[
        'approve'=>function($url,$model,$key){
            $options = [
                'title'=>Yii::t('common','Approve'),
                'aria-label'=>Yii::t('common','Approve'),
                'data-confirm'=>Yii::t('common','Are you sure?'),
                'data-method'=>'post',
                'data-pjax'=>'0'
            ];
            return Html::a('<i class="glyphicon glyphicon-check"></i>',$url,$options);
        }
    ]
],
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值