Drupal 8.2.3
Есть нода:
Апельсины
В этой ноде есть поле множественного выбора field_category, которое ссылается на термины таксономии:
Еда > Фрукты
Цвета > Жёлтое
Breadcrumb, насколько я понимаю, формируется на основе синонима ноды, который создаётся в pathauto. Я могу сделать шаблон breadcrumb'а:
[node:field_category]/[node:title]
Однако тогда формируется синоним:
/fructi-geltoe/apelsini
Что breadcrumb'ом вообще никак не понимается...
Я могу сделать ссылку:
[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, потому что ссылка(синоним) на ноду должна быть одна единственная (возможно что-то я не так понял ).
Тогда я подумал, что наверное надо изменить сам breadcrumb таким образом:
Если пользователь переходит со страницы:
/eda/fructi
То у него breadcrumb будет:
Главная > Еда > Фрукты
Если со страницы:
/cveta/geltoe
То breadcrumb должен быть:
Главная > Цвета > Жёлтое
Нашёл замечательную статью:
http://stdclass.com/blog/drupal-8-breadcrumb-builder-interface
В ней breadcrumb создаётся на основе "builder interface". Метод build выглядит таким образом:
// Создадим экземпляр класса 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) Может я вообще не тем путём пошёл? А то убью кучу времени и свой не особо умный мозг, а всё окажется зря
2) Ежели я пошёл верным путём - как можно получить и использовать ссылку страницы, с которой я перешёл на текущую страницу?