我正在使用带有CActiveDataProvider的CGridView。一切正常但是现在我需要根据行的ID显示自定义按钮。
我可以添加按钮并使其工作,但我无法根据行ID自定义图像。 我可以从示例中看到,在创建url时,我可以通过调用$ data-> id来访问行的id,但是当我尝试为imageURL执行此操作时,它不起作用。我的代码如下:
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'name',
'desc',
'created',
array(
'class'=>'CButtonColumn',
'header'=>'Active State',
'template'=>'{rank}',
'buttons'=>array(
'rank'=>array(
'label'=>'Rank',
'imageUrl'=>$this->getRank($data->id),
'url'=>'Yii::app()->createUrl("users/updateRank", array("id"=>$data->id))',
'options'=>array(
'ajax'=>array(
'type'=>'POST',
'url'=>"js:$(this).attr('href')",
),
),
),
),
),
),
));
图像URL调用我的控制器中的一个函数,该函数返回图像的URL。但是,我无法传递当前记录用户点击的ID,我总是得到默认图像。 如果我使用$ data-> id,我会收到数据不存在的错误。 如果我使用$ this-> id它指的是控制器,我得到控制器ID。无论如何,我可以得到行的id并将其传递给函数。
答案 0 :(得分:2)
似乎你缺少单引号:
'imageUrl'=>'$this->getRank($data->id)',
是向前迈出的一步(可能你需要做更多的事情来让你的自定义功能以这种方式工作)
在CGridView中,你想为每一行独立运行的任何php代码都必须在引号中 - 如果你使用'naked'php,它只会计算一次,然后每行的值都相同。 / p>
答案 1 :(得分:2)
请参阅上面的评论。通过CButtonColumn我无法做到的事情。 相反,我现在使用CDataColumn。
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'name',
'desc',
'created',
array(
'class'=>'CDataColumn',
'header'=>'Active State',
'type'=>'raw',
'value'=>'getStatus("$data->id")',
),
),
));
getStatus返回此列的内容,其中包含一个链接(ajaxLink),第一个参数作为图像。
function getStatus($id)
{
$imagePath="";
......... do your check and figure out the image you want to use
$content ="<div align='middle'>".CHtml::ajaxLink(CHtml::image($imagePath,'Rank', array('title'=>'Rank')),CHtml::normalizeUrl(array('user/rank', 'id'=>$id)), array('type'=>'POST'))."</div>";
return $content;
}