簡述Yii 的CGridView如何使用及怎麼用model的search搜索

 
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參數

顯示的摘要信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章