我們知道yii 中的cgridview 很好用,但是有時候不能滿足我們的頁面高制定性,這個時候更加靈活的clistview(隻支援cactivedataprovider) 就可以幫助我們解決這些問題clistview好更容易排版面和樣式。
cgridview是yii中的一個靈活的插件gridview的每列為一個cgridcolumn對象,通過column加class來調用
例如它使用cbuttoncolumn來為每行生成按鈕.在這裡我們會介紹怎麼根據需求自定義按鈕.
預設按鈕
預設情況下 cbuttoncolumn 包含三個按鈕:{檢視(view)},{更新(update)}和{删除(delete)} ,它們的含義是顯而易見的.
自定義它們的外觀和行為的最簡單的方法是使用cbuttoncolumn的屬性,如:
updatebuttonimageurl (更新update 按鈕的圖檔路徑),
updatebuttonlabel (更新按鈕的标簽,沒有經過html編碼) ,
updatebuttonoptions (更新按鈕的html選項,向其他插件的htmloptions 屬性一樣)和 updatebuttonurl (通過php表達式得出的url).你可以找到每個按鈕各自的屬性.
此外:
隻有删除(delete)按鈕擁有 deleteconfirmation (string) 屬性,它用作點選删除按鈕後顯示的自定義确認資訊.
在 xxxbuttonurl 屬性的 php 表達式中 $row 表示行号(從0開始),$data 表示資料模型(model),$this 表示列對象.
當你設定 xxxbuttonimageurl 的屬性為空或 false 時,文本形式的連結将會代替圖檔顯示或imageurl'=>false
更靈活的定制
通過上面的屬性自定義多個按鈕在代碼中時很混亂的,通過 模闆(template) 和 按鈕(buttons) 屬性可以更靈活的自定義多個按鈕。
你可以通過一下設定模闆(template)屬性的方式來建構或移除按鈕.'header' => '操作' ,

array(
'class'=>'cbuttoncolumn',
'header' => '操作',
'template'=>'{delete}{update}',
),
在上例 cgridview 的按鈕列中沒有檢視(view)按鈕,而删除(delete)和更新(update)按鈕為預設設定(删除按鈕放到第一個位置).
隐藏按鈕{update}{delete}

'deletebuttonoptions'=>array('style'=>'display:none'),
'updatebuttonoptions'=>array('style'=>'display:none'),
'template'=>'{view}{update}{delete}',
同樣你可以通過此屬性添加新按鈕 :{up}{down}

'template'=>'{up}{down}{delete}',
)
對于新的按鈕(當然已有的也一樣)你必須指定外觀和行為.cbuttoncolumn 的屬性 buttons 就是用來做這的,它是由每個按鈕的id(名稱必須和template 提供的相同)對應其屬性組成的數組.
你可以使用一下代碼:

'buttonid' => array(
'label'=>'...', //按鈕的文本标簽.
'url'=>'...', //使用 php 表達式得出按鈕的 url.
'imageurl'=>'...', //按鈕的圖檔路徑.
'options'=>array(), //按鈕的 html 選項.
'click'=>'...', //當點選按鈕時調用的 javascript 函數
'visible'=>'...', //确定按鈕是否顯示的 php 表達式
)
請注意: 當使用文字連結時 label 屬性就會顯示,當使用圖檔連結時 label 屬性會被渲染為圖檔的 alt 參數.如果你想修改圖檔的 tooltip 文字,你可以修改 options 屬性中的 title 參數,如:

'label' => 'text shown as alt text to image or as label to text link...',
'url' => '"#"',
'visible' => '$data->score > 0',
//'click'=>'function(){$("#dialog_id").dialog("open"); return false;}',
'options' => array(
'title' => 'text shown as tooltip when user hovers image...',
'onclick' => 'alert("确認要檢視嗎?");return false;',
),
),
在 url 和 visible 屬性的 php 表達式中 $row 表示行号(從0開始),$data 表示資料模型(model),$this 表示列對象.
當你設定 xxxbuttonimageurl 的屬性為空或 false 時,文本形式的連結将會代替圖檔顯示.
最後這裡有一個添加新按鈕的例子:

'header' =>'操作',
'class' =>'cbuttoncolumn',
'template'=>'{email}',
'buttons' =>array (
'email' => array (
'label'=>'send an e-mail to this user',
'imageurl'=>yii::app()->request->baseurl.'/images/email.png',
'visible'=>'$data->score > 0',
'url'=>'yii::app()->createurl("users/email", array("id"=>$data->id))',
)
在上面的例子中同樣可以看出怎麼建立一個包含控制器視圖和使用者id(或目前行的其他資料)的有效url,同樣也可以看出怎麼使用 chttprequest 類中的 baseurl 函數來設定存放在 protected 檔案夾外的圖檔.
你可能會注意到使用 gii 生成的标準 crud 操作中的删除菜單項包含确認資訊.這個資訊可以很容易地 修改或擴充到資料中的指定記錄,如記錄id.

'class'=>'cbuttoncolumn',
'deleteconfirmation'=>"js:'record with id '+$(this).parent().parent().children(':first-child').text()+' will be deleted! continue?'",
js

function getchecklist() {
var data = new array();
$("input:checkbox[name='selectids[]']").each(function () {
if ($(this).attr("checked") == 'checked') {
data.push($(this).val());
}
});
if (data.length > 0) {
$.post("index.php?r=ip/delall", {'ids':data}, function (data) {
if (data == 'ok') {
alert('删除成功!');
}
});
} else {
alert("請選擇要删除的選項!");
}
}
序号,連結,複選框
如果你想連結單元格在網格視圖中的内容,在訂單清單中的某些頁面,例如,如果你想客戶的名稱是管理客戶的詳細資訊頁面的連結,改變列cgrid檢視

'columns' => array(
array(
'class' => 'ccheckboxcolumn',
'selectablerows' => 2,
'footer' => '<button type="button" onclick="getchecklist();" style="width:76px">批量删除</button>',
'headerhtmloptions' => array('width' => '33px'),
'headertemplate'=>'{item}全選',
'checkboxhtmloptions' => array('name' => 'selectids[]'),
'disabled'=>'$data->status>0', //狀态>0的禁用
'checked'=>'$data->status>0',
'name' => '序号', //$this->grid->dataprovider->gettotalitemcount() 總條數
'value' => '$this->grid->dataprovider->getpagination()->getoffset()+($row+1)', //cdatacolumn $this->grid
'htmloptions' => array(
'width' => '5px',
),
'type' => 'html', //link
'value' => 'chtml::link( $data->name,yii::app()->createurl( "admin/view", array("id"=>$data->user_id, "m"=>"users")) )',
'name' => 'orderby',
'type' => 'raw',
'value' => 'chtml::textfield("id[$data->id]", $data->orderby)'
'name'=>'orders.status', //使用外聯表的label
'value'=>'orders::model()->getorderstatuslist($data->orders->status)'
'name' => 'type',//失敗是紅色,成功是綠色
'type'=>'raw',
'value' => 'chtml::tag("font",array("color"=>$data->type?"red":"green"),$data->gettypelist($data->type))'
'filter' => chtml::listdata($list, 'id', 'name'), //select filter
'name' => 'offer_id',
'value' => '$data->offer->name'
"type"代表屬性的類型.它确定屬性值怎樣被格式化和顯示. 它預設為'text'. "type"應該cformatter被識别, 這些"type"值是有效的: raw , text, ntext, html, date, time, datetime , boolean, number, email , image , url
傳回清單帶記憶功能:如果存在多頁文章資料,在界面上浏覽到後面的文章頁,然後檢視某個文章的資訊,這個時候再回退的時候,總是傳回到清單的第一頁,而不是剛才的曆史頁面。把清單視圖(list.php)中把該cgridview/clistview的enablehistory屬性設定為true
然後在檢視視圖(view.php)中使用如下的語句達到傳回曆史頁面的效果:

<div class="action">
<?php echo xhtml::link(yii::t('trade','back'), yii::app()->request->urlreferrer); ?>
</div>
再進一步,如果要在這個檢視頁面進行稽核操作,希望稽核操作後也退回清單曆史頁面,那麼單單使用urlreferrer就不行了,因為它對于稽核動作的處理邏輯而言記錄了檢視頁面的url.
通用做法将目前頁面的位址(包括參數)存起來(如果是post參數存cookie之類的)可以在檢視頁面中放一個隐藏字段:

<input type="hidden" value=<?php echo yii::app()->request->urlreferrer;?> id="backurl" name="backurl">
也就是把清單曆史頁面的路徑做為請求參數傳

$this->redirect($_post['backurl']);