From f46b6bde5134f1906f4d2f155cfa40d562e864ab Mon Sep 17 00:00:00 2001 From: micmania1 Date: Thu, 8 May 2014 03:09:02 +0100 Subject: [PATCH] Added getBreadcrumbItems to SiteTree --- code/model/SiteTree.php | 30 +++++++++++++++++++++++------- templates/BreadcrumbsTemplate.ss | 5 ++--- tests/model/SiteTreeTest.php | 19 +++++++++++++++++++ tests/model/SiteTreeTest.yml | 14 ++++++++++++++ 4 files changed, 58 insertions(+), 10 deletions(-) mode change 100644 => 100755 code/model/SiteTree.php mode change 100644 => 100755 templates/BreadcrumbsTemplate.ss mode change 100644 => 100755 tests/model/SiteTreeTest.yml 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: