【问题标题】:Cakephp Override HtmlHelper::linkCakephp 覆盖 HtmlHelper::link
【发布时间】:2011-04-10 18:40:16
【问题描述】:

我想设置 HtmlHelper::link() 方法,所以默认选项数组有 escape = false。

如何在不改变核心类的情况下实现这一点?

OBS:我已经清理了表单输入,所以我想这不会有问题。

提前致谢。

【问题讨论】:

    标签: php cakephp cakephp-1.3 html-helper


    【解决方案1】:

    蛋糕 2.1.5

    我刚刚实现了这个,我想指出几点:

    您的自定义 html 帮助器应该扩展 HTML 帮助器(并且不要忘记包含 HTML 帮助器类)

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

    此外,您在 AppController 中的调用不应包含 Helper 一词:

    'Html'=> array('className' =>'CustomHtml'),
    

    【讨论】:

      【解决方案2】:

      在 Cake 2.0 中

      创建包含链接方法的 OwnHelper 类,该方法扩展 HtmlHelper,在 AppController 中指定:

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

      通过 ADmad

      【讨论】:

      • 请注意,className 选项不应包含“Helper”,Cake 会自动附加。
      【解决方案3】:

      您为什么不创建自己的自定义助手并创建一个方法来返回带有选项集的 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);
        }
      }
      

      【讨论】:

      • 问题是我必须改变整个系统。不仅仅是在链接上添加选项。
      • @dhofstet 的解决方案可能对您有用。但是,如果您对现有链接代码的每个实例进行查找和替换,这可能不会太耗时。
      【解决方案4】:

      我从不习惯覆盖层次结构中较高的方法(即在 AppHelper 中),因为您总是很有可能破坏其他依赖的助手。

      希望能够尽快发表评论,而不是给出垃圾一半的答案!

      同样相关:我听说 CakePHP 2.0 将允许助手、组件等使​​用别名。例如,您想更改 HtmlHelper 的输出,您可以将其替换为您自己的版本,而无需更改所有视图模板。

      【讨论】:

      • 哇,感谢您指出 2.0 中的别名功能——它或多或少地解决了这个问题和其他类似问题。仅供参考,控制器中的别名助手在 Cookbook → Helpers 中演示。
      【解决方案5】:

      您可以将原来的HTMLHelpercake/libs/view/helpers 复制到app/views/helpers 并在那里修改link() 方法。

      【讨论】:

      • 您应该将原始文件留在cake 文件夹中,否则更新会很麻烦。
      • 是的,这是这种方法的缺点。
      【解决方案6】:

      我认为 cakephp 应该实现的另一个你也可以实现的好实践是一个简单的工厂模式助手。以下应考虑只是伪代码而不是真实代码。

      $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”帮助程序,而不是传统的帮助程序。

      【讨论】:

        【解决方案7】:

        你可以从 AppHelper 覆盖任何辅助方法,所以

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

        【讨论】:

        • 似乎没有意义,因为 HtmlHelper 扩展了 AppHelper 并定义了自己的 link 方法,不是吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-04
        • 2017-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多