|
<?php |
|
|
|
/** |
|
* @file |
|
* Contains \Drupal\taxonomy\TermBreadcrumbBuilder. |
|
*/ |
|
|
|
namespace Drupal\taxonomy; |
|
|
|
use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface; |
|
use Drupal\Core\Breadcrumb\Breadcrumb; |
|
use Drupal\Core\Entity\EntityManagerInterface; |
|
use Drupal\Core\Link; |
|
use Drupal\Core\Routing\RouteMatchInterface; |
|
use Drupal\Core\StringTranslation\StringTranslationTrait; |
|
|
|
/** |
|
* Provides a custom taxonomy breadcrumb builder that uses the term hierarchy. |
|
*/ |
|
class TermBreadcrumbBuilder implements BreadcrumbBuilderInterface { |
|
use StringTranslationTrait; |
|
|
|
/** |
|
* The entity manager. |
|
* |
|
* @var \Drupal\Core\Entity\EntityManagerInterface |
|
*/ |
|
protected $entityManager; |
|
|
|
/** |
|
* The taxonomy storage. |
|
* |
|
* @var \Drupal\Taxonomy\TermStorageInterface |
|
*/ |
|
protected $termStorage; |
|
|
|
/** |
|
* Constructs the TermBreadcrumbBuilder. |
|
* |
|
* @param \Drupal\Core\Entity\EntityManagerInterface $entityManager |
|
* The entity manager. |
|
*/ |
|
public function __construct(EntityManagerInterface $entityManager) { |
|
$this->entityManager = $entityManager; |
|
$this->termStorage = $entityManager->getStorage('taxonomy_term'); |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function applies(RouteMatchInterface $route_match) { |
|
return true; |
|
return $route_match->getRouteName() == 'entity.taxonomy_term.canonical' |
|
&& $route_match->getParameter('taxonomy_term') instanceof TermInterface; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function build(RouteMatchInterface $route_match) { |
|
$breadcrumb = new Breadcrumb(); |
|
$breadcrumb->addLink(Link::createFromRoute($this->t('Home'), '<front>')); |
|
$term = $route_match->getParameter('taxonomy_term'); |
|
// dsm($route_match->getParameter('node')->field_lex_site_nav->referencedEntities()[0]); |
|
// Breadcrumb needs to have terms cacheable metadata as a cacheable |
|
// dependency even though it is not shown in the breadcrumb because e.g. its |
|
// parent might have changed. |
|
$term = $route_match->getParameter('node')->field_lex_site_nav->referencedEntities()[0]; |
|
$breadcrumb->addCacheableDependency($term); |
|
// @todo This overrides any other possible breadcrumb and is a pure |
|
// hard-coded presumption. Make this behavior configurable per |
|
// vocabulary or term. |
|
$parents = $this->termStorage->loadAllParents($term->id()); |
|
|
|
foreach (array_reverse($parents) as $term) { |
|
$term = $this->entityManager->getTranslationFromContext($term); |
|
$breadcrumb->addCacheableDependency($term); |
|
$breadcrumb->addLink(Link::createFromRoute($term->getName(), 'entity.taxonomy_term.canonical', array('taxonomy_term' => $term->id()))); |
|
} |
|
// dsm($breadcrumb); |
|
|
|
// This breadcrumb builder is based on a route parameter, and hence it |
|
// depends on the 'route' cache context. |
|
$breadcrumb->addCacheContexts(['route']); |
|
|
|
return $breadcrumb; |
|
} |
|
|
|
} |