二十一、挂件CGridView

对于查询出来的多条数据,我们通常需要进行列表展示,并需要搜索,分页等功能,对于这些YII已经为我们封装好了一个挂件CGridView
CGridView需要和数据提供器联合起来使用( CActiveDataProvider, CArrayDataProvider, CSqlDataProvider)
CActiveDataProvider是AR类的数据提供其,此处我们先简单的以它为例来展示使用方法
 

创建方法actionIndex

public function actionIndex(){
        $criteria = new CDbCriteria();
        $criteria->with = array(
            'city',
            'user_info'
        );
        //实例化数据提供器对象,第一个参数是查询的AR模型类名
        $dataProvider = new CActiveDataProvider('User');
        //设置查询器的查询条件
        $dataProvider->setCriteria($criteria);
        //设置分页的页大小
        $dataProvider->setPagination(array('pageSize'=>3));
        $this->render('index',array(
            'dataProvider'=>$dataProvider,
        ));
    }
创建视图views/user/index.php
<?php
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        'id',          // display the 'title' attribute
        'username',          // display the 'title' attribute
        'city.name',  // display the 'name' attribute of the 'category' relation
//        'content:html',   // display the 'content' attribute as purified HTML
        array(            // display 'create_time' using an expression
            'name'=>'create_time',
            'value'=>'date("Y-m-d", $data->create_time)',
        ),
        array(            // display 'author.username' using an expression
            'name'=>'info',
            'type'=>'raw',
            'value'=>'$data->user_info->info',
        ),
        array(            // display a column with "view", "update" and "delete" buttons
            'class'=>'CButtonColumn',
        ),
    ),
));
?>
只需要简单的配置,我们就可以看到如下图的效果
和CDetailView一样,主要配置两个参数dataProvider和column,就可以简单的展示列表,并且默认带有分页和增删改的操作按钮
默认的是ajax分页,如果需要关闭ajax分页,只需要再添加一个配置参数
...
'dataProvider'=>$dataProvider,
    'ajaxUpdate'=>false,//设置为false表示不是ajax分页
    'columns'=>array(
...
与CDetailView不同的是,CDetailView的attributes中的每个字段的value值没有用引号包起来,而 CGridView的columns中字段的value值需要用引号包起来,并且 CDetailView使用字段的值时,直接使用$user,data的数据提供对象,而 CGridView中使用的是$data,这很好理解,我们知道dataProvider数据提供对象查询出来的是多条数据(最后调用dataProvider的getData()方法来获取数据集合),$data实际是是它遍历时的每一行数据的对象,加引号是因为在配置的时候$data并没有遍历,所以没有值,需要后面遍历的时候,使用eval函数执行字符串语句来获取它对应的值
 
我们还可以手动的指定 列名,比如我想把info改为'简介'
array(           
            'name'=>'简介',//可以使用name来指定列名
            'type'=>'raw',
            'value'=>'$data->user_info->info',
        ),
或者
        array( 
//            'name'=>'info',
            'header'=>'简介',//或者使用header来指定列名
            'type'=>'raw',
            'value'=>'$data->user_info->info',
        ),
 
在columns数组中,如果值没有指定class,默认的是调用CDataColumn类获取数据,我们看到最后一列'class'=>'CButtonColumn',
有执行一个类名,这就告诉我们,这一列的数据需要通过CButtonColumn这个类来获取了,尽管yii为我们自带了增删改三个操作,但是我们可能需要更多自定义的操作,如何实现咧
比如我需要添加一个日志查看功能:
CButtonColumn有一个template属性,每个按钮都用 花括号{}包起来,我们在delete的后面添加一个log按钮,按钮的显示位置是根据template的顺序来的,可以根据需要来更换按钮位置
然后在buttons属性数组里面添加一个以log为下标的数组,其中label表示文本标签,url是跳转的链接,imgUrl可以给按钮设置图片,options里面可以设置按钮的html属性,下文我们添加了一个onclick属性,visible控制是否显示按钮
array(
            'class'=>'CButtonColumn',
            'header'=>'操作',
            'template'=>'{view} {update} {delete} {log}',
            'buttons'=>array(
                'log'=>array(
                    'label'=>'日志',
                    'url'=>'Yii::app()->controller->createUrl("log",array("id"=>$data->id))',
//                    'imgUrl'=>'',//按钮图片地址
                    'options'=>array(
                        'onclick'=>'alert("确认要查看吗?");return false;',//添加点击事件
                    ),
                    'visible'=>'$data->isShow()',//权限控制
                ),
            ),
            'htmlOptions'=>array('style'=>'width:100px;')
        ),
在user模型中 我们定义了一个方法,isShow()

//是否显示日志功能
        public function isShow(){
            return $this->id % 2 == 0;
        }
此时在浏览器中输入 http://localhost/bootstrap/index.php/user/index,显示如下
除了CDataColumn和CButtonColumn,还有CCheckBoxColumn复选框列和CLinkColumn链接列
这里我们再介绍一下复选框列,有的时候我们需要对展示的列表进行批量的操作,这个时候我们就需要用到复选框列
在index.php视图中 columns里面添加一个配置,
'columns' = > array (
         array (
             'class' = > 'CCheckBoxColumn' ,
             'name' = > 'id' ,//取value值为id对应的值
            'id'=>'select',//取name为select数组
        ),
         'id' ,  
        ......
再次刷新可以看到(上图)在最左侧多了一个复选框,打开debug可以看到(下图),复选框的value值为id对应的值,复选框的name是一个select数组

转载于:https://my.oschina.net/lonxom/blog/168262

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值