Drupal 7中的高级菜单主题


15

我浏览了网络,如何对自定义菜单进行主题设置一点也不明显。我已经寻找了几个小时,却没有发现任何一篇文章可以说明创建菜单和自定义其输出从头到尾的过程。看来这是一个多阶段的过程:

  1. 通过Drupal界面创建菜单。
  2. template.php文件中创建一个主题函数以对输出进行主题化。
  3. 通过将此菜单添加为变量,使其暴露于模板文件(以某种方式)。
  4. theme在模板文件中的菜单上调用该函数。

1很容易做到,我遇到的问题是2、3和4。查看默认页面模板,我发现它在变量中公开了主菜单$main_menu。在页面的后面,您可以看到函数theme('links__system_main_menu', array('links' => $main_menu...,这意味着它正在某处寻找一个适当命名的主题函数,并使用它来生成输出。

我知道是否将function theme_links__system_main_menu(&$variables) {...}我的template.php文件放置在Drupal中,而不是使用该功能function theme_menu_links(&$variables) {...}

我不知道Drupal是如何链接使用该功能创建的自定义菜单的。例如,假设我创建了一个名为的菜单My Menu。我可以在template.php文件中创建以下功能,并以该菜单的输出为主题吗?function theme_links__system_my_menu(&$variables) {...}

另外,如何使该自定义菜单可用于模板文件?Drupal如何将$main_menu变量公开给page.tpl.php?

认为我在这里缺少的关键是如何将代表我的自定义菜单的变量嵌入模板页面。尽管在大多数情况下,创建菜单后我完全不知道该做什么。

谢谢您的帮助。

编辑:可能应该发布我在做什么。根据我对下面的BetaRide的评论,我需要将自定义HTML注入<li>菜单项的元素中。具体来说,我要添加Twitter Bootstrap图标。

Answers:


13

Drupal的菜单实现有些特殊,它并不总是按其应有的方式工作。

您可以看一下template_preprocess_page()的核心实现,以了解如何将Main Menu链接作为变量添加到页面模板。您必须在API文档中进行深入研究,但是在实现theme_preprocess_page()时要调用的函数是menu_navigation_links(),它将在菜单中返回一组链接。

查看Drupal核心的page.tpl.php文件的第106行,可以通过调用带有钩子“ links__system_main_menu” 的theme()函数来查看模板中主菜单链接的主题。

从理论上讲,通过遵循标准命名约定,该实现应该可以与自定义菜单重复。因此,在template.php中,您可能具有:

function THEMENAME_preprocess_page(&$variables){
  $variables['custom_menu'] = menu_navigation_links('menu-custom-menu');
}

function THEMENAME_links__menu_custom_menu(&$variables){
 //custom theme function here
}

在page.tpl.php中,您将添加如下内容:

<?php print theme('links__menu_custom_menu', array('links' => $custom_menu, 'attributes' => array('id' => 'custom-menu', 'class' => array('links', 'inline', 'clearfix')), 'heading' => t('Custom menu'))); ?>

但是,不需要在页面模板上将自定义菜单添加为变量。您可以通过Drupal管理界面轻松地将自定义菜单的块放置在所需的区域中。另外,您可以更改主菜单源的站点设置,以自定义菜单有效地替换page.tpl.php中的默认$ main_menu变量。

编辑:我只是看到您关于最终目标的添加,只是将一些自定义html添加到图标的菜单项中。根据您添加这些图标的方式,有两个不同的Drupal模块选项。

菜单图标 -允许您通过菜单项的设置上传图像,并自动生成CSS(可通过模板进行自定义),以将图像作为背景添加到菜单项中。

菜单属性 -允许您通过管理员中的设置将自定义类添加到每个菜单项。将唯一的类添加到每个菜单项后,您可以使用CSS将图标添加到菜单项,或使用javascript将其他HTML注入菜单项。


这似乎完美地回答了我所有的问题。这是一个很好的答案。我将立即尝试。
Lester Peabody'3

1
它奏效了,但我牢记每个人的一致意见,但我没有使用这种方法。我使用了您建议的“菜单属性”模块,并为特定的菜单项分配了唯一的ID,然后使用jQuery将HTML直接注入到我需要的位置。感谢您的提示。+1
Lester Peabody 2012年

“您可以通过Drupal管理界面轻松地将自定义菜单的块放置在所需的区域中” ++。我发现此解决方案更简单。
cdmo

1

您可能需要查看“ 尼斯菜单”模块。这是关于它的报价(来自模块的项目页面):

...启用下拉/向右/向左展开菜单。大多数浏览器仅使用CSS,而IE6则使用最少的Javascript。(第2版对所有浏览器都使用了Superfish jQuery插件,并提供了禁用JS的选项,而对于可以处理JS的浏览器,仅使用CSS。)

当前可以使用三种样式/类型的菜单:水平,菜单下拉;垂直,菜单向左飞;垂直,菜单会向右飞。有一个手册页,提供了使用Nice菜单的站点列表

尼斯菜单创建的块可以与任何现有的站点菜单相关联,该菜单可以放置在主题中可以放置普通块的任何位置。对于使用者来说,也可以通过使用提供的主题功能直接将菜单主题设置为尼斯菜单,因此不需要块。提供了“主要链接”菜单的特定主题功能。主题功能还允许开发人员传入其制作的自定义菜单树(即,不使用Drupal菜单。)在文档中有有关如何使用主题功能的更多信息。

该模块带有一个简单的通用配色方案,可以通过将替代CSS添加到主题的常规样式表中,或者通过创建Nice Menus CSS文件并告诉Nice Menus通过全局使用它而不是其默认值,来完全替代该颜色方案。主题配置。随附的README.txt文件和手册中提供了几个CSS替代示例。


我不明白为什么有人投票否决了这个答案。使用尼斯菜单,您可以定位单个菜单项,因为它具有自己的类。然后,您可以将图形用作该单独类的背景。我之前在几个主要项目上都做过。
Stan Ascher 2012年

2
我没有否决它,但是我会说这并不能解决我提出的问题的核心,即如何深入探讨Drupal主题菜单的核心。这就是为什么这些问题从未得到完全回答的原因,因为总会有一些模块被某人删除。我不在乎模块,我想做模板编码。
Lester Peabody 2012年

1
我也没有拒绝投票,但想补充莱斯特所说的话。当您在答案中建议一个模块时,您还应该解释为什么要建议它以及如何使用它来解决OP的问题。如果没有这些详细信息,您的答案将被视为不是很有帮助,并且可能会被否决。我也在这里的前几个答案中犯了这个错误。
sheena_d 2012年

0

根据您要自定义的内容,您的方法非常困难。通常,如您所愿,我是通过Drupal界面创建菜单的。我使用主题开发人员模块Firebug来找出必须重写的模板,挂钩和CSS指令,以便根据需要对其进行调整。

在开始调整之前,值得考虑创建正在使用的基本主题的子主题。这样可以更轻松地更新您的基本主题。


我需要将自定义HTML注入菜单项的<li>元素中。具体来说,我要添加Twitter Bootstrap图标。
Lester Peabody'3

0

这是一个智能代码,可以访问任何2级或3级或更高级别的所有菜单项

将此代码放在您的tpl文件中,不要忘记调用boostrap js和css最新版本:

<!-- menu -->  

        <?php 

          # get menu with all levels 
          menu_tree_all_data('main-menu');
          $menu = menu_build_tree('main-menu');


          # help function for listing submenus for each link     
          function sub_menu_links($var){
           $submenu ='<ul class="dropdown-menu">';

              foreach ($var as $sub) {

                $path = str_replace("<front>",'' ,$sub["link"]["link_path"]);

                 if(count($sub["below"]) > 0 ){
                      $submenu .= '<li class="dropdown-submenu" ><a href="javascript:void(0);" >'.$sub["link"]["link_title"].'</a>';
                      $submenu .=  sub_menu_links($sub["below"]);
                      $submenu .= '</li>'; 
                  }else{
                      $submenu .= '<li><a href="'.$path.'">'.$sub["link"]["link_title"].'</a>'; 
                      $submenu .= '</li>'; 
                   }

              }
            $submenu .= ' </ul>';

            return $submenu;

          }


          # help function for more than 2 levels
          function menu_links($menu){

             $links = '<ul class="nav navbar-nav">';
             foreach ($menu as $link) {

              if(count($link["below"]) > 0 ){ 

                $path = str_replace("<front>",'' ,$link["link"]["link_path"]);

                $links .=  '<li class="dropdown ">';
                $links .= '<a href="javascript:void(0);" class="dropdown-toggle" data-toggle="dropdown">'.$link["link"]["link_title"].'</a>';
                      /* print "<pre>";
                      var_dump( $link["below"]);
                       print "</pre>";*/
                $links .= sub_menu_links($link["below"]); 


                $links .= '</li>' ;

              }else{
                  $links .= '<li>';
                  $links .= '<a href="'.$path.'">'.$link["link"]["link_title"].'</a>'; 
                  $links .= '</li>' ;
              }



              } 
              $links .= '</ul>';
              return  $links ;
          } 


          print menu_links($menu);


           ?>

此代码将返回css类的菜单,您可以使用自己的类,而我正在使用一些自定义css进行引导

这段代码经过艰苦的工作,可以节省您的时间,并且已经在drupal 7.x上进行了测试,并且可以在主菜单中正常工作,您可以根据需要更改菜单

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.