2 Stimmen

Ist es möglich, ein Theme in Drupal 6 *optional* zu überschreiben?

Ich möchte die Thematisierung nur eines (benutzerdefinierten) Menüs außer Kraft setzen. Ich kann dies mit phptemplate_menu_tree() tun, aber - natürlich - es überschreibt das Rendering aller Menüs.

Ich habe versucht, FALSE (eine offensichtliche Technik IMO) zurückgeben, wenn das Menü nicht die spezifische, die ich überschreiben möchten - aber dies bewirkt nicht, dass die überschriebene Thema-Funktion aufgerufen werden.

Meine einzige Alternative (wenn das Menü etwas anderes als das spezifische ist) ist die überschriebene Funktion aus phptemplate_menu_tree() aufrufen - aber dies scheint den ganzen Punkt des Überschreibungssystems zu vereiteln, da die Standard-Rendering-Funktion darin fest codiert wird.

Ich hoffe, die Erklärung ist klar, und jede Hilfe wird sehr geschätzt - tks.

UPDATE

Für die Zukunft werde ich erklären, wie ich das Problem gelöst habe.

Zunächst einmal beginnt das Rendering des Menüs mit dieser Funktion in menu.module:

function menu_block($op = 'list', $delta = 0) {
  $menus = menu_get_menus();
  // The Navigation menu is handled by the user module.
  unset($menus['navigation']);
  if ($op == 'list') {
    $blocks = array();
    foreach ($menus as $name => $title) {
      // Default "Navigation" block is handled by user.module.
      $blocks[$name]['info'] = check_plain($title);
      // Menu blocks can't be cached because each menu item can have
      // a custom access callback. menu.inc manages its own caching.
      $blocks[$name]['cache'] = BLOCK_NO_CACHE;
    }
    return $blocks;
  }
  else if ($op == 'view') {
    $data['subject'] = check_plain($menus[$delta]);
    $data['content'] = menu_tree($delta);
    return $data;
  }
}

Wenn Sie nur überschreiben möchten, wie einzelne Elemente (Links) gerendert werden, dann können Sie das Themensystem verwenden (es gibt eine Menge Hinweise darauf, wie dies zu tun) - aber wenn Sie die vollständige Kontrolle darüber, wie die gesamte Menübaum gerendert wird (z.B. die Ausgabe in verschachtelte DIVs packen, damit sie auf der Seite zentriert werden kann), dann gibt es keine Möglichkeit, menu_block() zu überschreiben.

Daher habe ich das Menü, das ich anders darstellen wollte, aus der Seite "Blöcke verwalten" (Site Building->Blöcke) entfernt und das Menü direkt in meiner page.tpl.php mit folgendem Code dargestellt: (spitze Klammern entfernt)

  $m = menu_tree_page_data('my-menu-id');
  $o = "DIV";
  foreach($m as $k => $v){
    $o .= "SPAN {$v['link']['title']} /SPAN";
  }
  $o .= "/DIV";
  echo $o;

Ich hoffe, das hilft.

1voto

doublejosh Punkte 5216

Ich habe gemischten Erfolg dabei template.php Menü Überschreibungen zu erzwingen CSS-Klassen und ids oder HTML in die Ausgabe hatte.

Sie könnten das Blockthema verwenden, wenn Sie das Menü als Block aktivieren, aber ich habe es nie ausprobiert. http://drupal.org/project/blocktheme

Wenn Sie den Weg über die Vorlage gehen wollen, finden Sie hier die Funktionen zum Überschreiben des Zen-Menüs...

function zen_menu_item_link($link) {
  if (empty($link['localized_options'])) {
    $link['localized_options'] = array();
  }

  // If an item is a LOCAL TASK, render it as a tab
  if ($link['type'] & MENU_IS_LOCAL_TASK) {
    $link['title'] = '<span class="tab">' . check_plain($link['title']) . '</span>';
    $link['localized_options']['html'] = TRUE;
  }

  return l($link['title'], $link['href'], $link['localized_options']);
}

function zen_menu_local_tasks() {
  $output = '';

  if ($primary = menu_primary_local_tasks()) {
    $output .= '<ul class="tabs primary clear-block">' . $primary . '</ul>';
  }
  if ($secondary = menu_secondary_local_tasks()) {
    $output .= '<ul class="tabs secondary clear-block">' . $secondary . '</ul>';
  }

  return $output;
}

0voto

berkes Punkte 25943

Sie könnten verwenden Abschnitte Modul, oder sehen Sie sich an, wie es das Thema für bestimmte Menüpunkte wechselt.

0voto

codeguy Punkte 614

Was ich tat, war eine neue Theme-Funktion in meiner template.php namens primary_links registrieren (weil ich nur dieses Menü in bestimmter Weise anpassen wollte) erstellt die Funktion mytheme_primary_links() in meiner template.php aktualisiert den Cache, so dass Drupal meine Theme-Funktion zum System hinzufügen würde dann geändert Theme-Funktion auf primary_links von Links zu meinem benutzerdefinierten Theme-Funktion primary_links - dies erlaubt mir, nur dieses 1 Menü anpassen - könnten Sie dies tun und Haken in wo auch immer, um die Theme-Funktion für Ihre Links aufgerufen werden ändern?

Chris

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X