后臺代碼自動生成
用gii -> Model 生成model
再gii -> Crud 生成控制和視圖文件
代碼生成好之后
將admin 視圖 里的zii.widgets.grid.CGridView 下的columns 屬性進行更改
$this->widget('zii.widgets.grid.CGridView',
array('dataProvider'=>$dataProvider,//數據源
'pager'=>array( //通過pager設置樣式 默認為CLinkPager
'prevPageLabel'=>'上一頁',
'firstPageLabel'=>'首頁', //first,last 在默認樣式中為{display:none}及不顯示,通過樣式{display:inline}即可
'nextPageLabel'=>'下一頁',
'lastPageLabel'=>'末頁',
'header'=>'',
),
'ajaxUpdate'=>false, //是否使用ajax分頁 null為ajax分頁
'columns'=>array(
array( //具體設置每列的header
'name'=>'ID',
'value'=>'$data->id',
),
'parentid',
array(
'name'=>'標題', //需要連接可使用CLinkColumn
'value'=>'$data->title',
),
array(
'name'=>'模型',
'value'=>'$data->module',
),
array( //自定義按鈕操作列
'header'=>'操作', //直接放按鈕標簽 使用蒙版層
'buttons'=>array(
'preview'=>array(
'label'=>'審核',
'url'=>'',// 通過PHP表達式生成URL 例如createUrl
'imageUrl'=>'',// 按鈕圖片地址
'options'=>array(),// HTML 標簽屬性設置
'click'=>'',// js 代碼或函數
'visible'=>'',// PHP表達式 用于權限控制
),
'recommend'=>array(
'label'=>'推薦',
),
),
'class'=>'CButtonColumn',
'template'=>'{preview} {recommend}',
),
array( //僅使用默認CButtonColumn不具體設置按鈕,在顯示為查看 修改 刪除圖片按鈕
'class'=>'CButtonColumn',
),
),//end columns
)//end dataprovicer
);//end widget
另外用法:
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' => '操作' ,
Java代碼 
array(
'class'=>'CButtonColumn',
'header' => '操作',
'template'=>'{delete}{update}',
),
在上例 CGridView 的按鈕列中沒有查看(view)按鈕,而刪除(delete)和更新(update)按鈕為默認設置(刪除按鈕放到第一個位置).
隱藏按鈕{update}{delete}
Java代碼 
array(
'class'=>'CButtonColumn',
'deleteButtonOptions'=>array('style'=>'display:none'),
'updateButtonOptions'=>array('style'=>'display:none'),
'template'=>'{view}{update}{delete}',
),
同樣你可以通過此屬性添加新按鈕 :{up}{down}
Java代碼 
array(
'class'=>'CButtonColumn',
'template'=>'{up}{down}{delete}',
)
對于新的按鈕(當然已有的也一樣)你必須指定外觀和行為.CButtonColumn 的屬性 **buttons** 就是用來做這的,它是由每個按鈕的ID(名稱必須和*template* 提供的相同)對應其屬性組成的數組.
你可以使用一下代碼:
Java代碼 
'buttonID' => array(
'label'=>'...', //按鈕的文本標簽.
'url'=>'...', //使用 PHP 表達式得出按鈕的 URL.
'imageUrl'=>'...', //按鈕的圖片路徑.
'options'=>array(), //按鈕的 HTML 選項.
'click'=>'...', //當點擊按鈕時調用的 javascript 函數
'visible'=>'...', //確定按鈕是否顯示的 PHP 表達式
)
請注意: 當使用文字鏈接時 *label* 屬性就會顯示,當使用圖片鏈接時 *label* 屬性會被渲染為圖片的 *alt* 參數.如果你想修改圖片的 *tooltip* 文字,你可以修改 *options* 屬性中的 *title* 參數,如:
Java代碼 
'buttonID' => array(
'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 時,文本形式的鏈接將會代替圖片顯示.
最后這里有一個添加新按鈕的例子:
Java代碼 
array(
'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.
因為 *deleteConfirmation* 屬性不會在 CGridView 中的 CButtonColumn 中解析,所以實現不是這么簡單,這里又一個巧妙的方式使用 jQuery 來實現它下面是例子:
Java代碼 
array(
'class'=>'CButtonColumn',
'deleteConfirmation'=>"js:'Record with ID '+$(this).parent().parent().children(':first-child').text()+' will be deleted! Continue?'",
),
jsJava代碼 
function getCheckList() {
var data = new Array();
$("input:checkbox[name='selectids[]']").each(function () {
if ($(this).prop("checked") == true) {
data.push($(this).val());
//data.push({service_type_id: 11, service_id: 451});
}
});
if (data.length > 0) {
$.post("index.php?r=ip/delall", {'ids':data}, function (data) {
if (data == 'ok') {
alert('刪除成功!');
}
});
} else {
alert("請選擇要刪除的選項!");
}
}
序號,鏈接,復選框
如果你想鏈接單元格在網格視圖中的內容,在訂單列表中的某些頁面,例如,如果你想客戶的名稱是管理客戶的詳細信息頁面的鏈接,改變列CGrid查看Java代碼 
'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',
),
array(
'name' => '序號', //$this->grid->dataProvider->getTotalItemCount() 總條數
'value' => '$this->grid->dataProvider->getPagination()->getOffset()+($row+1)', //CDataColumn $this->grid
'htmlOptions' => array(
'width' => '5px',
),
),
array(
'type' => 'html', //link
'value' => 'CHtml::link( $data->name,Yii::app()->createUrl( "admin/view", array("id"=>$data->user_id, "m"=>"users")) )',
),
array(
'name' => 'orderby',
'type' => 'raw',
'value' => 'CHtml::textField("id[$data->id]", $data->orderby)'
),
array(
'name'=>'orders.status', //使用外聯表的label
'value'=>'Orders::model()->getOrderStatusList($data->orders->status)'
),
array(
'name' => 'type',//失敗是紅色,成功是綠色
'type'=>'raw',
'value' => 'CHtml::tag("font",array("color"=>$data->type?"red":"green"),$data->getTypeList($data->type))'
),
array(
'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)中使用如下的語句達到返回歷史頁面的效果:
Java代碼 
<div class="Action">
<?php echo XHtml::link(Yii::t('Trade','Back'), Yii::app()->request->urlReferrer); ?>
</div>
再進一步,如果要在這個查看頁面進行審核操作,希望審核操作后也退回列表歷史頁面,那么單單使用urlReferrer就不行了,因為它對于審核動作的處理邏輯而言記錄了查看頁面的url.
通用做法將當前頁面的地址(包括參數)存起來(如果是post參數存cookie之類的)可以在查看頁面中放一個隱藏字段:
Java代碼 
<input type="hidden" value=<?php echo Yii::app()->request->urlReferrer;?> id="backurl" name="backurl">
也就是把列表歷史頁面的路徑做為請求參數傳Java代碼 
$this->redirect($_POST['backurl']);
Yii gii/model/controller/view/widget/cgridview/cjuiwidget
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- 原文地址:Model-View-Controller 模型-視圖-控制器設計模式把應用中的對象分為模型,視圖,控制...
- 1、mvc即:Model-View-Controller (1) model--->javabean即要求表單屬性...
- 標準的模型-視圖-控制器設計模式要求控制對象負責模型對象的保存和讀取。但這樣做的效果并不是很好。控制對象主要的任務...
- 1. Model 2. Controller 3. View 注:(1)View里面@Model就是傳遞過來...