代码之家  ›  专栏  ›  技术社区  ›  Hippyjim

在cakephp中从控制器输出超链接

  •  5
  • Hippyjim  · 技术社区  · 15 年前

    我刚开始学习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 回复  |  直到 15 年前
        1
  •  3
  •   Lincoln B    15 年前

    其思想是将呈现页面所需的所有数据以set形式发送到视图,然后使用助手在视图中完成任何条件逻辑或格式设置,因此在适当的时候发送整个查询结果(假设您需要更改链接以包含用户的屏幕名称,您可以使用它)。

    控制器动作

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

    在视图中(这与您的In<=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));
    }
    

        2
  •  15
  •   deceze    15 年前

    你不应该在控制器中使用助手。正如@Lincoln所指出的,您应该在视图中构建链接。你可以建造 统一资源定位地址 在控制器中,由于URL基本上是数据,但链接是URL的一种非常介质特定(HTML)实现。

    不管怎样,您都需要创建一个 满的 URL(包括主机),如果您想通过电子邮件发送它。最普遍的方法是使用 Router::url :

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

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

    echo $html->link('Title', $fullUrl);
    
        3
  •  0
  •   dogmatic69 ornoone    15 年前

    您正在尝试的操作应该使用sessioncomponent完成。$this->会话->setflash(“此处显示您的消息”);

    在您的会话助手布局中放入$this->session->flash();

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

    您要做的是使用上面的session::setflash()方法,然后使用

    $this->重定向(array('controller'=>“用户”,'action'=>“登录”);