Drupal 6 - Передача переменной между функциями специально - Передача имени меню в phptemplate_menu_item - PullRequest
2 голосов
/ 02 декабря 2011

Я довольно новичок в Drupal 6 и посвящаю его. Моя тема требовала, чтобы главное меню выкачивало довольно обширные html / css для моего разумного стиля. Чтобы достичь этого, я собрал воедино этот код «функция phptemplate_menu_item» (см. Внизу), который находится в моем template.php и выдает различный HTML-код в зависимости от того, есть ли у элемента меню дочерние элементы или нет, и использует содержимое ссылки для создания класса CSS .

Моя проблема в том, что этот код также применяется к другим моим меню. Я хотел бы, чтобы menu_item генерировал разные HTML в зависимости от того, находится ли он в первичном меню или нет. Я бы подумал, что проще всего сделать это с помощью оператора if в функции phptemplate_menu_item, например:

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";
}

}

1 Ответ

0 голосов
/ 05 декабря 2011

Ну, я думаю, что найденное решение здесь это лучшее, поэтому я не собираюсь брать за это кредит.Вместо перезаписи theme_menu_item вы должны определить свою пользовательскую функцию theme_primary_links, начиная с theme_links. Вы можете выбрать любое имя, которое вы считаете подходящим для вашей пользовательской темы (но убедитесь, что оно еще не используется).* Итог: иногда проще определить свою пользовательскую тему, чем перезаписать темы по умолчанию.Таким образом, вы знаете, что можете строго применять пользовательскую тему в соответствии со своими потребностями (например, применять только к ссылкам основного меню).Перезапись лучше всего использовать, когда вы хотите, чтобы ваши изменения были глобальными (например, применяются ко всем ссылкам меню).

...