diff --git a/code/model/SiteTree.php b/code/model/SiteTree.php
old mode 100644
new mode 100755
index 47cf8bae..4b7cd3b9
--- a/code/model/SiteTree.php
+++ b/code/model/SiteTree.php
@@ -718,12 +718,31 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
* (with ShowInMenus=0).
*
* @param int $maxDepth The maximum depth to traverse.
- * @param boolean $unlinked Do not make page names links
+ * @param boolean $unlinked Whether to link page titles.
* @param boolean|string $stopAtPageType ClassName of a page to stop the upwards traversal.
* @param boolean $showHidden Include pages marked with the attribute ShowInMenus = 0
* @return HTMLText The breadcrumb trail.
*/
public function Breadcrumbs($maxDepth = 20, $unlinked = false, $stopAtPageType = false, $showHidden = false) {
+ $pages = $this->getBreadcrumbItems($maxDepth, $stopAtPageType, $showHidden);
+ $template = new SSViewer('BreadcrumbsTemplate');
+ return $template->process($this->customise(new ArrayData(array(
+ "Pages" => $pages,
+ "Unlinked" => $unlinked
+ ))));
+ }
+
+
+ /**
+ * Returns a list of breadcrumbs for the current page.
+ *
+ * @param int $maxDepth The maximum depth to traverse.
+ * @param boolean|string $stopAtPageType ClassName of a page to stop the upwards traversal.
+ * @param boolean $showHidden Include pages marked with the attribute ShowInMenus = 0
+ *
+ * @return ArrayList
+ */
+ public function getBreadcrumbItems($maxDepth = 20, $stopAtPageType = false, $showHidden = false) {
$page = $this;
$pages = array();
@@ -738,14 +757,11 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
$page = $page->Parent;
}
-
- $template = new SSViewer('BreadcrumbsTemplate');
-
- return $template->process($this->customise(new ArrayData(array(
- 'Pages' => new ArrayList(array_reverse($pages))
- ))));
+
+ return new ArrayList(array_reverse($pages));
}
+
/**
* Make this page a child of another page.
*
diff --git a/templates/BreadcrumbsTemplate.ss b/templates/BreadcrumbsTemplate.ss
old mode 100644
new mode 100755
index 1f819c2c..60764276
--- a/templates/BreadcrumbsTemplate.ss
+++ b/templates/BreadcrumbsTemplate.ss
@@ -1,5 +1,4 @@
+<%-- Loop is all on one line to prevent whitespace bug in older versions of IE --%>
<% if $Pages %>
- <% loop $Pages %>
- <% if $Last %>$MenuTitle.XML<% else %>$MenuTitle.XML »<% end_if %>
- <% end_loop %>
+ <% loop $Pages %><% if $Last %>$MenuTitle.XML<% else %><% if not Up.Unlinked %><% end_if %>$MenuTitle.XML<% if not Up.Unlinked %><% end_if %> » <% end_if %><% end_loop %>
<% end_if %>
diff --git a/tests/model/SiteTreeTest.php b/tests/model/SiteTreeTest.php
index 7f0dda50..5b9a940e 100644
--- a/tests/model/SiteTreeTest.php
+++ b/tests/model/SiteTreeTest.php
@@ -943,6 +943,25 @@ class SiteTreeTest extends SapphireTest {
// reset original value
Config::inst()->update('SiteTree', 'meta_generator', $generator);
}
+
+
+ public function testGetBreadcrumbItems() {
+ $page = $this->objFromFixture("Page", "breadcrumbs");
+ $this->assertEquals($page->getBreadcrumbItems()->count(), 1, "Only display current page.");
+
+ // Test breadcrumb order
+ $page = $this->objFromFixture("Page", "breadcrumbs5");
+ $breadcrumbs = $page->getBreadcrumbItems();
+ $this->assertEquals($breadcrumbs->count(), 5, "Display all breadcrumbs");
+ $this->assertEquals($breadcrumbs->first()->Title, "Breadcrumbs", "Breadcrumbs should be the first item.");
+ $this->assertEquals($breadcrumbs->last()->Title, "Breadcrumbs 5", "Breadcrumbs 5 should be last item.");
+
+ // Test breadcrumb max depth
+ $breadcrumbs = $page->getBreadcrumbItems(2);
+ $this->assertEquals($breadcrumbs->count(), 2, "Max depth should limit the breadcrumbs to 2 items.");
+ $this->assertEquals($breadcrumbs->first()->Title, "Breadcrumbs 4", "First item should be Breadrcumbs 4.");
+ $this->assertEquals($breadcrumbs->last()->Title, "Breadcrumbs 5", "Breadcrumbs 5 should be last.");
+ }
/**
* Tests SiteTree::MetaTags
diff --git a/tests/model/SiteTreeTest.yml b/tests/model/SiteTreeTest.yml
old mode 100644
new mode 100755
index 2f0cf282..4bfaa3ae
--- a/tests/model/SiteTreeTest.yml
+++ b/tests/model/SiteTreeTest.yml
@@ -89,6 +89,20 @@ Page:
Title: 'HTML & XML'
MetaDescription: 'The
and
tags'
ExtraMeta: ''
+ breadcrumbs:
+ Title: 'Breadcrumbs'
+ breadcrumbs2:
+ Title: 'Breadcrumbs 2'
+ Parent: =>Page.breadcrumbs
+ breadcrumbs3:
+ Title: 'Breadcrumbs 3'
+ Parent: =>Page.breadcrumbs2
+ breadcrumbs4:
+ Title: 'Breadcrumbs 4'
+ Parent: =>Page.breadcrumbs3
+ breadcrumbs5:
+ Title: 'Breadcrumbs 5'
+ Parent: =>Page.breadcrumbs4
SiteTreeTest_Conflicted:
parent: