modules/quanthub_breadcrumbs/src/BooksBreadcrumbBuilder.php (68 lines of code) (raw):
<?php
namespace Drupal\quanthub_breadcrumbs;
use Drupal\Core\Breadcrumb\Breadcrumb;
use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
use Drupal\Core\Cache\CacheableDependencyInterface;
use Drupal\Core\Entity\EntityTypeManager;
use Drupal\Core\Language\LanguageInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Link;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\node\NodeInterface;
/**
* Provides a breadcrumb builder for Books.
*/
class BooksBreadcrumbBuilder implements BreadcrumbBuilderInterface {
use StringTranslationTrait;
/**
* The language manager service.
*
* @var \Drupal\Core\Language\LanguageManagerInterface
*/
protected $languageManager;
/**
* Constructs a BooksBreadcrumbBuilder.
*
* @param \Drupal\Core\Entity\EntityTypeManager $entity_type_manager
* The entity type manager.
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager.
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
public function __construct(
EntityTypeManager $entity_type_manager,
LanguageManagerInterface $language_manager,
) {
$this->entityTypeManager = $entity_type_manager->getStorage('node');
$this->languageManager = $language_manager;
}
/**
* {@inheritdoc}
*/
public function applies(RouteMatchInterface $route_match) {
$node = $route_match->getParameter('node');
if ($node instanceof NodeInterface) {
$bundle = $node->bundle();
return $bundle === 'book' || $bundle === 'book_content';
}
return FALSE;
}
/**
* {@inheritdoc}
*/
public function build(RouteMatchInterface $route_match): Breadcrumb {
$breadcrumb = new Breadcrumb();
$currentLanguage = $this->languageManager
->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)
->getId();
/** @var \Drupal\node\Entity\Node $node */
$node = $route_match->getParameter('node');
$breadcrumb->addLink(Link::createFromRoute($this->t('Home'), '<front>'));
if ($node->bundle() == 'book') {
// Book Name breadcrumb item for all children elements.
$bookId = $node->book['bid'];
$bookNode = $this->entityTypeManager->load($bookId);
if ($bookNode instanceof NodeInterface && $bookNode->hasTranslation($currentLanguage)) {
$breadcrumb->addLink($bookNode->getTranslation($currentLanguage)->toLink());
}
$breadcrumb->addCacheableDependency($bookNode);
}
if ($node->bundle() == 'book_content') {
// Get first referenced node.
$referencedPageId = $node->field_book_page_ref->first()->getString();
$referencedNode = $this->entityTypeManager->load($referencedPageId);
// Get book node by id from referenced node.
$bookId = $referencedNode->book['bid'];
if (!empty($bookId)) {
$bookNode = $this->entityTypeManager->load($bookId);
}
// Book Name item.
if ($bookNode instanceof NodeInterface && $bookNode->hasTranslation($currentLanguage)) {
$breadcrumb->addLink($bookNode->getTranslation($currentLanguage)->toLink());
}
// Book content node Title item.
$breadcrumb->addLink(Link::createFromRoute($node->getTitle(), '<none>'));
$breadcrumb->addCacheableDependency($bookNode);
}
$parameters = $route_match->getParameters();
foreach ($parameters as $parameter) {
if ($parameter instanceof CacheableDependencyInterface) {
$breadcrumb->addCacheableDependency($parameter);
}
}
$breadcrumb->addCacheContexts(['route', 'url.path', 'languages']);
return $breadcrumb;
}
}