天天看点

YII CGridView CListView 返回列表带记忆功能

我们知道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'  =>  '操作' ,  

YII CGridView CListView 返回列表带记忆功能

array(  

    'class'=>'cbuttoncolumn',  

    'header' => '操作',  

    'template'=>'{delete}{update}',                    

),  

在上例 cgridview 的按钮列中没有查看(view)按钮,而删除(delete)和更新(update)按钮为默认设置(删除按钮放到第一个位置).

隐藏按钮{update}{delete}

YII CGridView CListView 返回列表带记忆功能

    'deletebuttonoptions'=>array('style'=>'display:none'),  

    'updatebuttonoptions'=>array('style'=>'display:none'),  

    'template'=>'{view}{update}{delete}',  

同样你可以通过此属性添加新按钮 :{up}{down}

YII CGridView CListView 返回列表带记忆功能

    'template'=>'{up}{down}{delete}',  

)   

对于新的按钮(当然已有的也一样)你必须指定外观和行为.cbuttoncolumn 的属性 buttons 就是用来做这的,它是由每个按钮的id(名称必须和template 提供的相同)对应其属性组成的数组.

你可以使用一下代码:

YII CGridView CListView 返回列表带记忆功能

'buttonid' => array(  

    'label'=>'...',     //按钮的文本标签.  

    'url'=>'...',       //使用 php 表达式得出按钮的 url.  

    'imageurl'=>'...',  //按钮的图片路径.  

    'options'=>array(), //按钮的 html 选项.  

    'click'=>'...',     //当点击按钮时调用的 javascript 函数  

    'visible'=>'...',   //确定按钮是否显示的 php 表达式  

)  

请注意: 当使用文字链接时 label 属性就会显示,当使用图片链接时 label 属性会被渲染为图片的 alt 参数.如果你想修改图片的 tooltip 文字,你可以修改 options 属性中的 title 参数,如:

YII CGridView CListView 返回列表带记忆功能

    '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 时,文本形式的链接将会代替图片显示.

最后这里有一个添加新按钮的例子:

YII CGridView CListView 返回列表带记忆功能

    '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.

YII CGridView CListView 返回列表带记忆功能

        'class'=>'cbuttoncolumn',  

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

js

YII CGridView CListView 返回列表带记忆功能

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查看

YII CGridView CListView 返回列表带记忆功能

'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)中使用如下的语句达到返回历史页面的效果:

YII CGridView CListView 返回列表带记忆功能

<div class="action">  

<?php echo xhtml::link(yii::t('trade','back'), yii::app()->request->urlreferrer); ?>  

</div>  

 再进一步,如果要在这个查看页面进行审核操作,希望审核操作后也退回列表历史页面,那么单单使用urlreferrer就不行了,因为它对于审核动作的处理逻辑而言记录了查看页面的url.

通用做法将当前页面的地址(包括参数)存起来(如果是post参数存cookie之类的)可以在查看页面中放一个隐藏字段:

YII CGridView CListView 返回列表带记忆功能

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

也就是把列表历史页面的路径做为请求参数传

YII CGridView CListView 返回列表带记忆功能

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