Вывод гиперссылки из контроллера в cakePHP - PullRequest
5 голосов
/ 28 сентября 2010

Я только начинаю работать с 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 голосов
/ 28 сентября 2010

Вы не должны использовать помощники в контроллере. Как указывал @Lincoln, вы должны создать ссылку в представлении. Вы можете создать URL в Контроллере, поскольку URL-адрес - это в основном данные, но ссылка представляет собой очень специфичную (HTML) реализацию URL-адреса.

В любом случае, вам нужно создать полный URL (включая хост), если вы хотите отправить его по электронной почте. Наиболее универсальным способом является использование Router::url:

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

Сделайте это либо в Controller, либо в View. Для создания ссылки используйте это в представлении:

echo $html->link('Title', $fullUrl);
3 голосов
/ 28 сентября 2010

Идея состоит в том, что все данные, необходимые для визуализации страницы, отправляются в представление с помощью set, затем любая условная логика или форматирование выполняется в представлении с помощью помощников, поэтому при необходимости отправляйте целые результаты запроса (предположим, что вам нужноизмените ссылку, включив в нее отображаемое имя пользователя, оно будет у вас под рукой).

в действии контроллера

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

в поле зрения (это немного отличается в зависимости от того, есть ли у вас <=1,2 или 1,3 </p>

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 голосов
/ 28 сентября 2010

То, что вы пытаетесь сделать, должно быть сделано с SessionComponent. $ this-> Session-> setFlash ('ваше сообщение здесь');

и в вашем макете с помощником сеанса установите $ this-> Session-> flash ();

Что касается ваших желаемых URL-адресов в контроллере, Router :: url является правильным, как сказал deceze, но в этом нет никакого смысла, так как вам не нужно создавать html в контроллере.

что вы хотите сделать, это использовать метод session :: setFlash () выше, а затем перенаправить их с помощью

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...