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