【问题标题】:How do I dynamically set the active menu item?如何动态设置活动菜单项?
【发布时间】:2010-06-21 18:00:16
【问题描述】:

例如,我有“node/31”。如果查看 node/31,我希望 drupal 将菜单活动项设置为“galleries/lastgallery”。怎么做?

<?php
function custom_nodeapi (&$node, $op, $a3 = NULL, $a4  = NULL){
    if ($op == 'view' && $node->nid == 31) {
           ???
        }
}
?>

更新: 我知道我可以使用menu_set_active_item。但在这种情况下,选项卡(查看/编辑等选项卡)将不会显示。我认为应该用menu_set_active_trails 完成,或者可能是menu_get_item/menu_set_item,但我不知道具体是什么。

【问题讨论】:

    标签: drupal drupal-6 menu


    【解决方案1】:

    出于类似目的,我使用了menu_set_item()。您应该保留$path 参数NULL 并将'galleries/lastgallery' 的内部路径的菜单项用作$router_item

    function custom_nodeapi(&$node, $op, $a3 = NULL, $a4  = NULL) {
      if ($op == 'view' && $node->nid == 31) {
        $path = drupal_get_normal_path('galleries/lastgallery');
        if($path && $menu_item = menu_get_item($path)) {
          menu_set_item(NULL, $menu_item);
        }
      }
    }
    

    【讨论】:

    • menu_tree_set_path() 是一个更好的选择。
    • 确实,但是在 Drupal 7 中引入了 menu_tree_set_path(),问题是 Drupal 6。
    【解决方案2】:

    正如 tmsimont 指出的那样,使用 menu_set_item() 有副作用...

    快速查看menu_set_item()menu_get_item() 会发现它们触发了钩子和数据库调用()。不完美。

    如果您使用的是 Drupal 7.9+,有一个名为 menu_tree_set_path() 的新函数可以解决问题:

    menu_tree_set_path('user-menu', 'shopping-cart');
    

    第一个参数是菜单名称,后跟要选择的路径。

    注意:这不会应用 .active 类,而是应用 .active-trail,因此您必须更新 CSS 以适应两者!

    【讨论】:

    • 这不适用于首页...我尝试使用 作为路径但没有成功。
    • 要使用别名,您可以将路径包装在drupal_get_normal_path() 中,例如:menu_tree_set_path('my-menu', drupal_get_normal_path('&lt;front&gt;'))。让我知道它是否有效,我会更新答案。
    【解决方案3】:

    我知道我在这里玩得有点晚了,这已经有了答案,但我想我会发布这个以防它对某人有所帮助

    参考menu_set_item(NULL, $menu_item)杀死本地任务的问题——不限于此。

    我发现在使用讨论模块时它没有加载块。我认为问题在于通过执行以下操作:

    $path = drupal_get_normal_path('galleries/lastgallery');
    $menu_item = menu_get_item($path);
    menu_set_item(NULL, $menu_item);
    

    您有效地告诉 drupal 您在不同的页面/项目上。

    对我有用的解决方案是这样的:

    $menu_item = menu_get_item();
    $menu_item['href'] = 'galleries/lastgallery';
    menu_set_item(NULL, $menu_item);
    

    这似乎只是与 href 一起玩,不理会 rest,因此本地任务仍然有效,disqus 也是如此。

    【讨论】:

      【解决方案4】:

      我不确定您是否要更改活动项目以影响加载哪个页面(这需要在页面加载的早期完成以产生影响),或者您是否只是想从表面上突出显示“ gallery/lastgallery”链接,就像它是活动链接一样。

      如果您只想让它看起来好像“画廊/上一个画廊”链接是活动链接,可以通过覆盖template_preprocess_page() 函数来完成。在那里,您可以重建主要(或次要)菜单并添加逻辑以将“galleries/lastgallery”链接提供给“active”(和/或“active-trail”)类。

      【讨论】:

        【解决方案5】:

        通过结合使用 menu_set_active_item() 和 menu_execute_active_handler()

        我花了一点时间才意识到我需要两者。我正在使用自定义菜单处理程序从 Solr 过滤器组合创建“干净的 url”。 $path 变量是我隐藏的内部 drupal 路径,菜单处理程序是用户在浏览器中看到的。

        然后我使用 custom_url_rewrite_outbound() 将网站上的所有相关搜索链接转换为我想要的格式。

        以下是代码的相关部分。我不确定这是否是您正在寻找的东西,但它可能会给您一些想法。我对您可以控制用户看到的内容以及 Drupal 内部了解的内容的程度印象深刻。正确的菜单项处于活动状态,其他一切都按预期工作。

        function myModule_search_menu(){
          $items['browse/%menu_tail'] = array(
            'title' => 'browse',
            'description' => 'Search Replacement with clean urls.',
            'page callback' => 'myModule_search_browse',
            'access arguments' => array('search content'),
            );
        }
        
        function myModule_search_browse(){
           /* do lots of fancy stuff */
           menu_set_active_item($path);
           return menu_execute_active_handler($path);
        }
        

        【讨论】:

          【解决方案6】:

          你可以试试这个:

          function menu_tree_set_path($menu_name, $path = NULL)
          

          【讨论】:

            【解决方案7】:

            mongolito404 的回答几乎对我有用。

            但是它会杀死你的本地任务(标签)

            因此,如果您在执行 mongolito404 所说的操作之前调用任务,那么由于某种原因它可以工作......就像这样:

            <?php
            
                //call local tasks first
                menu_local_tasks(0);    
            
                //then do what mongolito did    
                $path = drupal_get_normal_path('galleries/lastgallery');
                if($path && $menu_item = menu_get_item($path)) {
                  menu_set_item(NULL, $menu_item);
                }
            ?>
            

            【讨论】:

              【解决方案8】:

              你也可以使用hook_translated_menu_link_alter()

              /**
               * Implements hook_translated_menu_link_alter()
               */
              function Module_translated_menu_link_alter(&$item, $map) {
              
                  if ($item['menu_name'] == 'menu-name') {
              
                      //check first two arg from url
                      $path = arg(0)."/".arg(1);
              
                      //add class active-trail if path match
                      if (strpos($item['link_path'], $path) !== false) {
                          $item['in_active_trail'] = true;
              
                      }
              
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 2020-08-10
                • 1970-01-01
                • 1970-01-01
                • 2014-04-10
                • 2017-08-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多