Так советует делать официальная документация:
// 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.
Добавить комментарий