2

Yii 中是否有全局设置来更改 htmlentity 显示从"©" to "©" admin(ajax grid)/view/ 和编辑视图?

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

2 回答 2

4

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

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

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

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

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

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

Grepping 一点表明是您需要修改的代码。具体来说,有两条感兴趣的线:

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

于 2012-05-09T09:34:05.527 回答
1

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

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

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

于 2012-05-09T04:14:56.117 回答