Dynamic Breadcrumbs

Basically what I’m after is a dynamic breadcrumb system, as follows:

1) Directory Page

url: /mysite/directory

breadcrumb: Home > Directory

2) Cars Section

url: /mysite/directory/cars

breadcrumb: Home > Directory > Cars

3) Cars Search Results

url: /mysite/directory/cars?query-string

breadcrumb: Home > Directory > Cars > Search Results

4) Product Details Page

url: /mysite/mercedes-benz

referrer: none

breadcrumb: Home > Mercedes Benz

5) Product Details Page derived from Cars Section

url: /mysite/mercedes-benz

referrer: /mysite/directory/cars

breadcrumb: Home > Directory > Cars > Mercedes Benz

6) Product Details Page derived from Cars Search Results

url: /mysite/mercedes-benz

referrer: /mysite/directory/cars?name=mercedes-benz

breadcrumb: Home > Directory > Cars > Search Results > Mercedes Benz

4 is easy to do, 5 & 6 are difficult. How can I do this? I think an obvious solution would be to use sessions, but I’d only use sessions if they will work properly with multiple windows/tabs.

Please also note in the above example ‘Cars’ is just a category - products can belong to multiple categories. So for example Mercedes Benz may also belong to category “Transport”.

OK, I’ve made some progress on this. I’ve decided to go with sessions, as I don’t see any other way. I am however inevitably faced with the problem of inconsistent data between multiple windows/tabs. Here is what I have done so far:

/mysite/directory/cars:


<?php

$dynamic_breadcrumbs=array();

$session=new CHttpSession;

$session->open();


if(isset($_GET['search']))

{

	$dynamic_breadcrumbs[$cat_name]=array($_GET['type']);

	$dynamic_breadcrumbs[]='Search Results';

	$session['search']=array('label'=>'Search Results', 'value'=>$_GET['type'].'?'.$_SERVER['QUERY_STRING']);

}

else

{

	$dynamic_breadcrumbs[]=$cat_name;

	$session['type']=array('label'=>$cat_name, 'value'=>$_GET['type']);

}


$standard_breadcrumbs=array(

	'Directory'=>array('directory/index'),

);


$this->breadcrumbs=array_merge($standard_breadcrumbs, $dynamic_breadcrumbs);

?>

/mysite/mercedes-benz:


<?php

$dynamic_breadcrumbs=array();

$session=new CHttpSession;

$session->open();


if(isset($session['type']))

{

	$dynamic_breadcrumbs[$session['type']['label']]=array($session['type']['value']);

}

if(isset($session['search']))

{

	$dynamic_breadcrumbs[$session['search']['label']]=array($session['search']['value']);

}


$dynamic_breadcrumbs[]=$car->FullName;


$standard_breadcrumbs=array(

	'Directory'=>array('directory/index'),

);


$this->breadcrumbs=array_merge($standard_breadcrumbs, $dynamic_breadcrumbs);

?>

I think I need to pass some kind of ID variable that uniquely identifies each individual session.

Anybody? Have I got the wrong idea here?

Did you solved it ?

Scryii

Can’t you use


$_SERVER['HTTP_REFERER']

What I really don’t like of this approach is to rely on session/referer for create the page.

From my point of view, an url should be always show the same page. What if a user saves the page in bookmarks? Which kind of breadcrumbs will you show in this case?

In this situation I prefer to use different urls for the page:

for 4 you can use:

/mysite/mercedes-benz

for 5 you can use:

/mysite/cars/mercedes-benz

for 6:

/mysite/search-car/mercedes-benz

You can manage all with CurlManager, in order to use the first level as a parameter. This allow you to differentiate the pages (even maintaining only 1 controller/action)