Yii CGridView如何访问每列的id

时间:2012-02-27 22:09:44

标签: php yii

我正在使用带有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并将其传递给函数。

2 个答案:

答案 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;
}