简述Yii 的CGridView如何使用及怎么用model的search搜索

来源:互联网 发布:mac硬盘默认名称 编辑:程序博客网 时间:2024/04/27 20:06
 
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="搜索" onclick="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参数

显示的摘要信息

原创粉丝点击