使用自定义列时,订单按钮不适用于CGridView - yii

时间:2014-07-14 15:14:06

标签: php yii cgridview

我最近使用yii的get方法为我的CGridView添加了一个自定义列来创建虚拟属性。我创建的虚拟属性看起来像这样,并按预期工作。

public function getNumIndv()
    {
        // gets the id of the current list 
        $list_id = $this->id;
        // returns the number of recipients with that list id
        return $count = Recipient::model()->count(array("condition"=>"list_id = $list_id"));

    }

从我的GridView中我添加了自定义列" numindv"像这样

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'paylist-grid',
    'dataProvider'=>$dataProvider,
    'filter'=>$model,
    'columns'=>array(
        'name',
        'numindv',
        'balance',
        'due_date',

        /*
        'status',
        */
        array(
            'class'=>'CButtonColumn',
            'template'=>'{Manage}',
            'buttons'=>array
            (
                'Manage' => array
                (
                    'label'=>'Manage',
                    'url'=>'Yii::app()->createUrl("recipient/index", array("id"=>$data->id))',
                ),

            )
        ),
    ),
)); ?>

这按预期工作 - 差不多。当用户查看表单时,他们会看到三列&#34;名称,余额和截止日期&#34;不亮了。同样,如果你点击它们,它们会点亮并进行分类。 但是对于numindv,该列会自动点亮并且允许个人点击它以更改顺序。我在这里缺少一些简单的东西吗?为什么我的网格视图对待我的虚拟列与其他列不同?

1 个答案:

答案 0 :(得分:1)

您无法通过自定义列在CActiveDataProvider中进行排序。

您可以使用以下方法建立numindv列标题链接:

$sort = new CSort();
$sort->attributes = array(
   'numindv' => 'numindv',
   '*' // all other columns
);

$dataProvider->sort = $sort;

但是你仍然没有得到想要的结果,因为当你点击这个排序链接时,它的名字将被添加到SQL查询中:

SELECT * FROM `recipient` `t` ORDER BY `t`.`numindv`...

但您的表格不是列numindv

我建议你使用CArrayDataProvider

<强> UPD:

您可以为此排序设置sql规则:

$sort->attributes = array(
    'numindv' => array(
       'asc'=>"numindv asc",
       'desc'=>"numindv desc",
    ),
    '*' // all other columns
);

Recipient::search()方法中,您应该添加以下行:

$criteria->select .= ', (/*any SQL request to retrieve the numindv value*/) as numindv';