modules/quanthub_breadcrumbs/src/ContentBreadcrumbBuilder.php (49 lines of code) (raw):
<?php
namespace Drupal\quanthub_breadcrumbs;
use Drupal\Core\Breadcrumb\Breadcrumb;
use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
use Drupal\Core\Entity\EntityTypeManager;
use Drupal\Core\Link;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\node\NodeInterface;
use Drupal\views\Views;
/**
* Provides a breadcrumb builder for Content types.
*
* Based on the mapping content type => general content type view page.
*/
class ContentBreadcrumbBuilder implements BreadcrumbBuilderInterface {
use StringTranslationTrait;
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
private mixed $entityTypeManager;
/**
* Constructs a ContentBreadcrumbBuilder.
*
* @param \Drupal\Core\Entity\EntityTypeManager $entity_type_manager
* The entity type manager.
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
public function __construct(EntityTypeManager $entity_type_manager) {
$this->entityTypeManager = $entity_type_manager->getStorage('node');
}
/**
* Mapping content type and general View page ID for this content type.
*/
public function getContentTypeMap(): array {
return [
'dataset' => 'search_datasets.navigator',
'external_dataset' => 'search_datasets.navigator',
'press_release' => 'search_publications.navigator',
'news' => 'search_news.navigator',
'release' => 'releases.page_1',
];
}
/**
* {@inheritdoc}
*/
public function applies(RouteMatchInterface $route_match): bool {
$node = $route_match->getParameter('node');
$contentTypeMap = $this->getContentTypeMap();
return $node instanceof NodeInterface && array_key_exists($node->getType(), $contentTypeMap);
}
/**
* {@inheritdoc}
*/
public function build(RouteMatchInterface $route_match): Breadcrumb {
$breadcrumb = new Breadcrumb();
/** @var \Drupal\node\Entity\Node $node */
$node = $route_match->getParameter('node');
$breadcrumb->addLink(Link::createFromRoute($this->t('Home'), '<front>'));
$contentTypeMap = $this->getContentTypeMap();
if (isset($contentTypeMap[$node->getType()])) {
$viewMapId = $contentTypeMap[$node->getType()];
[$viewId, $displayId] = explode('.', $viewMapId);
$view = Views::getView($viewId);
$view->setDisplay($displayId);
$viewTitle = $view->getTitle();
$breadcrumb->addLink(Link::createFromRoute($viewTitle, 'view.' . $contentTypeMap[$node->getType()]));
}
$breadcrumb->addLink(Link::createFromRoute($node->getTitle(), '<none>'));
$breadcrumb->addCacheContexts(['route', 'url.path', 'languages']);
$breadcrumb->addCacheTags(['node:' . $node->id()]);
return $breadcrumb;
}
}