Yii CGridView 详解(关键看关联表字段排序部分)

这东西在后台比较有用,能加速开发的速度,值得一看

CGridView用表格的方式显示数据项

每一行代表一个数据项,一列通常代表数据项的一个属性

CGridView支持排序和分页,可以用ajax或普通的方式

CgridView必序和data provider一起使用

最简单的用法

$dataprovider = new CActiveDataProvider(‘Post’); 
$this->widget(‘zii.widgets.grid.CGridView’,array( 
    ‘dataProvider’=>$dataprovider, 
));

这会用表格的方式显示每一条数据项,每一列是Post的一个属性

在显示中带了分页和排序

我们可以自定义CgridView::columns属性,以自定义表格列的显示方式

这个cloumns如何配置呢?

其是一个数组,每一个数组元素对应着一列的配置,可以是字符串或数组

  1. 如果是字符串,格式是name:type:header 后两者是可选的,根据这三个值,创建一个CdataColumn实例
    其中type参见CFormatter
  2. 如果是数组,其可以实例化CDdataColumn、ClinkColumn,CButtonColumn,CCheckBoxColumn实例,具体实例化哪个
    由数组中的class指定,默认是CDataColumn
  • 如果class=>’CDataCloumn’

    则可以指定name或者value,如果指定以value优先

    用CDataColumn时如何以关联表的数据序列?

    代码如下:表示可以post关联的author中的username排序列

    	$dataprovider = new CActiveDataProvider(‘Post’,array( 
    	        ‘criteria’=>array( 
    		        ‘with’=>’author’, 
    		    ), 
    		    ‘sort’=>array(
    		        ‘attributes’=>array(
    		        ‘title’,'create_time’,
    		        ‘author_id’=>array(‘asc’=>’author.username asc’,'desc’=>’author.username desc’,’label’=>’作者’) 
    		    ) 
    		), 
    	)); 
    	$this->widget(‘zii.widgets.grid.CGridView’,array( 
    	    ‘dataProvider’=>$dataprovider, 
    	    ‘columns’=>array( 
    	        ‘title’, 
    	        ‘create_time’, 
    	        array(‘name’=>’author_id’,'value’=>’$data->author->username’), 
    	    ), 
    	));
    

    另外CDataColumn还有一个filter属性,如果是空,那么生成一个textfield,如果是数组(键值),则生成一个dropDownlist在当前列的上部,供搜索

  • 如果class=>”CLinkColumn”

       array(‘class’=>’CLinkColumn’,'label’=>’查看用户’,'url’=>Yii::app()->createURL(‘user/edit’)) 
    

    则生成一个连接

  • 如果class=”CCheckBoxColumn”

       array(‘class’=>’CCheckBoxColumn’,'name’=>’title’,'id’=>’select’), 
    

    可以生成一个checkbox供选择,且只能选一个

    可以配置CGridView::selectableRows 如果是0,则不能选,如果 1,只选一个如果是2或其它值,则可以选多个

    代码如下:

       $this->widget(‘zii.widgets.grid.CGridView’,array( 
           ‘dataProvider’=>$dataprovider, 
           ‘selectableRows’=>2, 
           ‘columns’=>array( 
               array(‘class’=>’CCheckBoxColumn’,'name’=>’title’,'id’=>’select’), 
           ),
       ));
    
  • 如果class=”CButtonColumn”

      array( 
          ‘class’=>’CButtonColumn’, 
          ‘updateButtonUrl’=>’Yii::app()->createUrl(“post/edit”,array(“id”=>$data->id));’, 
      ),
    

    修改updateButtonUrl为编辑贴子

如何用gridview生成一个代搜索的管理列表

  1. 在Model的rules 设定可以搜索的属性

     array(‘title, status, create_time’, ‘safe’, ‘on’=>’search’), 
    
  2. 在Model中,添加搜索时的方法
    public function search()
    {
    $criteria=new CDbCriteria;
    $criteria->compare(‘title’,$this->title,true);
    $criteria->compare(‘status’,$this->status);
    $criteria->compare(‘create_time’,$this->create_time);

         return new CActiveDataProvider(‘Post’, array( 
                 ‘criteria’=>$criteria, 
                 ‘sort’=>array( 
                     ‘defaultOrder’=>’status, update_time DESC’, 
                 ), 
         )); 
     }
    
  3. 在Controler中,写接受搜索用到的表单的值的方法

     public function actionAdmin() 
     { 
         $model=new Post(‘search’); 
         if(isset($_GET['Post'])) 
             $model->attributes=$_GET['Post']; 
         $this->render(‘admin’,array( 
             ‘model’=>$model, 
         )); 
     }
    
  4. 在view中用CGridView显示
    设置好

     <?php $this->widget(‘zii.widgets.grid.CGridView’, array( 
     ‘dataProvider’=>$model->search(), 
     ‘filter’=>$model, 
     ‘columns’=>array( 
     ), 
     )); ?>
    

以上代码大部分是yii自动生成的,只要做少量修改即可

有时候会出现,搜索后页面为空的清况,原因可能是layout/main.php中

echo $content外层无div,就是说main.php中必须有一个div包含$content

参考:http://stevecj.iteye.com/blog/1054951

若您觉得我的博文对您有帮助,欢迎点击下方按钮对我打赏
打赏