I have a problem getting breadcrumbs to work properly in Zend Framework. I followed the zendcast guide on http://www.zendcasts.com/zend_navigation-dynamically-creating-a-menu-a-sitemap-and-breadcrumbs/2009/06/ in order to have a menu, sitemap and breadcrumbs generated from an .xml file.
My pages are routed by the sub route, which has the value /sub/:page/. It refers to the contentAction of the IndexController. When i run it on my localhost server, it returns an error: "Fatal error: Call to undefined method stdClass::setClass() in /var/www/mywebapp/application/controllers/IndexController.php on line 23"
The error signals that the problem is with the $activeNav object, and thus the $this->view->navigation()->findByUri($uri);. It doesn't help if i change it to findByLabel('forside'); (which is a label used in the navigation.xml file).
However, I found a comment on that told me to add Zend_Registry::set(Zend_Navigation, $navigation); after the construction of the Zend_Navigation object in the Bootstrap. Now it works! and i'm supposed to be happy, but I still don't understand what it does. Can anyone explain to me why I have to use the Zend_Registry::set(Zend_Navigation, $navigation); command. Is it because of my custom routes?
I don't have a problem anymore, but I'm very curious as to how this thing work. An explanation will be greatly appreciated.
Thank you.
IndexController:
public function contentAction()
{
/* Setting the uri to be used by breadcrumbs*/
$uri = $this->_request->getPathInfo();
$activeNav = $this->view->navigation()->findByUri($uri);
$activeNav->active = true;
$activeNav->setClass(”active”);
}
Bootstrap.php
protected function _initNavigation()
{
$this->bootstrap('layout');
$layout = $this->getResource('layout');
$view = $layout->getView();
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$navigation = new Zend_Navigation($config);
Zend_Registry::set(Zend_Navigation, $navigation); // WHAT DOES THIS DOOOOOO?!??!?!?!?
$view->navigation($navigation);
}
navigation.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<nav>
<home>
<label>Introduction</label>
<uri>/</uri>
<pages>
<forside>
<label>forside</label>
<uri>/sub/forside</uri>
</forside>
<produkter>
<label>produkter</label>
<uri>/sub/produkter</uri>
</produkter>
<kayloos>
<label>kayloos</label>
<uri>/sub/kayloos</uri>
</kayloos>
<kontakt>
<label>kontakt</label>
<uri>/sub/kontakt</uri>
</kontakt>
</pages>
</home>
</nav>
</config>
routes.ini:
routes.sub.type = "Zend_Controller_Router_Route"
routes.sub.route = "sub/:page/*"
routes.sub.defaults.controller = "index"
routes.sub.defaults.action = "content"
Layout script:
<div id="breadcrumbs">
<?= $this->navigation()->breadcrumbs()->setMinDepth(0)
->setLinkLast(true)
->setSeparator(' : ');?>
</div>