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' => '',  
        '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)

request->urlReferrer); ?>
再进一步,如果要在这个查看页面进行审核操作,希望审核操作后也退回列表历史页面,那么单单使用urlReferrer就不行了,因为它对于审核动作的处理逻辑而言记录了查看页面的url. 通用做法将当前页面的地址(包括参数)存起来(如果是post参数存cookie之类的)可以在查看页面中放一个隐藏字段: Java代码 ![收藏代码](http://upload-images.jianshu.io/upload_images/3883190-3464f24feaae5eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 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']);

你可能感兴趣的:(Yii gii/model/controller/view/widget/cgridview/cjuiwidget)