function BookBreadcrumbBuilder::build

Same name in other branches
  1. 9 core/modules/book/src/BookBreadcrumbBuilder.php \Drupal\book\BookBreadcrumbBuilder::build()
  2. 10 core/modules/book/src/BookBreadcrumbBuilder.php \Drupal\book\BookBreadcrumbBuilder::build()
  3. 11.x core/modules/book/src/BookBreadcrumbBuilder.php \Drupal\book\BookBreadcrumbBuilder::build()

Overrides BreadcrumbBuilderInterface::build

File

core/modules/book/src/BookBreadcrumbBuilder.php, line 58

Class

BookBreadcrumbBuilder
Provides a breadcrumb builder for nodes in a book.

Namespace

Drupal\book

Code

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

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.