【问题标题】:Drupal 6 - Passing variable between functions specifically - Passing menu name to phptemplate_menu_itemDrupal 6 - 在函数之间传递变量 - 将菜单名称传递给 phptemplate_menu_item
【发布时间】:2011-12-02 13:13:51
【问题描述】:

我对 Drupal 6 和主题化还很陌生。我的主题需要主菜单为我合理参与的样式抽出相当广泛的 html/css。为了实现这一点,我拼凑了这个代码'function phptemplate_menu_item'(见底部),它位于我的template.php中,并根据菜单项是否有子项生成不同的html,并使用链接的内容生成一个css类.

我的问题是这段代码也被应用于我的其他菜单。我想让 menu_item 根据它是否在主菜单中生成不同的 html。我原以为最简单的方法是在函数 phptemplate_menu_item 中使用 if 语句,例如:

function phptemplate_menu_item (...){
  if ($menu_name == 'primary-links')
  {DO ABC}
  else
  {DO XYZ}
}

但是我相信我需要知道如何将菜单名称传递给 phptemplate_menu_item 函数。对此的任何帮助将不胜感激,因为我已经将头撞在墙上试图解决这个问题已经有一段时间了。

谢谢!

function phptemplate_menu_item($link, $has_children, $menu = '', $in_active_trail = FALSE, $extra_class = NULL) {

$class = ($menu ? 'no_wrap' : ($has_children ? 'collapsed' : 'li_wrap'));
if (!empty($extra_class)) {
  $class .= ' '. $extra_class;
}
if ($in_active_trail) {
  $class .= ' active-trail';
}
if (!empty($link)) {
/* The following section gives the list items unique classes based on their link text - note how spaces and sepcial chars are removed */
// remove all HTML tags and make everything lowercase
$css_id = strtolower(strip_tags($link));
// remove colons and anything past colons
if (strpos($css_id, ':')) $css_id = substr ($css_id, 0, strpos($css_id, ':'));
// Preserve alphanumerics, everything else goes away
$pattern = '/[^a-z]+/ ';
$css_id = preg_replace($pattern, '', $css_id);
$class .= ' '. $css_id;
}
// the following code returns the menu item formatted in a different fashion depending on the class of the item. The first one is for items with a class of none - ie the space li at end of menu
if (strstr($class, 'none')) {
      return '<li class="'. $class . ' main"></span></span></li>';
}
if (strstr($class, 'li_wrap')) {
      return '<li class="'. $class .' main"><span class="wrapped">'. $link . $menu ."<span class='indicator'></span></li>\n";
}
if (strstr($class, 'no_wrap')) {
      return '<li class="'. $class . ' main">'. $link ."<span class='indicator'></span><span class='menu_box'><span class='menu_box_inner'>". $menu ."</span></span></li>\n";
}

}

【问题讨论】:

    标签: drupal-6 drupal-theming


    【解决方案1】:

    好吧,我认为找到的解决方案 here 是最好的,所以我不会因此而受到赞扬。而不是覆盖theme_menu_item,您应该从theme_links 开始定义您的自定义函数theme_primary_links。您可以选择您认为最适合您的自定义主题的任何名称(但请确保它尚未使用)。

    底线:有时定义自定义主题比覆盖默认主题更容易。这样您就知道可以根据需要严格应用自定义主题(例如,仅应用于主菜单链接)。当您希望您的更改是全局的(例如应用于所有菜单链接)时,最好使用覆盖。

    【讨论】:

    • 谢谢 Max,听起来不错。我会记住尝试“定义我的自定义主题而不是覆盖默认主题”。我没时间了,所以我最终对输出的 html 进行了猛烈抨击以适应两个菜单。你的方法会更干净,所以我很快就会试一试。干杯
    猜你喜欢
    • 2017-07-21
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2020-07-28
    相关资源
    最近更新 更多