kalusn Posted January 12, 2010 Share Posted January 12, 2010 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> Quote Link to comment https://forums.phpfreaks.com/topic/188242-zend-breadcrumbs-and-dynamically-generated-pages/ Share on other sites More sharing options...
ignace Posted January 12, 2010 Share Posted January 12, 2010 Zend_Navigation will look for an item Zend_Navigation in the registry if you don't pass it explicitly. Quote Link to comment https://forums.phpfreaks.com/topic/188242-zend-breadcrumbs-and-dynamically-generated-pages/#findComment-993805 Share on other sites More sharing options...
kalusn Posted January 13, 2010 Author Share Posted January 13, 2010 Ok. I've passed it explicitly with the Zend_Registry::set(Zend_Navigation, $navigation); line, but my question is then, why does it have to be passed explicitly, when it should be in the registry automatically? I've learned what I know about Zend mostly from trial and error through the reference guide - there might be some big basics I don't know. If you know any good reads, tell me. Quote Link to comment https://forums.phpfreaks.com/topic/188242-zend-breadcrumbs-and-dynamically-generated-pages/#findComment-994339 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.