如何全局使CGridView使用“raw”作为CDataColumn的默认类型?

时间:2012-05-08 19:20:53

标签: php yii

Yii中是否存在全局设置以更改"©" to "©"的htmlentity显示 for admin(ajax grid)/ view / and edit views?

我发现在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

2 个答案:

答案 0 :(得分:4)

Yii没有内置这样的功能,但通常情况下你可以扩展几个类来实现目标。

首先,请注意this是您要更改其默认值的属性。如果你能做到这一点,那么所有的问题都会消失。

既然你不能,你需要扩展CDataColumn来实现这一目标。死简单:

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

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

现在的问题是你还需要告诉Yii使用你的特殊列类而不是内置的。您可以通过在type实例化中指定每列的CGridView来执行此操作,但这是不可接受的,因为您仍然需要编辑每个视图中的每个列。因此,我们必须研究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', ...);

您仍需要在使用数据网格的每个视图中进行此编辑,但使用find / replace时不应超过几秒钟。


¹实际上,你可以简单地转到框架源内的那个文件,编辑几个字符,保存,问题解决了。此方法的问题在于,如果升级到更高版本的Yii,您的应用程序将在没有警告的情况下恢复到旧行为。我不推荐它。

答案 1 :(得分:1)

查看Yii的widgetfactory设置。我不确定它是否会让你为CDataColumn指定选项,但这是你可以做到的,你可以

编辑:看起来你不能以这种方式覆盖CGridColumn设置,因为它不直接从widget类继承。所以你最好的选择可能是覆盖CGridView,为你的默认列指定一个自定义类,并设置公共变量type ='raw'。

您可以使用widgetfactory覆盖CGridView的默认类,但我还没有这样做。因此,您可能会被迫更新所有CGridView位置以使用新的CGridView类覆盖。