Breadcrumb Builder

Breadcrumb Builder (строитель хлебных крошек) — сервисы с меткой breadcrumb_builder позволяющие программно задавать хлебные крошки на сайте.

Введение

Breadcrumb Builder сервисы используются Drupal для формирования хлебных крошек на странице.

Задача Breadcrumb Builder — сформировать массив из ссылок для хлебных крошек в том порядке, в котором они должны быть отображены.

При помощи данных сервисов вы можете контролировать то, какие ссылки, в каком порядке и как будут отображены.

Стандартные Breadcrumb Builder

Drupal ядро предоставляет следующие строители хлебных крошек:

  • system.breadcrumb.default: Строитель хлебных крошек от модуля system. Используется по умолчанию где не задействованы прочие Breadcrumb Builder. Устанавливает хлебные крошки на основе пути страницы и её иерархии.
  • book.breadcrumb: Строитель крошек от модуля book. Устанавливает хлебные крошки для страниц с подшивками на основе иерархии подшивки текущего материала.
  • comment.breadcrumb: Строитель крошек от модуля comment. Устанавливает хлебные крошки для страниц «ответ на комментарий».
  • forum.breadcrumb.node: Строитель крошек от модуля forum. Устанавливает хлебные крошки для страницы топика форума.
  • forum.breadcrumb.listing: Строитель крошек от модуля forum. Устанавливает хлебные крошки на страницах листингов топиков форума.
  • help.breadcrumb: Строитель крошек от модуля help_topics. Устанавливает хлебные крошки на страницах с документацией.
  • taxonomy_term.breadcrumb: Строитель крошек от модуля taxonomy. Устанавливает хлебные крошки на страницах терминах учитывая иерархию термина в словаре.

system.breadcrumb.default

Стандартный строитель хлебных крошек, который будет применяться всегда, если не задан иной с более высоким приоритетом для конкретного запроса. Данный строитель хлебных крошек собирает их на основе пути, по которому обратились к сайту.

Например, если было обращение к новости с адресом /foo/bar/news-title, то он разобьет данный путь на 2 части:

  • /foo/bar
  • /foo

Далее, он будет проверять каждый из этих путей, и если они валидны и существуют, будет получать для них заголовки. Например, если /foo является страницей с заголовком «Foo», а /foo/bar странице с заголовком «Bar», то Drupal посмотрит следующий массив хлебных крошек:

  • Главная (/)
  • Foo (/foo)
  • Bar (/foo/bar)

Таким образом, Drupal может автоматически собирать хлебные крошки на основе иерархии в пути.

Заметка

Обратите внимание, что текущий путь не добавляется в хлебные крошки по умолчанию.

Создание Breadcrumb Builder

Строитель хлебных крошек состоит из класса реализующего Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface, который объявлен как сервис с меткой breadcrumb_builder.

От строителя требуется объявить два метода:

  • ::applies(): Должен вернуть логическое значение, применим ли в текущий момент данный строитель или нет.
  • ::build(): Возвращает объект Drupal\Core\Breadcrumb\Breadcrumb содержащий в себе массив из ссылок хлебных крошек.

Если несколько строителей хлебных крошек подходят для одного запроса, будет выбран тот, у которого выше приоритет сервиса.

Пример построителя хлебных крошек, который для содержимого типа news будет задавать хлебные состоящие из ссылки на главную страницу и ссылку на текущую страницу.

<?php

namespace Drupal\example;

use Drupal\Core\Breadcrumb\Breadcrumb;
use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
use Drupal\Core\Link;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\node\NodeInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;

/**
 * Provides breadcrumb builder for news content.
 */
class NewsBreadcrumbBuilder implements BreadcrumbBuilderInterface {

  /**
   * {@inheritdoc}
   */
  public function applies(RouteMatchInterface $route_match) {
    $node = $route_match->getParameter('node');
    // Only for "news" content types.
    return $node instanceof NodeInterface && $node->bundle() == 'news';
  }

  /**
   * {@inheritdoc}
   */
  public function build(RouteMatchInterface $route_match) {
    $breadcrumb = new Breadcrumb();
    // News entity.
    $node = $route_match->getParameter('node');
    $links = [];
    // Frontpage link.
    $links[] = Link::createFromRoute(new TranslatableMarkup('Home'), '<front>');
    // News page link.
    $links[] = $node->toLink();
    // Set cache contexts so each page has different set of breadcrumbs.
    $breadcrumb->addCacheContexts(['url.path']);
    return $breadcrumb->setLinks($links);
  }

}

Сторонние решения

  • Easy Breadcrumb — расширяет стандартный system.breadcrumb.default и собирает хлебные крошки на основе текущего пути. В отличие от стандартного, добавляет страницу настроек, где можно настроить поведение сборки крошек, например, добавлять крошку на текущую страницу, скрывать крошку на главную или поменять её текст и т.д.

Ссылки

Помощь и обратная связь

Если вы обнаружили ошибку или хотите внести улучшения, и желаете внести изменения самостоятельно при помощи Pull Request
Если вы желаете предложить улучшение для этого документа

Обратиться за помощью

Если вы не нашли то что искали, воспользуйтесь поиском.

Если вам нужна помощь с чем-то конкретным, обратитесь к сообществу.