アクティブなトレイル機能を作成するための以下の機能があります。したがって、/blog を「親」として、/blog/mypost の投稿をすると、mypost でブログのリンクが強調表示されます。すべてのブログ投稿のメニュー項目を作成する必要はありません。問題は、キャッシュがオンになっている場合 (settings.local.php を使用せず、デバッグがオフになっている場合)、一部のページで getRequestUri が変更されないことです。ページによってはキャッシュされているようです。ページキャッシュをオフにしても問題なく動作しますが、これをキャッシュで動作させたいと思います。現在のパスを確認し、アクティブなクラスを適用するより良い方法はありますか?
function mytheme_preprocess_menu(&$variables, $hook) {
if($variables['theme_hook_original'] == 'menu__main'){
$node = \Drupal::routeMatch()->getParameter('node');
if($node){
$current_path = \Drupal::request()->getRequestUri();
$items = $variables['items'];
foreach ($items as $key => $item) {
// If current path starts with a part of another path i.e. a parent, set active to li.
if (0 === strpos($current_path, $item['url']->toString())) {
// Add active link.
$variables['items'][$key]['attributes']['class'] .= ' menu-item--active-trail';
}
}
}
}
}
また、これをモジュールに入れて、現在のパスを取得できるかどうかを確認してから、menu-main.twig.html テンプレートで twig ロジックを実行しようとしましたが、同じ問題があります。
function highlight_menu_sections_template_preprocess_default_variables_alter(&$variables) {
$variables['current_path'] = $_SERVER['REQUEST_URI'];
}