Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 3 |
CRAP | |
0.00% |
0 / 35 |
| BookBreadcrumbBuilder | |
0.00% |
0 / 1 |
|
0.00% |
0 / 3 |
110 | |
0.00% |
0 / 35 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| applies | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 3 |
|||
| build | |
0.00% |
0 / 1 |
56 | |
0.00% |
0 / 28 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\book\BookBreadcrumbBuilder. | |
| */ | |
| namespace Drupal\book; | |
| use Drupal\Core\Access\AccessManagerInterface; | |
| use Drupal\Core\Breadcrumb\Breadcrumb; | |
| use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface; | |
| use Drupal\Core\Entity\EntityManagerInterface; | |
| use Drupal\Core\Link; | |
| use Drupal\Core\Routing\RouteMatchInterface; | |
| use Drupal\Core\Session\AccountInterface; | |
| use Drupal\Core\StringTranslation\StringTranslationTrait; | |
| use Drupal\node\NodeInterface; | |
| /** | |
| * Provides a breadcrumb builder for nodes in a book. | |
| */ | |
| class BookBreadcrumbBuilder implements BreadcrumbBuilderInterface { | |
| use StringTranslationTrait; | |
| /** | |
| * The node storage. | |
| * | |
| * @var \Drupal\Core\Entity\EntityStorageInterface | |
| */ | |
| protected $nodeStorage; | |
| /** | |
| * The access manager. | |
| * | |
| * @var \Drupal\Core\Access\AccessManagerInterface | |
| */ | |
| protected $accessManager; | |
| /** | |
| * The current user account. | |
| * | |
| * @var \Drupal\Core\Session\AccountInterface | |
| */ | |
| protected $account; | |
| /** | |
| * Constructs the BookBreadcrumbBuilder. | |
| * | |
| * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager | |
| * The entity manager service. | |
| * @param \Drupal\Core\Access\AccessManagerInterface $access_manager | |
| * The access manager. | |
| * @param \Drupal\Core\Session\AccountInterface $account | |
| * The current user account. | |
| */ | |
| public function __construct(EntityManagerInterface $entity_manager, AccessManagerInterface $access_manager, AccountInterface $account) { | |
| $this->nodeStorage = $entity_manager->getStorage('node'); | |
| $this->accessManager = $access_manager; | |
| $this->account = $account; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function applies(RouteMatchInterface $route_match) { | |
| $node = $route_match->getParameter('node'); | |
| return $node instanceof NodeInterface && !empty($node->book); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function build(RouteMatchInterface $route_match) { | |
| $book_nids = array(); | |
| $breadcrumb = new Breadcrumb(); | |
| $links = array(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', array('node' => $parent_book->id())); | |
| } | |
| } | |
| $depth++; | |
| } | |
| } | |
| $breadcrumb->setLinks($links); | |
| $breadcrumb->addCacheContexts(['route.book_navigation']); | |
| return $breadcrumb; | |
| } | |
| } |