2010-09-28 21 views
5

Estoy empezando con CakePHP, y las cosas no van tan bien hasta ahora.Cómo generar un hipervínculo desde un controlador en cakePHP

Tengo un controlador que se encarga de confirmar los correos electrónicos de los usuarios. Al registrarse, al usuario se le envía un correo electrónico con un código de confirmación en un enlace. Dependiendo del código de confirmación que den, el controlador da diferentes respuestas de texto. Una de estas respuestas incluye un hipervínculo para iniciar sesión.

Estoy tratando de usar el helper Html, pero aunque lo he cargado en $ helpers en la parte superior de la clase, solo lo hago funcionar si luego uso App :: import, y luego lo instancia.

¡Todo parece excesivo simplemente hacer un hipervínculo! ¿Cuántas veces tengo que cargar la misma clase?

Dondequiera que miro en la web me sigue diciendo que es una mala idea usar un ayudante en un controlador, pero ¿de qué otro modo puedo obtener el enlace?

así que he

var $helpers = array('Html'); 

en la parte superior del controlador, y:

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

en el método de confirmación del controlador y

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

en la vista a la salida de la resultante mensaje

Seguramente me voy a equivocar en algún lado. ¿Alguien puede explicar cómo?

Respuesta

3

La idea es que todos los datos que necesita para representar la página se envíen a la vista con conjunto, luego se realiza cualquier lógica condicional o formato en la vista con ayudantes, así que envíe los resultados completos de la consulta cuando sea apropiado (suponga que necesita para modificar un enlace para incluir el nombre de pantalla del usuario, lo tendrá a mano).

en acción del controlador

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

a la vista (esto es ligeramente diferente dependiendo de si en < = 1,2 o 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, ¡vale! Eso tiene un poco más de sentido. Fue la idea de pasar los datos completos del usuario a la vista que no obtuve. Vi la vista mucho más "tonta". Gracias por la buena ilustración clara. – Hippyjim

+0

Pensé que $ this-> Usuario era como resultado de la consulta en lugar de un modelo. Tu derecho, deberías estar haciendo $ user = $ this-> User-> find() luego $ this-> set ('user', $ user), para que el usuario sea una matriz de resultados en la vista. –

+0

Sí, entendí que eran los datos, más que el modelo: pasar el modelo podría poner en riesgo todo tipo de desagradables referencias circulares, ¿no? (sin mencionar romper el MVC) – Hippyjim

15

No se supone que su uso en Ayudantes Controlador. Como señaló @Lincoln, debe construir el enlace en la Vista. Puede construir el URL en el Controlador, ya que una URL i s básicamente datos, pero un enlace es una implementación muy específica de un medio (HTML) de una URL.

De cualquier manera, tendrá que crear un completo URL (incluido el host) si desea enviarlo en un correo electrónico. La forma más universal es utilizar Router::url:

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

hacer esto en el controlador o en la vista. Para crear un enlace, use esto en la Vista:

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

Lo que está tratando de hacer debe hacerse con el SessionComponent.$ this-> Session-> setFlash ('su mensaje aquí');

y en su diseño con el asistente de sesión ponga $ this-> Session-> flash();

Acerca de las URL deseadas en el controlador, Router :: url está correcto como dijo deceze, pero no sirve para nada, ya que no debería estar compilando html en un controlador.

lo que quiere hacer uso del método sesión :: setFlash() por encima y luego redirige utilizando

$ this-> redirect (array ('controller' => "usuarios", 'acción' = > "iniciar sesión"));

+0

Gracias por los punteros, pero en este caso el flash no es suficiente, ya que hay más que un solo "div" para poblar, simplemente corté el código para el ejemplo. De cualquier manera, dejar que la vista maneje la lógica de visualización tiene mucho más sentido para mí, y he conseguido que el código funcione. – Hippyjim

Cuestiones relacionadas