summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDries2013-12-18 15:22:36 -0500
committerDries2013-12-18 15:22:36 -0500
commitc478bf4062e910357c2dd89c9dd069ffd2d959a2 (patch)
tree1b0c57ceb68289a267d5352eab86165237525fd9
parent17cc6dab8b84abb831b2e54ceac6a15c9c6d9dc8 (diff)
Issue #2150621 by damiankloip: Separate applies and build logic for breadcrumb builders.8.0-alpha7
-rw-r--r--core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php18
-rw-r--r--core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php17
-rw-r--r--core/modules/book/lib/Drupal/book/BookBreadcrumbBuilder.php43
-rw-r--r--core/modules/comment/lib/Drupal/comment/CommentBreadcrumbBuilder.php32
-rw-r--r--core/modules/forum/lib/Drupal/forum/ForumBreadcrumbBuilder.php25
-rw-r--r--core/modules/system/lib/Drupal/system/PathBasedBreadcrumbBuilder.php7
-rw-r--r--core/modules/taxonomy/lib/Drupal/taxonomy/TermBreadcrumbBuilder.php34
-rw-r--r--core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php21
8 files changed, 134 insertions, 63 deletions
diff --git a/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php
index 1fae4c6..cff4c54 100644
--- a/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php
+++ b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php
@@ -13,14 +13,26 @@ namespace Drupal\Core\Breadcrumb;
interface BreadcrumbBuilderInterface {
/**
+ * Whether this breadcrumb builder should be used to build the breadcrumb.
+ *
+ * @param array $attributes
+ * Attributes representing the current page.
+ *
+ * @return bool
+ * TRUE if this builder should be used or FALSE to let other builders
+ * decide.
+ */
+ public function applies(array $attributes);
+
+ /**
* Builds the breadcrumb.
*
* @param array $attributes
* Attributes representing the current page.
*
- * @return array|null
- * A render array for the breadcrumbs or NULL to let other builders decide.
- * Returning empty array will suppress all breadcrumbs.
+ * @return array
+ * A render array for the breadcrumbs. Returning an empty array will
+ * suppress all breadcrumbs.
*/
public function build(array $attributes);
diff --git a/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php
index 9e6f9b7..a995317 100644
--- a/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php
+++ b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbManager.php
@@ -68,18 +68,27 @@ class BreadcrumbManager implements BreadcrumbBuilderInterface {
/**
* {@inheritdoc}
*/
+ public function applies(array $attributes) {
+ return TRUE;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
public function build(array $attributes) {
$breadcrumb = array();
$context = array('builder' => NULL);
// Call the build method of registered breadcrumb builders,
// until one of them returns an array.
foreach ($this->getSortedBuilders() as $builder) {
- $build = $builder->build($attributes);
- if (!isset($build)) {
- // The builder returned NULL, so we continue with the other builders.
+ if (!$builder->applies($attributes)) {
+ // The builder does not apply, so we continue with the other builders.
continue;
}
- elseif (is_array($build)) {
+
+ $build = $builder->build($attributes);
+
+ if (is_array($build)) {
// The builder returned an array of breadcrumb links.
$breadcrumb = $build;
$context['builder'] = $builder;
diff --git a/core/modules/book/lib/Drupal/book/BookBreadcrumbBuilder.php b/core/modules/book/lib/Drupal/book/BookBreadcrumbBuilder.php
index 3ad730f..6dd54ff 100644
--- a/core/modules/book/lib/Drupal/book/BookBreadcrumbBuilder.php
+++ b/core/modules/book/lib/Drupal/book/BookBreadcrumbBuilder.php
@@ -58,31 +58,38 @@ class BookBreadcrumbBuilder extends BreadcrumbBuilderBase {
/**
* {@inheritdoc}
*/
+ public function applies(array $attributes) {
+ return !empty($attributes['node'])
+ && ($attributes['node'] instanceof NodeInterface)
+ && !empty($attributes['node']->book);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
public function build(array $attributes) {
- if (!empty($attributes['node']) && $attributes['node'] instanceof NodeInterface && !empty($attributes['node']->book)) {
- $mlids = array();
- $links = array($this->l($this->t('Home'), '<front>'));
- $book = $attributes['node']->book;
+ $mlids = array();
+ $links = array($this->l($this->t('Home'), '<front>'));
+ $book = $attributes['node']->book;
+ $depth = 1;
+ // We skip the current node.
+ while (!empty($book['p' . ($depth + 1)])) {
+ $mlids[] = $book['p' . $depth];
+ $depth++;
+ }
+ $menu_links = $this->menuLinkStorage->loadMultiple($mlids);
+ if (count($menu_links) > 0) {
$depth = 1;
- // We skip the current node.
while (!empty($book['p' . ($depth + 1)])) {
- $mlids[] = $book['p' . $depth];
- $depth++;
- }
- $menu_links = $this->menuLinkStorage->loadMultiple($mlids);
- if (count($menu_links) > 0) {
- $depth = 1;
- while (!empty($book['p' . ($depth + 1)])) {
- if (!empty($menu_links[$book['p' . $depth]]) && ($menu_link = $menu_links[$book['p' . $depth]])) {
- if ($this->accessManager->checkNamedRoute($menu_link->route_name, $menu_link->route_parameters, $this->account)) {
- $links[] = $this->l($menu_link->label(), $menu_link->route_name, $menu_link->route_parameters, $menu_link->options);
- }
+ if (!empty($menu_links[$book['p' . $depth]]) && ($menu_link = $menu_links[$book['p' . $depth]])) {
+ if ($this->accessManager->checkNamedRoute($menu_link->route_name, $menu_link->route_parameters, $this->account)) {
+ $links[] = $this->l($menu_link->label(), $menu_link->route_name, $menu_link->route_parameters, $menu_link->options);
}
- $depth++;
}
+ $depth++;
}
- return $links;
}
+ return $links;
}
}
diff --git a/core/modules/comment/lib/Drupal/comment/CommentBreadcrumbBuilder.php b/core/modules/comment/lib/Drupal/comment/CommentBreadcrumbBuilder.php
index e7a4bb8..aa41c41 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentBreadcrumbBuilder.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentBreadcrumbBuilder.php
@@ -36,20 +36,26 @@ class CommentBreadcrumbBuilder extends BreadcrumbBuilderBase {
/**
* {@inheritdoc}
*/
+ public function applies(array $attributes) {
+ return isset($attributes[RouteObjectInterface::ROUTE_NAME]) && $attributes[RouteObjectInterface::ROUTE_NAME] == 'comment.reply'
+ && isset($attributes['entity_type'])
+ && isset($attributes['entity_id'])
+ && isset($attributes['field_name']);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
public function build(array $attributes) {
- if (isset($attributes[RouteObjectInterface::ROUTE_NAME]) && $attributes[RouteObjectInterface::ROUTE_NAME] == 'comment.reply'
- && isset($attributes['entity_type'])
- && isset($attributes['entity_id'])
- && isset($attributes['field_name'])
- ) {
- $breadcrumb[] = $this->l($this->t('Home'), '<front>');
- $entity = $this->entityManager
- ->getStorageController($attributes['entity_type'])
- ->load($attributes['entity_id']);
- $uri = $entity->uri();
- $breadcrumb[] = l($entity->label(), $uri['path'], $uri['options']);
- return $breadcrumb;
- }
+ $breadcrumb = array();
+
+ $breadcrumb[] = $this->l($this->t('Home'), '<front>');
+ $entity = $this->entityManager
+ ->getStorageController($attributes['entity_type'])
+ ->load($attributes['entity_id']);
+ $uri = $entity->uri();
+ $breadcrumb[] = l($entity->label(), $uri['path'], $uri['options']);
+ return $breadcrumb;
}
}
diff --git a/core/modules/forum/lib/Drupal/forum/ForumBreadcrumbBuilder.php b/core/modules/forum/lib/Drupal/forum/ForumBreadcrumbBuilder.php
index e49f093..6128aa8 100644
--- a/core/modules/forum/lib/Drupal/forum/ForumBreadcrumbBuilder.php
+++ b/core/modules/forum/lib/Drupal/forum/ForumBreadcrumbBuilder.php
@@ -58,17 +58,22 @@ class ForumBreadcrumbBuilder extends BreadcrumbBuilderBase {
/**
* {@inheritdoc}
*/
+ public function applies(array $attributes) {
+ return !empty($attributes[RouteObjectInterface::ROUTE_NAME])
+ && (($attributes[RouteObjectInterface::ROUTE_NAME] == 'node.view' && isset($attributes['node']) && $this->forumManager->checkNodeType($attributes['node']))
+ || ($attributes[RouteObjectInterface::ROUTE_NAME] == 'forum.page' && isset($attributes['taxonomy_term']))
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
public function build(array $attributes) {
- if (!empty($attributes[RouteObjectInterface::ROUTE_NAME])) {
- $route_name = $attributes[RouteObjectInterface::ROUTE_NAME];
- if ($route_name == 'node.view' && isset($attributes['node'])) {
- if ($this->forumManager->checkNodeType($attributes['node'])) {
- return $this->forumPostBreadcrumb($attributes['node']);
- }
- }
- if ($route_name == 'forum.page' && isset($attributes['taxonomy_term'])) {
- return $this->forumTermBreadcrumb($attributes['taxonomy_term']);
- }
+ if ($attributes[RouteObjectInterface::ROUTE_NAME] == 'node.view') {
+ return $this->forumPostBreadcrumb($attributes['node']);
+ }
+ elseif ($attributes[RouteObjectInterface::ROUTE_NAME] == 'forum.page') {
+ return $this->forumTermBreadcrumb($attributes['taxonomy_term']);
}
}
diff --git a/core/modules/system/lib/Drupal/system/PathBasedBreadcrumbBuilder.php b/core/modules/system/lib/Drupal/system/PathBasedBreadcrumbBuilder.php
index 1f59256..f185e48 100644
--- a/core/modules/system/lib/Drupal/system/PathBasedBreadcrumbBuilder.php
+++ b/core/modules/system/lib/Drupal/system/PathBasedBreadcrumbBuilder.php
@@ -105,6 +105,13 @@ class PathBasedBreadcrumbBuilder extends BreadcrumbBuilderBase {
/**
* {@inheritdoc}
*/
+ public function applies(array $attributes) {
+ return TRUE;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
public function build(array $attributes) {
$links = array();
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermBreadcrumbBuilder.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermBreadcrumbBuilder.php
index 3a6e3e9..e886357 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermBreadcrumbBuilder.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermBreadcrumbBuilder.php
@@ -18,21 +18,29 @@ class TermBreadcrumbBuilder extends BreadcrumbBuilderBase {
/**
* {@inheritdoc}
*/
+ public function applies(array $attributes) {
+ return !empty($attributes[RouteObjectInterface::ROUTE_NAME])
+ && ($attributes[RouteObjectInterface::ROUTE_NAME] == 'taxonomy.term_page')
+ && ($attributes['taxonomy_term'] instanceof TermInterface);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
public function build(array $attributes) {
- if (!empty($attributes[RouteObjectInterface::ROUTE_NAME]) && $attributes[RouteObjectInterface::ROUTE_NAME] == 'taxonomy.term_page' && ($term = $attributes['taxonomy_term']) && $term instanceof TermInterface) {
- // @todo This overrides any other possible breadcrumb and is a pure
- // hard-coded presumption. Make this behavior configurable per
- // vocabulary or term.
- $breadcrumb = array();
- while ($parents = taxonomy_term_load_parents($term->id())) {
- $term = array_shift($parents);
- $breadcrumb[] = $this->l($term->label(), 'taxonomy.term_page', array('taxonomy_term' => $term->id()));
- }
- $breadcrumb[] = $this->l($this->t('Home'), '<front>');
- $breadcrumb = array_reverse($breadcrumb);
-
- return $breadcrumb;
+ $term = $attributes['taxonomy_term'];
+ // @todo This overrides any other possible breadcrumb and is a pure
+ // hard-coded presumption. Make this behavior configurable per
+ // vocabulary or term.
+ $breadcrumb = array();
+ while ($parents = taxonomy_term_load_parents($term->id())) {
+ $term = array_shift($parents);
+ $breadcrumb[] = $this->l($term->label(), 'taxonomy.term_page', array('taxonomy_term' => $term->id()));
}
+ $breadcrumb[] = $this->l($this->t('Home'), '<front>');
+ $breadcrumb = array_reverse($breadcrumb);
+
+ return $breadcrumb;
}
}
diff --git a/core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php b/core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php
index f3ac82a..49dcad8 100644
--- a/core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Breadcrumb/BreadcrumbManagerTest.php
@@ -71,6 +71,10 @@ class BreadcrumbManagerTest extends UnitTestCase {
$attributes = array('key' => 'value');
$builder->expects($this->once())
+ ->method('applies')
+ ->will($this->returnValue(TRUE));
+
+ $builder->expects($this->once())
->method('build')
->will($this->returnValue($breadcrumb));
@@ -90,11 +94,16 @@ class BreadcrumbManagerTest extends UnitTestCase {
public function testBuildWithMultipleApplyingBuilders() {
$builder1 = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface');
$builder1->expects($this->never())
+ ->method('applies');
+ $builder1->expects($this->never())
->method('build');
$builder2 = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface');
$breadcrumb2 = array('<a href="/example2">Test2</a>');
$builder2->expects($this->once())
+ ->method('applies')
+ ->will($this->returnValue(TRUE));
+ $builder2->expects($this->once())
->method('build')
->will($this->returnValue($breadcrumb2));
@@ -117,12 +126,17 @@ class BreadcrumbManagerTest extends UnitTestCase {
public function testBuildWithOneNotApplyingBuilders() {
$builder1 = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface');
$builder1->expects($this->once())
- ->method('build')
- ->will($this->returnValue(NULL));
+ ->method('applies')
+ ->will($this->returnValue(FALSE));
+ $builder1->expects($this->never())
+ ->method('build');
$builder2 = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface');
$breadcrumb2 = array('<a href="/example2">Test2</a>');
$builder2->expects($this->once())
+ ->method('applies')
+ ->will($this->returnValue(TRUE));
+ $builder2->expects($this->once())
->method('build')
->will($this->returnValue($breadcrumb2));
@@ -147,6 +161,9 @@ class BreadcrumbManagerTest extends UnitTestCase {
public function testBuildWithInvalidBreadcrumbResult() {
$builder = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface');
$builder->expects($this->once())
+ ->method('applies')
+ ->will($this->returnValue(TRUE));
+ $builder->expects($this->once())
->method('build')
->will($this->returnValue('invalid_result'));