2010-09-28 19 views
5

我刚刚开始使用cakePHP,并且目前情况并不如此顺利。从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> 
在视图中输出

所得消息

当然我会在某个地方出错 - 任何人都可以解释一下吗?

回答

3

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

在控制器动作

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

鉴于(这是稍有不同,这取决于你是否在< = 1.2或1.3

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)); 
} 

+0

Aaah,好的!这更有意义。这是将全部用户数据传递给我没有得到的观点的想法。我认为这个看法更加“愚蠢”。感谢您的清晰插图。 – Hippyjim 2010-09-28 07:09:39

+0

我认为$ this-> User是查询结果而不是模型。你的权利,你应该做$ user = $ this-> User-> find()然后$ this-> set('user',$ user),因此用户将是视图中的结果数组。 – 2010-09-29 06:57:31

+0

是的,我理解它是数据,而不是模型 - 通过模型可能会冒各种令人讨厌的循环引用的风险,对吧? (更不用说打破MVC) – Hippyjim 2010-09-30 12:40:22

15

你不应该使用在助手正如@Lincoln所指出的,你应该在视图中构建链接,你可以在Controller中构造URL,因为URL i基本上是数据,但链接是一个非常特定于媒体(HTML)的URL实现。

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

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

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

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

你要做的事情应该用SessionComponent完成。$ this-> Session-> setFlash('your message here');

并在布局中用会话帮助器放置$ this-> Session-> flash();

关于你想在控制器中的URL,路由器:: url是正确的,因为deceze说,但没有用,因为你不应该在控制器中构建HTML。

你想这样做,使用会话:: setFlash()方法上面,然后重定向他们使用

$这个 - >重定向(阵列(“控制器” =>“用户”,“动作”什么= >“login”));

+0

感谢指针 - 但在这种情况下,闪光是不够的,因为不仅仅是一个单独的“div”填充 - 我只是有点削减代码的例子。无论哪种方式,让视图处理显示逻辑对我来说更有意义,并且我已经获得了代码的工作。 – Hippyjim 2010-09-30 12:38:32