1

アクティブなトレイル機能を作成するための以下の機能があります。したがって、/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'];
}
4

3 に答える 3

2

あらゆる種類のことを長い間試した後、まさにこの問題に対処する優れたモジュールを見つけました。構成ではなく、インストールして実行するだけで機能します。

https://www.drupal.org/project/menu_trail_by_path

D7 と D8 の安定版。

于 2016-03-19T16:41:35.350 に答える
0

カスタム メニュー ブロックの一部としてアクティブ パスを宣言しようとしましたが、それでも宣言されたトレイルがキャッシュされます。「アクティブなリンクを設定する方法はありません - さらに制御が必要な場合は、サービスをオーバーライドしてください」に関連していると仮定します。しかし、なぜMenuTreeParameters- >setActiveTrail()存在するのかは誰にもわかりません。

好奇心旺盛な人のために (後でこれを検索するときにも!)、私のブロックの build() 関数を次に示します。

public function build() {
  $menu_tree = \Drupal::menuTree();
  $parameters = new MenuTreeParameters();
  $parameters->setRoot('menu_link_content:700c69e6-785b-4db7-be49-73188b47b5a3')->setMinDepth(1)->setMaxDepth(1)->onlyEnabledLinks();

  // An array of routes and menu_link_content ids to set as active
  $define_active_mlid = array(
    'view.press_releases.page_1' => 385
  );
  $route_name = \Drupal::request()->get(RouteObjectInterface::ROUTE_NAME);
  if (array_key_exists($route_name, $define_active_mlid)) {
    $menu_link = \Drupal::entityTypeManager()->getStorage('menu_link_content')->loadByProperties(array('id' => $define_active_mlid[$route_name]));
    $link = array_shift($menu_link);
    $parameters->setActiveTrail(array('menu_link_content:' . $link->uuid()));
  }

  $footer_tree = $menu_tree->load('footer', $parameters);
  $manipulators = array(
    array('callable' => 'menu.default_tree_manipulators:checkAccess'),
    array('callable' => 'menu.default_tree_manipulators:generateIndexAndSort'),
  );
  $tree = $menu_tree->transform($footer_tree, $manipulators);
  $menu = $menu_tree->build($tree);

  return array(
    'menu' => $menu,
  );
}
于 2016-03-02T22:10:54.980 に答える