viernes, 15 de febrero de 2008

setFlash de CakePHP con ZendFramework

Por estos días estoy en training total de Zend Framework, la verdad un framework muy flexible, con una gama de clases bastante buenas que permiten agilizar nuestro tiempo de desarrollo (ojo eso si dominamos dicho framework, no demora mucho tiempo dominarlo).

En fin anteriormente he utilizado CakePHP, otro framework que me gusta bastante, pero que aunque más fácil de usar, diría a mi concepto es menos flexible que el framework de Zend.

Para ir al asunto, hay varias funciones de cakephp que me gustan mucho, entre ellas la que utilizamos en el controlador para guardar mensajes y mostrarlos aunque se haga un redirect ($this->Session->setFlash). Por ejemplo si tenemos un módulo de noticias y guardamos una noticias, pero redirigimos a la página donde se listan las noticias y no al formulario para agregarla, tenemos que hacer un redirect ($this->_redirect('/')), o sea, que si queremos mostrar un mensaje no podríamos hacerlo (que yo cepa, me imagino que alguna otra forma habrá).

Para eso cree un controlador base (BaseController.ph) que hereda de Zend_Controller_Action. En el agregúe dos funciones, setFlash para setear el mensaje y getFlash para obtener dicho mensaje (Si quieres que funcione para cualquier controlador entonces debes heredar de esta clase los controladores). Estas funciones utilizan una variable de sesión por lo que en el bootstrap (index.php) debemos abrir la sesión así:

Zend_Loader::loadClass('Zend_Session');
Zend_Loader::loadClass('Zend_Session_Namespace');

/**
* Abro la sesión
*/
Zend_Session::start();

---------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------

Ahora les dejo con el código del controlador base (BaseController.php)

/**
* BaseController
*
* @author
* @version
*/

require_once 'Zend/Controller/Action.php';

class BaseController extends Zend_Controller_Action {
/**
* The default action - show the home page
*/

public function init() {
$this->initView();
$this->view->siteInfo = Zend_Registry::get('siteInfo');
$translate = Zend_Registry::get('translate');
$this->view->declareVars(array('t' => $translate));
}

public function postDispatch(){
$this->view->danmessage = $this->getFlash();
}

public function baseUrl()
{
$fc = Zend_Controller_Front::getInstance();
$request = $fc->getRequest();
return $request->getBaseUrl();
}


public function setFlash($msg = ''){
$danmsg = new Zend_Session_Namespace('dan.message');
$danmsg->mensaje = $msg;
}


public function getFlash(){
$r = new Zend_Session_Namespace('dan.message');
$return = $r->mensaje;
$r->mensaje = null;
return $return;
}
}

---------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------

Ahora en mi caso estoy usando la clase Zend_Layout, por lo que uso un template. Para colocar este mensaje en tu template solo debes imprimirlo donde desees. Solo debes utilizar esto:

<?=$this->danmessage ?>

2 comentarios:

Demóstenes García dijo...

Buenas!
Que buen blog tienes por aca, espero que no desaparezca y mas panameños como yo lo descubran cada día.
Me tope con tu sitio por plena casualidad y te cuento. Soy fanatico al desarrollo web, y estoy cada vez almorzandome mas informacion de php OOP y para mi el "nuevo" php5, puesto que me quede un poco atrasado estos años y estoy dando apenas pininos en este area del OOP.

De igual manera, luego de tu mensaje me despiertas las ganas de comenzar a utilizar el Zend o el Cake (este ultimo muy recomendado para el comienzo) pero no estoy seguro si deberia dominar a cabalidad el tema del php5 y el OOP en php para utilizarlo.

Gracias de antemano y seguire visitando este sitio.

Danilo Domínguez P. dijo...

Hola Demóstenes.
Mira para Zend Framework si debería manejar POO de php5 más que para CakePHP, ya que Zend está disponible sólo para versiones de php5, en cambio Cake está para php4 también, aunque recomiendo que todo lo que desarrolles lo hagas adecuandote a php5, ya que para php4 ya no hay más soporte.

Si tienes alguna consulta durante tu experiencia con php me puedes escribir a danilo.dope at gmail dot com

Saludos ...