Chris@0: nodeStorage = $entity_type_manager->getStorage('node'); Chris@0: $this->account = $account; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function applies(RouteMatchInterface $route_match) { Chris@0: $node = $route_match->getParameter('node'); Chris@0: return $node instanceof NodeInterface && !empty($node->book); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function build(RouteMatchInterface $route_match) { Chris@0: $book_nids = []; Chris@0: $breadcrumb = new Breadcrumb(); Chris@0: Chris@0: $links = [Link::createFromRoute($this->t('Home'), '')]; Chris@0: $book = $route_match->getParameter('node')->book; Chris@0: $depth = 1; Chris@0: // We skip the current node. Chris@0: while (!empty($book['p' . ($depth + 1)])) { Chris@0: $book_nids[] = $book['p' . $depth]; Chris@0: $depth++; Chris@0: } Chris@0: $parent_books = $this->nodeStorage->loadMultiple($book_nids); Chris@0: if (count($parent_books) > 0) { Chris@0: $depth = 1; Chris@0: while (!empty($book['p' . ($depth + 1)])) { Chris@0: if (!empty($parent_books[$book['p' . $depth]]) && ($parent_book = $parent_books[$book['p' . $depth]])) { Chris@0: $access = $parent_book->access('view', $this->account, TRUE); Chris@0: $breadcrumb->addCacheableDependency($access); Chris@0: if ($access->isAllowed()) { Chris@0: $breadcrumb->addCacheableDependency($parent_book); Chris@0: $links[] = Link::createFromRoute($parent_book->label(), 'entity.node.canonical', ['node' => $parent_book->id()]); Chris@0: } Chris@0: } Chris@0: $depth++; Chris@0: } Chris@0: } Chris@0: $breadcrumb->setLinks($links); Chris@0: $breadcrumb->addCacheContexts(['route.book_navigation']); Chris@0: return $breadcrumb; Chris@0: } Chris@0: Chris@0: }