在drupal主菜单中为菜单项添加ID

时间:2011-08-15 08:40:12

标签: php drupal drupal-7

附在我的模板上,我从切片机收到的,有一个用于着色菜单项的javascript文件。 现在我需要将模板转换为Drupal模板。 javascript基于以下事实:每个菜单项都具有id,根据项目的顺序。 在Drupal中,菜单项只有类(menu-341,menu-342等)。我知道我可以调整javascript,所以它按类获取菜单项,但它实际上是不可能的,因为那时我需要完全扰乱整个文件,我试图阻止它。

我可以在所有主菜单项中添加ID,例如菜单项1'菜单项2'等等? 我应该在template.tpl.php中这样做,还是直接更改page.tpl.php中的输出?

感谢您的帮助。

编辑: 我很绝望,因为我不知道如何解决这个问题。还有其他方法可以为我的菜单项着色吗? 我使用的脚本在他们的升序ID(custom-menu-item-id-x)中选择菜单项,然后从阵列中为他们提供背景,与' x&#39相关联;的身份证明四种颜色:项目1的颜色1,项目2的颜色2,项目5的颜色1等..... 难道还有另一种解决方法吗?我不能让jQuery以升序自动选择它们(它遇到的第一个项目获得第一个背景,第二个项目第二个背景等)?请提出想法。在我看来,我尝试了一切。

这是我目前的剧本:

//Sequence of the background colors from the menu items, from left to right.
var backgrounds = ["blue", "green", "pink", "purple"];

//Gives the menu items a style when hovering over it, in the sequence of the setting in the variable 'backgrounds', on top.
jQuery(document).ready(function MenuColor($){
    for (var i = 0; i <= 10 ; i++) {
        document.getElementById("custom-menu-item-id-" + (i + 1)).onmouseover = (function(valueOfI){ return function() {
        this.style.background = "url('images/" +  backgrounds[(valueOfI % backgrounds.length)] + ".jpg')";
        }; })(i);
        var ActiveLi = $('.active').attr('id');
        if("custom-menu-item-id-" + (i + 1) != ActiveLi) {
            document.getElementById("custom-menu-item-id-" + (i + 1)).onmouseout = function() {
                this.style.background = 'none'; 
            }
        }
    }
});

3 个答案:

答案 0 :(得分:0)

A quick search提供了多种选项,包括answer。是的 - 模板功能100%专为此类设计。 :)

编辑 - 没问题,但你的回答实际上是在RichTheGeek的评论中。他链接了新的D7函数,在评论主题中,这是一个根据标题向菜单项添加类的示例。这不是一个很好的例子,因为使用preg_replace是一种“沉重”的方式,但我不明白为什么这不起作用。我所做的就是在第11行换掉“class”作为“id”。

不要忘记将“yourtheme”替换为您正在使用的主题的实际系统名称。

  function yourtheme_menu_link(array $variables) {
  $element = $variables['element'];
  $sub_menu = '';
  $name_id = strtolower(strip_tags($element['#title']));
// remove colons and anything past colons
  if (strpos($name_id, ':')) $name_id = substr ($name_id, 0, strpos($name_id, ':'));
//Preserve alphanumerics, everything else goes away
  $pattern = '/[^a-z]+/ ';
  $name_id = preg_replace($pattern, '', $name_id);
  $element['#attributes']['id'][] = 'menu-' . $element['#original_link']['mlid'] . ' '.$name_id;
  if ($element['#below']) {
    $sub_menu = drupal_render($element['#below']);
  }
  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}
?>

答案 1 :(得分:0)

但我最后自己管理了它。 首先,我在我的page.tpl.php中粘贴了这段代码(从Bartik page.tpl.php模板中复制):

<?php if ($main_menu): ?>
  <div id="main-menu" class="navigation">
    <?php print theme('links__system_main_menu', array(
      'links' => $main_menu,
      'attributes' => array(
        'id' => 'main-menu-links',
        'class' => array('links', 'clearfix'),
      ),
      'heading' => array(
        'text' => t('Main menu'),
        'level' => 'h2',
        'class' => array('element-invisible'),
      ),
    )); ?>
  </div> <!-- /#main-menu -->
<?php endif; ?>

这将“主菜单”放在正确的位置。 但是,我在menu.inc或template.php中更改的所有内容都不适用于它。 因此,我没有将代码放在那里,而是将BLOCK'主菜单'放在相应的区域中,突然间我能够改变一切。

所以在我的template.php中我添加了这个函数,它将ID写入了项目。

<?php
/**
 * Returns HTML for a menu link and submenu.
 *
 * @param $variables
 *   An associative array containing:
 *   - element: Structured array data for a menu link.
 *
 * @ingroup themeable
 */
function exofes_menu_link(array $variables) {
  $element = $variables['element'];
  $sub_menu = '';

  if ($element['#below']) {
    $sub_menu = drupal_render($element['#below']);
  }
  static $item_id = 0;
  $output = l($element['#title'], $element['#href'], $element['#localized_options']);  
  return '<li id="custom-menu-item-id-' . (++$item_id) . '"' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}
?>

并且工作:D!

答案 2 :(得分:0)

function THEME_preprocess_page(&$vars) {
  $menu = menu_navigation_links('menu-your-custom-menu-name');
  $vars['custom_menu'] = theme('links__menu_your_custom_menu_name', array('links' => $menu));
}