2012-02-27 47 views
0

我正在使用CGctiveView和CActiveDataProvider。一切工作正常,但現在我需要顯示一個自定義按鈕取決於行的ID。Yii 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

看來你錯過了單引號:

'imageUrl'=>'$this->getRank($data->id)', 

是向前邁進了一步(可能需要做更多的事情,讓您的自定義函數的工作這種方式)

在CGridView,任何PHP你想爲每一行獨立運行的代碼必須用引號括起來 - 如果你使用'裸'php,它將只計算一次,然後每行的值將相同。

+0

如果我添加引號IMAGEURL簡直變成「$這個 - > getRank($數據 - > ID)」但是,如果我離開他們出了功能不被調用,但我不;知道如何傳遞變量。我關於報價採取你的觀點,但它不起作用。 – Orlymee 2012-02-28 00:07:58

+0

好的,對不起 - 現在我看到它在「按鈕」數組內。該手冊說,必須有一個圖像的URL(不是PHP表達式),所以看起來,這是不可能的CButtonColumn這樣的方式,例如不能有不同的圖像爲同一個按鈕(除非你寫一個擴展名'糾正'它)。 http://www.yiiframework.com/doc/api/1.1/CButtonColumn#buttons-detail – zuups 2012-02-28 01:22:25

+0

謝謝kraabus,我再次通過文檔,你是對的,它被設置爲字符串而不是php表達式。因此,我使用了一個CDataColumn,它的值屬性調用了我的函數,它將完整的內容返回到列,即具有正確鏈接的圖像。謝謝。明天將發佈完整的解決方案。 – Orlymee 2012-02-28 02:09:17

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