Home Programación PHP 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.

Leave a Reply