Yii gii/model/controller/view/widget/cgridview/cjuiwidget

后臺代碼自動生成
用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代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

array(  
    'class'=>'CButtonColumn',  
    'header' => '操作',  
    'template'=>'{delete}{update}',                    
),  

在上例 CGridView 的按鈕列中沒有查看(view)按鈕,而刪除(delete)和更新(update)按鈕為默認設置(刪除按鈕放到第一個位置).
隱藏按鈕{update}{delete}
Java代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

array(  
    'class'=>'CButtonColumn',  
    'deleteButtonOptions'=>array('style'=>'display:none'),  
    'updateButtonOptions'=>array('style'=>'display:none'),  
    'template'=>'{view}{update}{delete}',  
),  

同樣你可以通過此屬性添加新按鈕 :{up}{down}
Java代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

array(  
    'class'=>'CButtonColumn',  
    'template'=>'{up}{down}{delete}',  
)   

對于新的按鈕(當然已有的也一樣)你必須指定外觀和行為.CButtonColumn 的屬性 **buttons** 就是用來做這的,它是由每個按鈕的ID(名稱必須和*template* 提供的相同)對應其屬性組成的數組.
你可以使用一下代碼:
Java代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

'buttonID' => array(  
    'label'=>'...',     //按鈕的文本標簽.  
    'url'=>'...',       //使用 PHP 表達式得出按鈕的 URL.  
    'imageUrl'=>'...',  //按鈕的圖片路徑.  
    'options'=>array(), //按鈕的 HTML 選項.  
    'click'=>'...',     //當點擊按鈕時調用的 javascript 函數  
    'visible'=>'...',   //確定按鈕是否顯示的 PHP 表達式  
)  

請注意: 當使用文字鏈接時 *label* 屬性就會顯示,當使用圖片鏈接時 *label* 屬性會被渲染為圖片的 *alt* 參數.如果你想修改圖片的 *tooltip* 文字,你可以修改 *options* 屬性中的 *title* 參數,如:
Java代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

'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代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

array(  
        'class'=>'CButtonColumn',  
        'deleteConfirmation'=>"js:'Record with ID '+$(this).parent().parent().children(':first-child').text()+' will be deleted! Continue?'",  
),  

jsJava代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

'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代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

<div class="Action">  
<?php echo XHtml::link(Yii::t('Trade','Back'), Yii::app()->request->urlReferrer); ?>  
</div>  

 再進一步,如果要在這個查看頁面進行審核操作,希望審核操作后也退回列表歷史頁面,那么單單使用urlReferrer就不行了,因為它對于審核動作的處理邏輯而言記錄了查看頁面的url.
通用做法將當前頁面的地址(包括參數)存起來(如果是post參數存cookie之類的)可以在查看頁面中放一個隱藏字段:
Java代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

<input type="hidden" value=<?php echo Yii::app()->request->urlReferrer;?> id="backurl" name="backurl">  

也就是把列表歷史頁面的路徑做為請求參數傳Java代碼  ![收藏代碼](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

$this->redirect($_POST['backurl']);  
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容