Jump to content

Archived

This topic is now archived and is closed to further replies.

kalusn

Zend: Breadcrumbs and dynamically generated pages

Recommended Posts

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>

Share this post


Link to post
Share on other sites

Zend_Navigation will look for an item Zend_Navigation in the registry if you don't pass it explicitly.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.