Jak utworzyć motyw bloku menu?

11

Utworzyłem niestandardowe menu (nazwijmy to „mynav”), aw moim motywie stworzyłem specjalnie dla niego szablon ( block--menu--menu-mynav.tpl.php), który zawiera:

<div id="mynav" class="<?php print $classes; ?>"<?php print $attributes; ?>>
  <?php print $content ?>
</div>

To działa dobrze.

Jednak wolę zastosować identyfikator do nieuporządkowanej listy, która jest generowana i zawarta w $content. Chyba muszę utworzyć taką funkcję MYTHEME_links__system_mynav_menu:

function MYTHEME_links__system_mynav_menu($variables) {
  return "TEST"; // Generate HTML here (<ul id="mynav">...)
}

ale nie ma to wpływu.

Co ja robię źle?

RoToRa
źródło
Prawdopodobnie jest to duplikat drupal.stackexchange.com/questions/2258/…
tim.plunkett
1
Drugie pytanie dotyczy dodania unikalnego identyfikatora menu, podczas gdy to pytanie jest bardziej ogólne.
kiamlaluno
Dokładne pytanie na stackoverflow: stackoverflow.com/questions/11935477/…
pazury

Odpowiedzi:

25

Aby utworzyć motyw do listy nieuporządkowanej, musisz wywołać theme_menu_tree (). Możesz edytować plik template.php, aby to nazwać.

function THEMENAME_menu_tree__MENUNAME($variables){
  return '<ul class="your-custom-class" id="your-custom-id">' . $variables['tree'] . '</ul>';
}

Następnie, jeśli chcesz utworzyć temat linków, wywołaj theme_menu_link ().

function THEMENAME_menu_link__MENUNAME($variables) {
  $element = $variables['element'];
  $sub_menu = '';

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

Problem z Drupalem 7 polega na tym, że występuje duży błąd, jeśli chodzi o wyświetlanie aktywnej ścieżki niestandardowych menu.

Zobacz problem
Problem nr 520106 - Nie można dynamicznie ustawić aktywnego śladu
Problem nr 942782 - Menu niestandardowe nigdy nie otrzymuje aktywnego śladu

Zasadniczo nie masz szczęścia, jeśli chcesz mieć prawdziwe niestandardowe menu. Te problemy już od dawna stoją w społeczności drupali, więc nie jestem pewien, czy zostaną naprawione w najbliższym czasie. Nie wiem, czy jest jakiś PHP, który może w tym pomóc. Możesz przejść do niektórych alternatywnych modułów, aby ułatwić funkcjonalność, takich jak Atrybuty menu i Blok menu . Oba mogą pomóc w obejściu systemu menu w Drupal 7.

Steven
źródło
2

W szablonie theme.php Twojego motywu był to sposób na robienie rzeczy w Drupal 6

function MYTHEME_links__system_mynav_menu($variables) {
  return "TEST"; // Generate HTML here (<ul id="mynav">...)
}

W Drupal 7 musisz zadzwonić

  function MYTHME_menu_link(array $variables) {

  }
iStryker
źródło
MYTHEME_menu_linkwydaje się obsługiwać tylko poszczególne linki. Nie mogę dotrzeć do ul.
RoToRa
Patrzę na to, nie wiem, czy możesz. Wiem, że dzięki Drupalowi 7 masz większą moc nad linkami, ale mniej mocy nad menu.
iStryker