我最近使用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,该列会自动点亮并且不允许个人点击它以更改顺序。我在这里缺少一些简单的东西吗?为什么我的网格视图对待我的虚拟列与其他列不同?
答案 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';