2012-05-08 20 views
2

Yii中是否存在全局設置,以便爲admin(ajax網格)/ view /和edit視圖更改"©" to "©" 的htmlentity顯示?如何全局使CGridView使用「raw」作爲CDataColumn的默認類型?

我發現在CGridView參數中,我可以像下面那樣更新每列到'type'=>'raw',但我需要在20個模型中進行此操作,並且每個視圖都要手動進行,除非我可以在全局某處執行此操作。我有一個腳本,用於導入©的數據,當客戶去編輯項目時,他們希望看到©。任何幫助都很有幫助!

<?php $this->widget('zii.widgets.grid.CGridView', array(

     'id'=>'item-grid', 
     'dataProvider'=>$model->search(), 
     'filter'=>$model, 

     'columns'=>array(
       'id', 
       'price1', 
       'price1label', 
       'price2', 
       'price2label', 
       array('name'=>'name','type'=>'raw'), // this will display the raw entity 

回答

4

Yii沒有內置這樣的功能,但通常情況下,您可以擴展幾個類來實現目標。

首先,請注意this是您希望更改其默認值的屬性。如果你能做到這一點,那麼所有的問題都會消失。

既然你不能,你需要擴展CDataColumn來實現這一點。死的簡單:

Yii::import('zii.widgets.grid.CDataColumn'); 

class SpecialDataColumn extends CDataColumn { 
    public $type = 'raw'; // that's all! 
} 

現在的問題是,你還需要告訴Yii的,而不是使用內置的特殊列類。您可以通過在CGridView實例化中指定每個列的type來做到這一點,但這是不可接受的,因爲您仍然需要編輯每個視圖中的每一列。所以我們必須考慮如何CGridView決定使用CDataColumn並覆蓋它。

略微有點顯示this是您需要修改的代碼。具體來說,有興趣的兩行:

$column=$this->createDataColumn($column); 

$column['class']='CDataColumn'; 

所以,你需要重寫createDataColumn法(修改第一線做什麼)和initColumns方法(編輯第二行)。在這裏,我們去:

Yii::import('zii.widgets.grid.CGridView'); 

class SpecialGridView extends CGridView { 
    protected function initColumns() { 
     // copy all of the stock implementation code, changing only 
     // $column['class']='CDataColumn' to $column['class']='SpecialDataColumn' 
    } 

    protected function createDataColumn($text) 
    { 
     // copy all of the stock implementation code, changing only 
     // $column=new CDataColumn($this) to $column=new SpecialDataColumn($this) 
    } 
} 

此步驟完成後,你只是多了一個編輯遠離幸福:

this->widget('SpecialGridView', ...); 

你仍然需要讓這個編輯在使用數據網格中的每個觀點,但這應該不會超過幾秒鐘的查找/替換。


¹實際上,你可以簡單去的框架內源該文件,修改幾個字符,保存,問題就迎刃而解了。這種方法的問題是,如果升級到更高版本的Yii,您的應用程序將在沒有警告的情況下恢復到舊的行爲。我不推薦它。

+0

很好的答案!謝謝! – Fostah

+0

如何以及在哪裏存儲文件?在擴展名和使用文件夾名稱空間或只是一個文件? – Andre

1

查找到的Yii的widgetfactory設置。我不確定它是否會讓你指定CDataColumn的選項,但這是你可以做到的地方,你可以

編輯:看起來像你不能重寫CGridColumn設置,就像它不直接從窗口小部件類繼承。所以你最好的選擇可能是覆蓋CGridView,爲你的默認列指定一個自定義類,並以這種方式設置公共變量type ='raw'。

您可能可以使用widgetfactory重寫CGridView的默認類,但我沒有這樣做。所以你可能會被迫更新所有的CGridView位置來使用你的新的CGridView類覆蓋。

相關問題