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 模板中执行树枝逻辑,但我遇到了同样的问题。

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

[添加一个新答案,因为这与我之前的方法完全不同]

如果基于 CSS 的解决方案是可以接受的,这似乎可以正常工作:

.page-node-type-press-release {
  a[data-drupal-link-system-path="press-room/press-releases"] {
    // active CSS styles here
  }
}
于 2016-03-02T22:19:28.310 回答
0

我尝试将活动路径声明为自定义菜单块的一部分,即使这样我声明的路径也会被缓存。假设它与“无法设置活动链接 - 如果您需要更多控制权则覆盖服务”有关。这个 changelog中的声明,尽管为什么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 回答