Drupal 8 & Commerce 2 & Easy Breadcrumb - добавление родителей терминов в хлебные крошки

Категория: Drupal
Дата публикации: 17 сентября, 2020 - 09:04
Последнее изменение: 17 сентября, 2020 - 09:14

По-умолчанию модуль Easy Breadcrumb в Drupal 8 не умеет подставлять всю цепочку родителей терминов таксономии в товары Commerce 2, и хлебные крошки выглядят как "Главная - Товар", в то время, как корректный вид крошек должен быть таким "Главная - Категория - Подкатегория - Товар". Решить эту проблему можно кастомным модулем, переписав значения крошек:

"field_category" - название поля с терминами, его нужно заменить на ваше.

use Drupal\Core\Breadcrumb\Breadcrumb;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Link;
use Drupal\taxonomy\Entity\Term;

/**
* Implements hook_system_breadcrumb_alter().
*/
function custom_module_system_breadcrumb_alter(Breadcrumb &$breadcrumb, RouteMatchInterface $route_match, array $context) {
  if($breadcrumb && !\Drupal::service('router.admin_context')->isAdminRoute()) {
    $commerce_page = \Drupal::routeMatch()->getParameter('commerce_product');
    $links = $breadcrumb->getLinks();
    if($commerce_page && $links){
      $breadcrumb = new Breadcrumb();
      $breadcrumb->addLink(Link::createFromRoute(t('Home'), '<front>'));

      $commerce_product = \Drupal::request()->get('commerce_product');
      $tid = $commerce_product->get('field_category')->getString();
      $term = Term::load($tid);
      $parents = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadAllParents($tid);
      $aliasManager = \Drupal::service('path.alias_manager');
      if($parents){
        $breadcrumb_list = [];
        foreach ($parents as $k => $term) {
          $breadcrumb_list[$k]['name'] = $term->getName();
          $breadcrumb_list[$k]['tid'] = $term->id();
        }
        foreach(array_reverse($breadcrumb_list) as $bread){
          $breadcrumb->addLink(Link::createFromRoute($bread['name'], 'entity.taxonomy_term.canonical', ['taxonomy_term' => $bread['tid']]));
        }
        $request = \Drupal::request();
        $route_match = \Drupal::routeMatch();
        $title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());
        $breadcrumb->addLink(Link::createFromRoute($title, '<nolink>'));
      }
    }
  }
}

Используемые материалы:
https://makedrupaleasy.com/articles/drupal-8-how-create-simple-custom-mo...
https://drupal.stackexchange.com/questions/220931/how-do-i-modify-the-br...
https://kevinquillen.com/manually-add-breadcrumb-links-drupal-8

Добавить комментарий