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


How to globally make CGridView use "raw" as the default type of CDataColumn?

Yii 中是否有全局设置来更改 htmlentity 显示"©" to "©"对于管理员(ajax 网格(/视图/和编辑视图?

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

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

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

由于您不能,因此您需要扩展CDataColumn才能实现此目的。死得很简单:

Yii::import('zii.widgets.grid.CDataColumn');
class SpecialDataColumn extends CDataColumn {
    public $type = 'raw'; // that's all!
}

现在的问题是你还需要告诉 Yii 使用你的特殊列类而不是内置的。您可以通过在CGridView实例化中指定每列的type来执行此操作,但这是不可接受的,因为您仍然需要编辑每个视图中的每一列。因此,我们必须研究CGridView如何决定使用CDataColumn并覆盖它。

稍微嘎嘎嘎�具体来说,有两条兴趣线:

$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,你的应用程序将在没有警告的情况下恢复到旧的行为。我不推荐它。

查看 Yii 的小部件工厂设置。我不确定它是否可以让您指定 CDataColumn 的选项,但这是您可以做到的地方

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

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