Jump to content

Zend: Breadcrumbs and dynamically generated pages


kalusn

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>

Link to comment
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.

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • 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.