Plugins.
En ZF podemos utilizar plugins. Estos plugins se van a ejecutar en determinado momento, como puede ser el Predispatch o el PostDispatch. En muchos proyectos con ZF se utiliza una capa superior para los controllers para obligar al sistema que ejecute siempre la capa superior donde en esta capa podemos tener varias funcionalidades comunes para todos los controllers.
Esto no es una mala decisión, de hecho en nuestro blog tenemos un controller genérico. Pero también podemos hacer uso de los plugins, estos además de servirnos posteriormente para extender la funcionalidades, como puede ser el agregado de un contador de visitas, o cualquier funcionalidad extra que queramos darle al sistema sin necesidad de tocar el código existente, solo extendiendo el que hay. Como es el caso de los plugins en Wordpress, también podemos tener algunos plugins genéricos, para que procesen acciones genéricas, como puede ser el caso de configurar la vista, el layout, o la base de datos, el manejo de sesiones, etc.
En nuestro blog actualmente hay varios plugins, y cada uno bien separado su funcionalidad, hay un plugin extra especialmente para el admin, el cual maneja la seguridad (por ahora solo eso), pero también tenemos un plugin para instanciar la vista, y decirle de donde sacar el menú, y todo lo necesario para renderear la vista, además de un plugin para el manejo de layouts, otro plugin para la base de datos. Y además de esto una capa de abstracción superior en los controllers.
El uso de plugins en Zend Framework, es muy fácil y se cargan desde el bootstrap, cuando agregamos los controllers y antes de hacer dispatch, le decimos que plugins cargar.
-
-
<?php
-
$controller = Zend_Controller_Front::getInstance
-
->throwExceptions(true)
-
->registerPlugin( new Blogzf_Controller_Plugin_Config())
-
->registerPlugin( new Blogzf_Controller_Plugin_Layout())
-
->registerPlugin( new Blogzf_Controller_Plugin_View())
-
->registerPlugin( new Blogzf_Controller_Plugin_Backoffice())
-
->dispatch();
-
?>
-
Como se puede apreciar en el código de nuestro bootstrap, cargamos 4 plugins. Estos plugins los ubicamos en la carpeta library/Blogzf/Controller/Plugin, esta ruta es para tener una hegemonía con la estructura de directorios de ZF.
Estos plugins son muy fácil de programar. Cada clase implementa una interfaz genérica que cada método corresponde a una instancia de ejecución de nuestra pagina. Tenemos un método para preDispatch, otro para el postdispatch, que cada vez que le toca ejecutarse a estos metodos se llama a los plugins, antes del controller. Nuestros plugins extienden de la clase padre Zend_Controller_Plugin_Abstract . Un plugin normal con dos metodos como son PreDispatch, PostDispatch, quedaría como el siguiente.
-
-
<?php
-
/**
-
* Plugin para administrar las vistas de nuestro sistema.
-
*
-
*/
-
class Blogzf_Controller_Plugin_View extends Zend_Controller_Plugin_Abstract
-
{
-
protected $_viewRenderer;
-
protected $_view;
-
public function preDispatch (Zend_Controller_Request_Abstract $request)
-
{
-
/**
-
* Esto es un singleton de la vista para que no lo reinicie
-
*/
-
$this->_viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(‘viewRenderer’);
-
$this->_viewRenderer->initView();
-
/**
-
* Traemo los datos del archivo de configuaracion
-
*/
-
$config = Zend_Registry::getInstance()->get( ‘config_ini’ );
-
$auth = Zend_Auth::getInstance();
-
-
$this->_view = $this->_viewRenderer->view;
-
-
/**
-
* Agregamos unas
-
*/
-
$this->_view->baseUrl = $request->getBaseUrl();
-
$this->_view->module = $request->getModuleName();
-
$this->_view->controller = $request->getControllerName();
-
$this->_view->action = $request->getActionName();
-
-
$this->_view->hasIdentity = false;
-
-
if ( $auth->hasIdentity() ) {
-
$this->_view->hasIdentity = true;
-
$this->_view->Identity = $auth->getIdentity();
-
}
-
-
/**
-
* Agregamos las rutas para las vistas
-
*/
-
$this->_view->addScriptPath(‘/application/blog/views’);
-
$this->_view->addScriptPath(‘/application/admin/views’);
-
/**
-
* Url basicas del sistema
-
*/
-
$this->_view->staticServer = $config->site->static->server;
-
$this->_view->appServer = $config->site->static->server;
-
/**
-
* Agrego el titulo de la pagina
-
*/
-
$this->_view->headTitle()->append( $config->site->title );
-
$this->_view->site = $config->site;
-
/**
-
* Agrego los css para esta pagina que siempre va a ser el mismo.
-
* /layout/nombre_layout/style.css esto es para poder agregar muchos layout. Y no dependan
-
* de la cantidad de css, si necesitamos separar en mas archivos. Podemos hacer un @import desde
-
* style.css
-
*
-
*/
-
if ( $request->module == ‘admin’ ) {
-
$layout = $config->site->layout->admin;
-
$this->_view->headScript()
-
->appendFile( $this->_view->staticServer . ‘js/mootools/mootools-core.js’ );
-
} else {
-
$layout = $config->site->layout->default;
-
}
-
-
$this->_view->headLink()
-
->appendStylesheet( $this->_view->staticServer . ‘layout/’.$layout.‘/styles.css’ );
-
-
-
}
-
public function postDispatch (Zend_Controller_Request_Abstract $request)
-
{
-
if ($this->_view->module==‘default’) {
-
return;
-
}
-
-
if ($this->_view->layout()->isEnabled() ) {
-
$this->_view->layout()->sidebar = $this->_view->action( ‘rightcontent’, ’sidebar’, $this->_view->module );
-
$this->_view->layout()->header = $this->_view->action( ‘header’, ’sidebar’, $this->_view->module );
-
$this->_view->layout()->footer = $this->_view->action( ‘footer’, ’sidebar’, $this->_view->module );
-
$this->_view->layout()->menutop = $this->_view->action( ‘menutop’,’sidebar’, $this->_view->module );
-
}
-
}
-
}
-
Si necesitamos que algun dato persista, podemos usar Zend_Registry
Como se daran cuenta, estos plugins son muy facil. No requieren mucho mas que esto.
Si van al codigo de blogzf van a encontrar el codigo de los otros 4 plugins.





Disculpa, que es un “controller genérico”
Saludos desde Rosario.
Con controller generico me refiero a que tiene funcionalidades comunes que comparten la mayoria o todos los controller, por eso reuno todas esas funcionalidades, y las dejo en una clase pade
Gracias por el dato,
otra cosita, el controller generico en cuestion, lo codificas como un controller mas y lo llamas desde el bootstrap (index.php).
Es eso?
Es que recien estoy empezando con el Zend y no sabia que se podia tener un controlador general, es una buena opcion.
Un abrazo.
Nononono.
La idea es que en vez de heredar desde Zend_Controller_Action, heredes desde Tu_Controller_Action.
Por ejemplo
class Tu_Controller_Action extends Zend_Controller_Action{
public funcion preDispatch()
{
echo “hola”;
}
}
class BookController extends Tu_Controller_Action {
public funcion indexAction()
{
}
}
Y en una aplicacion modular, ¿donde iria guardado ese controller generico para que se vea de todos los modulos?
saludos, soy principiante en zend
@marco.
Lo podes agregar en la carpeta library/TusComponentes/Controller.php
Saludos.
Hola, estoy viendo tus posts ya que estoy arrancando con Zend Framework, una consulta, si yo quiero tener un sidebar que se vea el mismo en todas las paginas del sitio (en todos los modulos, los datos del sidebar son traidos de una base de datos), cual seria la mejor opcion?
Calculo que un plugin, o se puede implementar algo mejor?
Saludos.
Hola Mariano. Desde la version 1.8 hay un helper para este tipo de cosas se llama Zend_Navigation. Fijate la doc
http://framework.zend.com/manual/en/zend.navigation.html
Hola
Queria saber si tienes alguna Screen de cual es el resultado del blog es que estoy partiendo con zend y queria ver como quedan las cosas ya que tengo que decidir que framework usar. Symfoni,cake o zend :S