使用Html帮助器在cakephp中生成链接

时间:2015-02-16 16:35:56

标签: html cakephp cakephp-2.3

我正在尝试使用Html帮助器在我的控制器中创建一个链接,但我得到了以下错误,尽管我已经添加了必要的帮助器:

  

在非对象

上调用成员函数link()
 public $helpers = array('Html', 'Form');

   $url = $this->Html->link(
                            '',
                            'http://www.example.com/',
                            ['class' => 'button', 'target' => '_blank']
                        );

3 个答案:

答案 0 :(得分:3)

您可以在视图文件中使用Helpers,但不能在控制器内部使用 http://book.cakephp.org/2.0/en/views/helpers.html#using-helpers

例如,在 index.ctp

echo $this->Html->link(
    __('My link'), 
    'http://www.example.com/', 
     array('class' => 'button', 'target' => '_blank')
);

在Controller中启用Html Helper与代码中的相同。

class ExamplesController extends AppController {
    $helpers = array('Html', 'Form');

    public function index() {
       //
    }
}

答案 1 :(得分:0)

这是一个很好的问题。我认为你对MVC和设计模式提供的关注点分离有点困惑。再看看CakePHP如何实现MVC:http://book.cakephp.org/2.0/en/cakephp-overview/understanding-model-view-controller.html

要记住的重要一点是,您的控制器永远不应该关注创建anchor标签。这是你的观点的工作。因为帮助者是一种保持观点的方式DRY(不要重复自己)有一个唯一的责任就是创建HTML元素真的很方便。视图依赖于控制器来确定设置了哪些变量,它们的值是什么,以及加载了哪些帮助程序。有关帮助程序以及控制器组件和模型行为的更多信息,请查看http://book.cakephp.org/2.0/en/getting-started/cakephp-structure.html及其各个文档页面:

现在您已经对MVC有了更好的了解,让我们来看看您的具体问题。您想在控制器中创建链接。我认为它可能是动态的,取决于其他一些变量,所以我将推动它。

您可以解决的一个常见问题是,您希望根据用户是否已登录来显示登录/注销链接。

app / Controller / ExampleController.php

class ExampleController extends AppController {
    public $components = array('Auth');

    public $helpers = array('Html', 'Form');

    public function beforeRender() {
       parent::beforeRender();
       //if Auth::user() returns `null` the user is not logged in.
       if ($this->Auth->user() != null) {
           $logInOutText = 'Log out';
           $logInOutUrl = array('controller' => 'users', 'action' => 'login');
       } else {
           $logInOutText = 'Log in';
           $logInOutUrl = array('controller' => 'users', 'action' => 'logout');
       }
       $this->set(compact('logInOutText', 'logInOutUrl'));
    }
}

您可以在视图中看到简单的内容。在这种情况下,我选择默认布局,因为我想要每个呈现页面中的链接。 应用/视图/布局/ default.thtml中

<!-- More HTML above -->
<?php
// "Html" in `$this->Html` refers to our HtmlHelper. Note that in a view file
// like a `.ctp`, `$this` referes to the View object, while above in the
// controller `$this` refers to the Controller object. In the case
// `$this->Html`, "Html" would refer to a component. The same goes for Models
// and behaviors.
echo $this->Html->link($logInOutText, $logInOutUrl); // Easy!
?>
<!-- More HTML below -->

我希望这会有所帮助。我知道一次放在一起很多。

答案 2 :(得分:0)

虽然这不是好习惯。但是,如果您需要,仍然可以在控制器中使用以下代码

App::uses('HtmlHelper', 'View/Helper');
        $yourTmpHtmlHelper = new HtmlHelper(new View());
        $url=$yourTmpHtmlHelper->link(
                            '',
                            'http://www.example.com/',
                            ['class' => 'button', 'target' => '_blank']
                        );

这适用于cakephp 2。*

由于