Php 使用自定义类扩展Yii框架CHtml帮助器类

Php 使用自定义类扩展Yii框架CHtml帮助器类,php,mysql,utf-8,yii,encode,Php,Mysql,Utf 8,Yii,Encode,我必须将用户输入的数据编码到utf-8中,特别是如果是数字编码, 所以我决定使用以下代码段进行编码,然后将其存储到数据库中 $convmap = array ( 0x80, 0xffff, 0, 0xffff ); $str = htmlentities ( mb_encode_numericentity( $str, $convmap, 'UTF-8' ),ENT_QUOTES,"UTF-8",false ); $convmap=array(0x80,0xffff,0,0xffff); $st

我必须将用户输入的数据编码到utf-8中,特别是如果是数字编码, 所以我决定使用以下代码段进行编码,然后将其存储到数据库中

$convmap = array ( 0x80, 0xffff, 0, 0xffff ); $str = htmlentities ( mb_encode_numericentity( $str, $convmap, 'UTF-8' ),ENT_QUOTES,"UTF-8",false ); $convmap=array(0x80,0xffff,0,0xffff); $str=htmlentities(mb_encode_numericentity($str,$convmap,'UTF-8'),ENT_引号,“UTF-8”,false); 但是Yii default encode只使用CHtml::encode(),它只使用htmlspecialchars()函数

所以我决定扩展CHtml类来覆盖encode函数,但我不知道如何在Yii中实现它。。
建议一种扩展Yii helper类的好方法…

您不能完全做到这一点,该类与框架紧密集成。(即用于小部件、活动表单等)


你能做的一件事是。。。扩展它,创建类,并在整个应用程序中使用它。在将模型数据发送到视图/小部件之前对其进行预处理。

您始终可以在
/framework/web/helpers/CHtml.php
中编辑CHtml类本身,为encode方法添加一个额外的参数?比如,

public static function encode($text,$extraEncode=false)
{
    if($extraEncode===true)
    {
        $convmap = array ( 0x80, 0xffff, 0, 0xffff );
        return htmlentities ( mb_encode_numericentity( $text, $convmap, 'UTF-8' ),ENT_QUOTES,"UTF-8",false );
    } else {
        return htmlspecialchars($text,ENT_QUOTES,Yii::app()->charset);
    }
}
obv,根据口味编辑


然后您可以像
CHtml::encode($myString,true)

CHtml是静态类,包含所有静态方法,您不能扩展它。更好地用作黑盒(复合),但yii仍然使用
CHtml
,而不是your我希望在yii,bec中为核心助手提供类似Kohana的扩展功能。CHtml与Yii core紧密耦合,用于编码,同时将数据保存到数据库,或从数据库查询。它似乎在编辑Yii core系统,但我不想编辑Yii core,给出一个不涉及Yii core系统的解决方案。我从中得到了一个提示:您不能扩展一个类来包含一个encode函数来覆盖CHtml方法,就像您可以覆盖许多控制器/模型方法一样(例如,
$this->beforeSave()
),CHtml encode函数经常被静态调用,这意味着您必须对核心文件进行编辑,如果这样做不会影响方法的原始使用,我看不出有什么问题,但是如果您反对这种方式,您可以始终创建自己的编码方法,完全独立地调用您的方法(
MyClass::encode($myText)
而不是CHtml方法(
CHtml::encode($myText)
)?刚刚发现这一点,这是一种解决方法……目前,希望他们将来能够扩展yii以获得更好的解决方案: