Cakephp Override HtmlHelper :: ссылка - PullRequest
3 голосов
/ 10 апреля 2011

Я хочу настроить метод HtmlHelper :: link (), чтобы у массива опций по умолчанию был escape = false.

Как мне этого добиться, не меняя базовый класс?

OBS: я уже обработал ввод данных, поэтому думаю, с этим проблем не будет.

Заранее спасибо.

Ответы [ 7 ]

4 голосов
/ 02 февраля 2013

Cake 2.1.5

Я только что реализовал это, и я хотел бы отметить несколько вещей:

Ваш собственный HTML-помощник должен расширять HTML-помощник (и донне забудьте включить вспомогательный класс HTML)

App::uses('HtmlHelper', 'View/Helper');
class CustomHtmlHelper extends HtmlHelper {
   //yadda yadda
}

Кроме того, ваш вызов в AppController не должен включать слово Helper:

'Html'=> array('className' =>'CustomHtml'),
3 голосов
/ 26 октября 2012

В Cake 2.0

Создайте свой класс OwnHelper, содержащий метод ссылки, который расширяет HtmlHelper, в AppController укажите:

$helpers = array('Html' => array('className' => 'OwnHelper'));

через ADmad

2 голосов
/ 11 апреля 2011

Мне никогда не удобно переопределять методы выше в иерархии (то есть в AppHelper), потому что всегда есть хороший шанс сломать других зависимых помощников.

Надеемся, что скоро сможем комментировать, вместо того, чтобы давать наполовину глупые ответы!

Также актуально: я слышал, что CakePHP 2.0 позволит использовать псевдонимы помощников, компонентов и т. Д. Например, вы хотите изменить вывод из HtmlHelper, вы можете заменить его собственной версией, не изменяя все ваши шаблоны представления.

2 голосов
/ 10 апреля 2011

Почему бы вам не создать свой собственный вспомогательный помощник и создать метод, который возвращает ссылку HTMLHelper с установленными параметрами?

http://book.cakephp.org/view/102/Including-other-Helpers

class MyHelper extends AppHelper {
  var $helpers = array('html');

  function linkNoEscape($title, $url)
    $options = array(); //set custom options, e.g. no escape 

    return $this->Html->link($title, $url, $options);
  }
}
0 голосов
/ 03 апреля 2013

Еще одна хорошая практика, которую, как я думаю, следует реализовать CakePHP, которую вы также можете реализовать, - это простой Factory Pattern Helper. Следующее должно быть рассмотрено просто псевдо не реальный код.

$this->Factory->getHelper('Html')->link();

вместо

$this->Html->link();

возьмем, к примеру, следующее

class FactoryHelper extends  Helper {
    public function getHelper($name) {
        if(Configure::read('Overrides.{$name}')) {
            return $this->{Configure::read('Overrides.{$name}')};
        }
        return (isset($this->{$name})?$this->{$name}:false);
    }

}

//Bootstrap is where you will set all your overrides
Configure::write('Overrides',array(
    'Html'=>'NewHtml'
));

// теперь, когда вы хотите переопределить любого помощника, вы можете

Так что теперь в начальной загрузке вы установили переопределение Html Helper. На всем сайте будет вызываться ваш новый помощник NewHtml вместо традиционного помощника.

0 голосов
/ 11 апреля 2011

Вы можете скопировать оригинал HTMLHelper из cake/libs/view/helpers в app/views/helpers и изменить там метод link().

0 голосов
/ 10 апреля 2011

вы можете переписать любой вспомогательный метод из AppHelper, поэтому

class AppHelper extends Helper{
    function link($params, $go, $here){ ... code ...}
}
...