Drupal 8: Программное создание хлебных крошек
Блог

Drupal 8: Программное создание хлебных крошек

Статья о том, как самостоятельно создавать хлебные крошки в Drupal 8.
9 комментариев
Опубликовано 02.09.2016
4 мин.

В Drupal 8 хлебные крошки из коробки покрывают, наверное, 99% необходимого. Я даже не смог придумать нормального примера для гайда, так как все разруливали хлебные крошки из ядра самостоятельно. Если кому интересно, этим занимается PathBasedBreadcrumbBuilder. Иными словами, если вы будете генерировать URL для всего на сайте иерархические /category-name/content-name, то Drupal сам разрулит и установит хлебные крошки. В иных случаях можно написать свои, и делается это легче простого.

Хлебные крошки в D8 - это сервис, который, в свою очередь, является классом, у которого всего 2 метода applies() и build(). Звучит знакомо? А то как же, программное переключение темы работает по тому же принципу. Первый отвечает за простую логику, должен текущий сервис хлебных крошек работать на данной странице или нет, и если ответ положительный, то мы генерируем хлебные крошки.

Я не знаю даже что ещё тут рассказать, ибо всё настолько просто, что я просто приведу код с примером и небольшими комментариями. Напишу лишь небольшую заметку о том что он делает. У меня есть на сайте тип материала article, а также словарь таксономии с категориями. Соответственно у article есть поле field_category, которое ссылается на нужную категорию. Данный код создает хлебные крошки следующего вида: Главная -> Категория. Этот код потребуется только если у вас не иерархические URL, или у материала адрес системного вида node/{NID}. Если бы был иерархический - то ничего бы писать и не пришлось.

Объявляем сервис dummy.service.yml
services:
  dummy.article_breadcrumb:
    class: Drupal\dummy\ArticleBreadcrumbBuilder
    arguments: []
    tags:
      - { name: breadcrumb_builder, priority: 10 }
Листинг /src/ArticleBreadcrumbBuilder.php
<?php

/**
 * @file
 * Contains Drupal\dummy\ArticleBreadcrumbBuilder.
 */

namespace Drupal\dummy;

use Drupal\Core\StringTranslation\StringTranslationTrait;
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\taxonomy\Entity\Term;

/**
 * Class ArticleBreadcrumbBuilder.
 */
class ArticleBreadcrumbBuilder implements BreadcrumbBuilderInterface {
  # Необходимо чтобы использовать $this->t().
  use StringTranslationTrait;

  /**
   * {@inheritdoc}
   */
  public function applies(RouteMatchInterface $route_match) {
    $node = $route_match->getParameter('node');
    # Только если мы находимся на странице сущности node типа article.
    return $node instanceof NodeInterface && $node->getType() == 'article';
  }

  /**
   * {@inheritdoc}
   */
  public function build(RouteMatchInterface $route_match) {
    $breadcrumb = new Breadcrumb();
    $node = $route_match->getParameter('node');
    # Добавляем первую крошку на главную страницу.
    $links = [Link::createFromRoute($this->t('Home'), '<front>')];
    # Вторую крошку добавляем если категория задана в поле field_category.
    if (!$node->field_category->isEmpty()) {
      $tid = $node->field_category->target_id;
      $category_term = Term::load($tid);
      # Добавляем хлебную крошку на страницу термина.
      $links[] = Link::createFromRoute($category_term->name->value, 'entity.taxonomy_term.canonical', ['taxonomy_term' => $tid]);
    }
    # Указываем контекст для кэширования данной хлебной крошки. В нашем случае
    # будет кэшироваться только для текущего адреса url.
    $breadcrumb->addCacheContexts(['url.path']);
    return $breadcrumb->setLinks($links);
  }
}

P.s. В Drupal 8, получается, что задавать хлебные крошки особо то и не придется, только для очень специфичных случаев. А я боялся, как же я буду жить без замечательного модуля Path Breadcrumbs, а оно вон как :) Он даже по факту и не нужен уже.

Код прилагаю.

Прикрепленные файлы
Drupal
Drupal 8
хлебные крошки
небольшой уютный чатик

Комментарии

А
Александр
пт, 09/09/2016 - 12:33

Как у тебя работают крошки из коробки? Что то писал под них или где то задавал? Какая версия Drupal? А то у меня что то не работают

N
Niklan Александр
пт, 09/09/2016 - 13:37

Drupal 8 из коробки крошки составляются по адресу. Как я и указал в статье, там используется PathBasedBreadcrumbBuilder

Он составляет хлебные крошки на основе адреса текущего пути.

/catalog/category-name/product-name

Следовательно друпал постепенно соберет крошки из пути:

  • Главная - по дефолту.
  • /catalog - добавит крошку на данный адрес + заголовок данной страницы
  • /catalog/category-name - ссылка на страницу + её заголовок.

На текущую не ссылается. Для этого достаточно pathauto или руками проконтролировать иерархию путей.

А
Алексей
пн, 08/28/2017 - 16:10

Добрый день! Подскажите пожалуйста, а возможно ли сделать так, чтобы показывался title текущей страницы в хлебных крошках? (в виде текста, не ссылки)

B
Boolboost Boolboost
пт, 01/26/2018 - 14:02

Срезало текст, пробелы перед и после "<", ">" нужно удалить.

С route "< none >" выводит чисто текст без ссылки.

$links[] = Link::createFromRoute($title, '< none >');

B
Boris
вт, 09/12/2017 - 12:15

Добрый день! Ваш модуль хорошо работает. Сейчас выводится только один термин из field_category. У меня это самый последний дочерний в иерархии таксономии. А как вывести еще и все родительские термины в хлебных крошках?

D
Dmitry
вт, 04/16/2019 - 11:58

В смысле пример не придумать? Банальная ситуация – Views выводит на страницу материалы, с этих материалов нужно вернуться на страницу представления. Список проектов, документов, партнеров – вся вот эта чепуха, которая есть на каждом корпоративном сайте.