Drupal → Добавить в хлебные крошки заголовок текущей страницы

12.06.2018

Так советует делать официальная документация:

// THEMENAME.theme

use Symfony\Cmf\Component\Routing\RouteObjectInterface;

/**
 * Preprocess function for breadcrumb.html.twig.
 */
function THEMENAME_preprocess_breadcrumb(array &$variables): void {
  if ($variables['breadcrumb']) {
    $request = \Drupal::request();
    $route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT);
    $page_title = \Drupal::service('title_resolver')->getTitle($request, $route);

    $variables['breadcrumb'][] = ['text' => $page_title];
    $variables['#cache']['contexts'][] = 'url';
  }
}

Минус в том, что из-за кэш-контекста url, блок с крошками будет генерироваться для каждой страницы сайта, тогда как по умолчанию он генерируется один раз для родительского раздела, а для дочерних страниц берётся из кэша. Поэтому вот более правильный вариант с ленивым билдером:

// THEMENAME.theme

use Symfony\Cmf\Component\Routing\RouteObjectInterface;

/**
 * Preprocess function for breadcrumb.html.twig.
 */
function THEMENAME_preprocess_breadcrumb(array &$vars): void {
  if ($vars['breadcrumb']) {
    $vars['breadcrumb'][] = [
      'text' => [
        '#lazy_builder' => [
          '\Drupal\THEMENAME\TrustedCallbacks::breadcrumbPageTitleLazyBuilder',
          []
        ],
        '#create_placeholder' => TRUE,
      ]
    ];
  }
}
// src/TrustedCallbacks.php

namespace Drupal\THEMENAME;

use Drupal\Core\Security\TrustedCallbackInterface;

class TrustedCallbacks implements TrustedCallbackInterface {

  /**
   * {@inheritDoc}
   */
  public static function trustedCallbacks(): array {
    return [
      'breadcrumbPageTitleLazyBuilder',
    ];
  }

  /**
   * Breadcrumb page title lazy builder.
   */
  public static function breadcrumbPageTitleLazyBuilder(): array {
    $request = \Drupal::request();
    $route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT);
    $page_title = \Drupal::service('title_resolver')->getTitle($request, $route);
    return is_array($page_title) ? $page_title : ['#markup' => $page_title];
  }

}
Написанное актуально для
Drupal 8+
Похожие записи

Комментарии

Константа RouteObjectInterface::ROUTE_NAME теперь предоставляется \Drupal\Core\Routing\RouteObjectInterface.

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