Ver índice de contenidos del libro

13.1. Mensajes flash

En los tutoriales de los días anteriores ya hemos visto el uso del objeto sfUser en las acciones para establecer mensajes flash. Un mensaje flash es un mensaje temporal que se almacena en la sesión del usuario y que se borra automáticamente después de la siguiente petición.

Estos mensajes son muy útiles para mostrar información al usuario después de una redirección. El propio generador de la parte de administración utiliza mucho los mensajes flash para mostrar al usuario información sobre el resultado de las acciones, como por ejemplo cuando se crea, borra o guarda una oferta de trabajo.

Ejemplo de mensajes flash

Figura 13.1 Ejemplo de mensajes flash

Los mensajes flash se crean con el método setFlash() del objeto sfUser:

// apps/frontend/modules/job/actions/actions.class.php
public function executeExtend(sfWebRequest $request)
{
  $request->checkCSRFProtection();
 
  $job = $this->getRoute()->getObject();
  $this->forward404Unless($job->extend());
 
  $this->getUser()->setFlash('notice', sprintf('Your job validity has been extend until %s.', $job->getExpiresAt('m/d/Y')));
 
  $this->redirect($this->generateUrl('job_show_user', $job));
}

El primer argumento de setFlash() es el identificador del mensaje y el segundo argumento es el contenido del mensaje flash. Puedes definir cualquier tipo de mensaje flash, pero los tipos notice y error son los más comunes (y son los que utiliza continuamente el generador de la parte de administración).

La acción sólo crea los mensajes flash, por lo que si se quieren mostrar en la plantilla se deben incluir explícitamente. En la aplicación Jobeet, los mensajes flash se muestran en layout.php:

// apps/frontend/templates/layout.php
<?php if ($sf_user->hasFlash('notice')): ?>
  <div class="flash_notice"><?php echo $sf_user->getFlash('notice') ?></div>
<?php endif; ?>
 
<?php if ($sf_user->hasFlash('error')): ?>
  <div class="flash_error"><?php echo $sf_user->getFlash('error') ?></div>
<?php endif; ?>

La plantilla puede acceder a la información del usuario directamente a través de una variable especial llamada sf_user.

Nota Algunos objetos propios de Symfony siempre están disponibles en las plantillas, sin necesidad de pasarlos de forma explícita desde la acción: sf_request, sf_user y sf_response.