Usando Zend_Navigation en Zend Framework 1
Por Carlos Nacianceno, @igormx
Zend Framework nos provee del componente Zend_Navigation usado, como su nombre nos dice, un auxiliar en la navegación de mi proyecto, en concreto para ayudar a crear menús, breadcrumbs y mapas de sitio. Y de hecho, Zend_Navigation es casi siempre un helper de la vista en mi aplicación.
En esta ocasión vamos a crear un simple menú, primero voy a un archivo XML de configuración para mi navegación, y lo voy a crear en application/configs:
<?xml version=”1.0″ encoding=”UTF-8″?>
<config>
<nav>
<home>
<label>Inicio</label>
<uri>/</uri>
</home>
<twitter>
<label>Twitter</label>
<uri>twitter/</uri>
</twitter>
<top5>
<label>Top 5</label>
<uri>top5/</uri>
</top5>
<contacto>
<label>Contacto</label>
<uri>contacto/</uri>
</contacto>
</nav>
</config>
En este archivo, los tags: home, twitter, top10 y contacto serían páginas (objetos Zend_Navigator_Page) que estarán en dentro contenedor (objetos Zend_Navigator_Container) . Ya creado mi archivo, me voy al Bootstrap para crear el método para cargar el archivo y crear el contenedor de las páginas e “inyectárselo” a la Vista.
protected function _initNavigation()
{
$config=new Zend_Config_Xml(APPLICATION_PATH . ‘/configs/navegacion.xml’, ‘nav’);
$container=new Zend_Navigation($config);
$this->bootstrap(‘layout’);
$layout=$this->getResource(‘layout’);
$view=$layout->getView();
$view->navigation($container);
}
En mi layout o vista únicamente hago esto:
echo $this->navigation()->menu();
Generará:
Así, con un poco de CSS podríamos hacer un buen menú.
Si queremos que una de las páginas aparezca como activa, podemos hacer lo siguiente desde el init(), preDispatch() del controller o desde un plugin, en mi caso usaré un preDispatch() de un plugin.
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$layout = Zend_Layout::getMvcInstance();
$view=$layout->getView();
$controller=$request->getControllerName();
$action=$request->getActionName();
if($controller==”index”) $controller=””;
if($action==”index”) $action=””;
$uri=$controller.”/”.$action;
$pagina=$view->navigation()->findOneBy(‘uri’,$uri);
if($pagina!==null)
{
$pagina->setActive();
}
}
P.D. Si quieren saber más de Zend_Navigation puede ver esta presentación de Matthew Weier O’Phinney.