Переопределить CHtml::encode

Хотелось бы переопределить CHtml::encode.

Единственное, что приходит в голову — переименовать CHtml в COldHtml и уже от него наследовать CHtml с новым методом encode. Такой вариант мне не нравится, так как требует изменение кода фреймворка.

Существуют ли какие-нибудь варианты сделать это без изменения кода фреймворка?

PS: Я попробовал сделать это по мотивам http://www.yiiframework.com/doc/guide/1.1/en/basics.namespace#using-class-map

Написал в index.php что-то вроде:


Yii::$classMap=array(

    'CHtml'=>$webRoot.'/protected/components/helpers/CHtml.php',

);

$app = Yii::createWebApplication($webConf)->run();

CHtml::mymethod();



Однако фреймворк все равно использует свою версию CHtml судя по:


Fatal error: Call to undefined method CHtml::mymethod() in /my/path/index.php on line 28

Возможно такая логика и задумывалась, чётко в «гиде» этот вопрос не описан.




class EHtml extends CHtml

{


  public static function encode()

  {

    // ваша ф-ия

  }


}




может так? что мешает использовать свой класс то?

Так не очень удобно, придется переопределять почти всё из «system.zii.widgets.*», там где-то напрямую, где-то опосредовано, например через <CFormatter>Yii::app()->format->formatText(), используется CHtml::encode().

Не то чтобы слишком много определений получается, просто у меня не возникает уверенности, что везде будет вызван мой EHtml.

Решил добавить в начало index.php строку вида:


include($webRoot.'/protected/components/injection/CHtml.php'); 

Альтернативный вариант:

  • создание EHtml

  • переопределение Yii::app()->format

  • правка или переопределение «system.zii.widgets.*»

  • правка или переопределение «шаблонов gii»

  • правка или переопределение системных представлений (ошибки, логи, профайлер)

слишком обширен. Оставлю его до лучших времен.

Боюсь спросить, а зачем переопределять CHtml::encode ?

Необходимо (помимо вызова htmlspecialchars) экранировать дополнительные символы — «{» и «}». Возможно, на самом деле, копаю в неправильном направлении, буду признателен если посоветуете альтернативное направление раскопок.

В принципе есть еще один вариант, не знаю лучше он или хуже, но суть в следующем: вариант с $classMap не работает потому, что yii сначала проверяет приватный массив $_coreClasses, а потом уже $classMap.

Сам массив определен в YiiBase.php и, в принципе, не сложно использовать свой YiiBase.php вместо оригинального.

Порядок подключения файлов в данном случае: index.php -> yii.php -> YiiBase.php.

Файл yii.php практически ничего, кроме подключения YiiBase не делает, т.е. можно сделать: index.php -> myyii.php -> MyYiiBase.php.

И уже в MyYiiBase.php можно будет прописать свои пути к core классам.