【问题标题】:Outputting a hyperlink from a controller in cakePHP从 cakePHP 中的控制器输出超链接
【发布时间】:2010-09-28 00:34:14
【问题描述】:

我刚刚开始使用 cakePHP,目前进展并不顺利。

我有一个控制器来处理确认用户电子邮件。注册时,用户会收到一封电子邮件,其中包含一个链接中的确认代码。根据他们给出的确认代码,控制器会给出不同的文本响应。其中一个响应包含用于登录的超链接。

我正在尝试使用 Html 帮助程序,但尽管我已将其加载到类顶部的 $helpers 中,但我只有在使用 App::import 并实例化它时才能使其工作。

简单地创建一个超链接似乎有点过头了!同一个类需要加载多少次?

无论我在网络上的哪个位置查看,它总是告诉我在控制器中使用帮助程序是个坏主意,但我应该如何获得链接?

所以我有

var $helpers = array('Html');

在控制器的顶部,并且:

if (isset($this->User->id)) { // Check the user's entered it right
  // Do some stuff to remember the user has confirmed
  // This is to load the html helper - supposedly bad form, but how else do I make the link?
  App::import('Helper', 'Html');
  $html = new HtmlHelper();
  $this->set('message', __("Your email address has been confirmed.", TRUE)." ".$html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login" )));
} else {
  $this->set('message', __("Please check your mail for the correct URL to confirm your account", TRUE));
}

在控制器的确认方法中和

<div>
   <?php echo $message;?>
</div>

在视图中输出结果消息

我肯定在某个地方出错了 - 谁能解释一下是怎么回事?

【问题讨论】:

    标签: cakephp controller


    【解决方案1】:

    您不应该在 Controller 中使用 Helpers。正如@Lincoln 指出的那样,您应该在视图中构建链接。您可以在控制器中构造 URL,因为 URL 基本上是数据,但链接是 URL 的非常特定于媒体 (HTML) 的实现。

    无论哪种方式,如果您想通过电子邮件发送它,您需要创建一个完整 URL(包括主机)。最通用的方式是使用Router::url

    $fullUrl = Router::url(array('controller' => ...), true); // 'true' for full URL
    

    在控制器或视图中执行此操作。要创建链接,请在视图中使用:

    echo $html->link('Title', $fullUrl);
    

    【讨论】:

      【解决方案2】:

      这个想法是,你需要渲染页面的所有数据都通过 set 发送到视图,然后任何条件逻辑或格式化都在视图中使用助手完成,所以在适当的时候发送整个查询结果(假设你需要更改链接以包含用户的屏幕名称,您会很方便)。

      在控制器动作中

      $this->set('user', $this->User);
      

      在视图中(这取决于您是

      if ($user->id) //available because of Controller->set
      {
          //1.2
          $link = $html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login" ));
          //1.3
          $link = $this->Html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login" ));
          echo __("Your email address has been confirmed.", TRUE)." $link";
      }
      else
      {
          $this->set('message', __("Please check your mail for the correct URL to confirm your account", TRUE));
      }
      

      【讨论】:

      • 啊,好的!这更有意义。这是将完整的用户数据传递给我没有得到的视图的想法。我认为这种观点更加“愚蠢”。感谢您提供清晰的插图。
      • 我认为 $this->User 是查询结果而不是模型。你的权利,你应该这样做 $user = $this->User->find() 然后 $this->set('user', $user) ,所以 user 将是视图中的结果数组。
      • 是的,我理解它是数据,而不是模型 - 传递模型可能会发生各种讨厌的循环引用,对吧? (更不用说打破 MVC)
      【解决方案3】:

      您尝试做的事情应该使用 SessionComponent 来完成。 $this->Session->setFlash('你的留言');

      并在你的布局中使用会话助手放入 $this->Session->flash();

      关于你在控制器中想要的 url,Router::url 是正确的,正如 deceze 所说,但在那里没有用,因为你不应该在控制器中构建 html。

      你想做什么使用上面的 session::setFlash() 方法,然后使用重定向它们

      $this->redirect(array('controller' => "users", 'action' => "login" ));

      【讨论】:

      • 感谢您的指点——但在这种情况下,闪存是不够的,因为要填充的不仅仅是一个“div”——我只是为了示例而删减了代码。无论哪种方式,让视图处理显示逻辑对我来说更有意义,而且我已经让代码工作了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多