Drupal 8, breadcrumb, нода в двух категориях

Главные вкладки

Аватар пользователя mildok mildok 15 декабря 2016 в 18:00

Drupal 8.2.3

Есть нода:
Апельсины

В этой ноде есть поле множественного выбора field_category, которое ссылается на термины таксономии:
Еда > Фрукты
Цвета > Жёлтое

Breadcrumb, насколько я понимаю, формируется на основе синонима ноды, который создаётся в pathauto. Я могу сделать шаблон breadcrumb'а:
[node:field_category]/[node:title]
Однако тогда формируется синоним:
/fructi-geltoe/apelsini
Что breadcrumb'ом вообще никак не понимается... Smile
Я могу сделать ссылку:
[node:field_category:0]/[node:title]

Однако тогда получаю breadcrumb у ноды:
Главная > Фрукты

А это значит, что если кто-нибудь перейдёт на ноду через меню:
Цвета > Жёлтое
То он очень удивится увидев, breadcrumb:
Главная > Фрукты

Я мог бы сделать много шаблонов синонимов, т.е. так:
[node:field_category:0]/[node:title]
[node:field_category:1]/[node:title]
[node:field_category:2]/[node:title]
[node:field_category:3]/[node:title]
...
[node:field_category:n]/[node:title]

Однако, неизвестно сколько будет этих всяких фруктов, цветов, цитрусовых, предметов... и т.п. категорий. А каждый раз при создании категорий создавать синоним - по-моему не очень хорошо.
Кроме того, насколько я понял - так делать грубейшая ошибка SEO, потому что ссылка(синоним) на ноду должна быть одна единственная (возможно что-то я не так понял Smile ).

Тогда я подумал, что наверное надо изменить сам breadcrumb таким образом:
Если пользователь переходит со страницы:
/eda/fructi
То у него breadcrumb будет:
Главная > Еда > Фрукты
Если со страницы:
/cveta/geltoe
То breadcrumb должен быть:
Главная > Цвета > Жёлтое

Нашёл замечательную статью:
http://stdclass.com/blog/drupal-8-breadcrumb-builder-interface

В ней breadcrumb создаётся на основе "builder interface". Метод build выглядит таким образом:

public function build(RouteMatchInterface $route_match) {
  // Создадим экземпляр класса Breadcrumb.
  $breadcrumb = new Breadcrumb();
  $breadcrumb->addCacheContexts(['url.path']);
  // Используя метод addLink добавим ссылку на главную страницу.
  $breadcrumb->addLink(Link::createFromRoute($this->t('Home'), '<front>'));
  // Получим значение параметра node.
  $node = $route_match->getParameter('node');
  // Получим значения поля field_category.
  /** var \Drupal\Core\Field\EntityReferenceFieldItemListInterface $category_field */
  $category_field = $node->field_category;
  $category = $category_field->referencedEntities();
  if (!empty($category)) {
    // Возьмём только первое значение из массива.
    $category = array_shift($category);
    // Добавим ссылку на полученный термин таксономии.
    $breadcrumb->addLink(Link::createFromRoute($category->label(), 'entity.taxonomy_term.canonical', ['taxonomy_term' => $category->id()]));
  }

  return $breadcrumb;
}

Насколько я понимаю, мне нужно будет доставать все значения из массива $category_field->referencedEntities(); и сравнивать со страницей, с которой я перешёл на текущую.

Я не очень умный - поэтому прежде чем, начать разбираться в хитросплетениях php+Drupal8 следующие полтора месяца, я хотел задать вопросы:
1) Может я вообще не тем путём пошёл? А то убью кучу времени и свой не особо умный мозг, а всё окажется зря Smile
2) Ежели я пошёл верным путём - как можно получить и использовать ссылку страницы, с которой я перешёл на текущую страницу?