Yii的CGridview挂件可以自动生成数据列表,很适合在后台管理页面使用。
但Yii的文档还是很缺乏,只能在 class reference 中找到一些简单的说明,可并不直观。在这里总结下CGridview的用法。
在模板页面中,可以这样来使用CGridview:
01
$this->widget('zii.widgets.grid.CGridView', array(
02
'dataProvider'=>$dataProvider,
03
04
'selectableRows' => true,
05
06
//'selectionChanged' => '',
07
08
//'emptyText' => 'it is empy',
09
10
//'actionPrefix' => '', //作用还不明确
11
12
//'ajaxVar'=>'', //作用还不明确
13
14
//ajaxUpdate => true,
15
16
//'beforeAjaxUpdate' => '', //作用还不明确
17
18
//afterAjaxUpdate => 'string', //作用还不明确
19
20
//'enablePagination' => true,
21
22
//'enableSorting' => true,
23
//'hasFooter' => true,
24
25
//'hiddenHeader' => false,
26
27
//'pager'=>'',
28
'columns'=>array(
29
'title', // display the 'title' attribute
30
'category.name', // display the 'name' attribute of the 'category' relation
31
'content:html', // display the 'content' attribute as purified HTML
32
array( // display 'create_time' using an expression
33
'name'=>'create_time',
34
'value'=>'date("M j, Y", $data->create_time)',
35
),
36
array( // display 'author.username' using an expression
37
'name'=>'authorName',
38
'value'=>'$data->author->username',
39
),
40
array( // display a column with "view", "update" and "delete" buttons
41
'class'=>'CButtonColumn',
42
),
43
),
44
));
dataProvider参数:
接收来自CActiveDataProvider的数组,每个数组元素都是一个当前table的model。
gii自动生成的Model类中自带一个search()方法,rules()方法的规则数组中最后一个规则也是和search有关的,这些是为了方便在controller中对数据进行筛选或者说搜索,而CGridview正可以利用Model的这些特性。dbProvider接收的值可以直接是:
'dataProvider'=>$model->search()
一个简单的例子:
controller的方法
01
function actionList()
02
{
03
04
$model = new Member('search');
05
06
if(isset($_GET['Member']))
07
08
{
09
10
$model->attributes = $_GET['Member'];
11
12
}
13
14
$this->render('list',array('model'=>$model));
15
16
}
view视图的内容
01
<html>
02
03
<head></head>
04
05
<body>
06
07
<?php
08
09
$this->widget('zii.widgets.Grid.CGridView',array(
10
11
'dataProvider' => $model->search(),
12
13
'filter' => $model,
14
15
'filterPosition' => 'header', //
16
17
'columns' => array(
18
19
'name',
20
21
'email',
22
23
),
24
25
));
26
27
?>
28
29
</body>
30
31
</html>
视图中CGridview的参数filter,他的值应该是当前table的Model,如果filter获得了赋值,则这个CGridview可以对数据进行筛选搜索了;filterPosition可以有三个值,header/body/footer,用来控制字段的搜索输入框显示在列的头部、中部还是尾部,如果为空,则不会显示系统自带的这个搜索输入框。说实话CGridview自带的这个输入框有点太不人性化了,一点也不像常见搜索表单,所以我建议不要显示系统自带的搜索框,而是自行写一个搜索框,最简单像这样:
01
<input type="text" name="Member[name]" id="Member_id">
02
03
<input type="button" value="搜索" οnclick="submitSearch('<?=url($this->route)?>','Member','name')">
04
05
<script type="text/javascript">
06
07
function submitSearch(url,model,id)
08
09
{
10
11
var value = document.getElementById(model+'_'+id).value;
12
13
document.location.href = url + '&' + model + '['+ id + ']=' + value;
14
15
}
16
17
</script>
如果还要实现ajax的功能可以自行对代码进行一些小修改即可。
emptyText参数
当一条数据也没有获取到时,就会显示这个参数设定的提示信息,如“没有找到任何数据”
ajaxUpdate参数:
是否启用CGridview的ajax操作效果,如果设为true,删除、排序这些操作会自动以ajax方式来实现
enablePagination 参数
是否启用分页
enableSoring 参数
是否启用数据排序功能
hasFooter 参数
CGridview的表格是否有脚部
hiddenHeader 参数
是否隐藏CGridview表格的头部
pager参数
pager类显示时用到的参数
selectableRows参数
是否在每行数据行首显示一个checkbox以及一个全选checkbox
selectionChanged参数
当数据选中状态变化后要调用执行的js函数
showTableOnEmpty参数
当没有数据时,是否显示CGridview表格
summaryText参数
显示的摘要信息