logo

Extra Block Types (EBT) - Neue Erfahrung im Layout Builder❗

Extra Block Types (EBT) - gestylte, anpassbare Blocktypen: Diashows, Registerkarten, Karten, Akkordeons und viele andere. Eingebaute Einstellungen für Hintergrund, DOM Box, Javascript Plugins. Erleben Sie die Zukunft der Layouterstellung schon heute.

Demo EBT-Module EBT-Module herunterladen

❗Extra Absatztypen (EPT) - Erfahrung mit neuen Absätzen

Extra Paragraph Types (EPT) - analoger, auf Absätzen basierender Satz von Modulen.

Demo EPT-Module EPT-Module herunterladen

Scroll

Hook_menu Drupal 7: Erstellen von Seiten über ein Modul

26/05/2025, by Ivan

In der letzten Lektion haben wir gelernt, wie man Informationen aus der Datenbank mit Hilfe der Drupal API ausgibt, genauer mit den Hooks hook_block_info() und hook_block_view(). In dieser Lektion werden wir Seiten ausgeben, genauer gesagt mit dem Hook hook_menu Seiten an andere Teile von Drupal anschließen: Menüs, Übersetzungen, Templates usw.

Fangen wir einfach an und binden eine Seite ein, die die Titel der letzten 10 Nachrichten und deren Beschreibung anzeigt. So entsteht ein kleiner Nachrichten-Stream. Wir verwenden den Hook hook_menu(). Unten folgt dessen Beschreibung und danach der Einsatz.

hook_menu()

Definiert einen Menüpunkt und gibt eine Seite zurück.

Dieser Hook, aufgerufen im Modul, registriert einen Pfad in der Reihenfolge, wie Drupal ihn verarbeitet. Pfade können nur zur Verarbeitung registriert werden oder in Menüs erscheinen, z.B. im Navigationsmenü. Pfade und die dazugehörigen Informationen heißen menu router items. Der Hook wird selten aufgerufen (z.B. beim Aktivieren eines Moduls) und das Ergebnis wird in der Datenbank gecached. Deshalb muss man den Cache beim Ändern des Hooks oft leeren.

hook_menu() gibt ein assoziatives Array zurück, dessen Schlüssel Pfade sind und Werte assoziative Arrays mit Eigenschaften dieser Pfade. (Ein "Eigenschaftsblatt", siehe unten)

Für jeden Pfad wird eine Seite definiert, die geladen wird, wenn die registrierte URL angefordert wird. Wenn keine anderen Pfade auf die URL reagieren, wird die Seite zurückgegeben. Zum Beispiel registriert das Modul den Pfad 'abc/def'.

<?php   

function mymodule_menu() {
    $items['abc/def'] = array(
      'page callback' => 'mymodule_abc_view',
    );
    return $items;
  }
  function mymodule_abc_view($ghi = 0, $jkl = '') {
    // ...   }

?>

Wenn der Pfad 'abc/def' angefordert wird und nichts weiteres in der URL steht, werden keine Argumente übergeben. Wenn 'abc/def/1/Omsk' angefordert wird, werden die Argumente "1" und "Omsk" an die Seite übergeben. Das ist hilfreich bei der Erstellung von Seitentemplates.

Die zusätzlichen Argumente können auch als assoziatives Array definiert werden. Die Liste der Argumente kann komplexe und einfache numerische Werte enthalten. Numerische Argumente können mit der Funktion arg(0), arg(1) usw. abgefragt werden.

<?php   

function mymodule_menu() {
    $items['abc/def'] = array(
      'page callback' => 'mymodule_abc_view',
      'page arguments' => array(1, 'foo'),
    );
    return $items;
  }

?>

Wenn der Pfad 'abc/def' aufgerufen wird, erhält die Seite als erstes Argument 'def' und als zweites immer 'foo'. Eine ausführliche Beschreibung gibt es hier: http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_menu/7

Erstellen wir nun eine einfache Seite:

function sitemade_menu(){
    $items = array(); // Menüeinträge initialisieren
     
    $items['page_example'] = array(  // Seite unter 'page_example' hinzufügen
      'title' => 'Beispielseite', // Seitentitel
      'description' => 'Einfache Seite', // Beschreibung
      'page callback' => '_page_example', // Funktion zur Ausgabe des Seiteninhalts
      'access callback' => TRUE, // Erlaubt allen den Zugriff
      'expanded' => TRUE,
  );    
     
     
    return $items; // Liste der Seiten zurückgeben
}
 
 
function _page_example($content = NULL) {
    $content = ''; // Variable für leeren Inhalt initialisieren
    $query = db_select('node_revision', 'n'); // Tabelle node_revision mit aktuellen Revisionen wählen
    $query->innerJoin('field_revision_body', 'b', 'b.revision_id = n.vid'); // Tabelle field_revision_body mit Body joinen
    $query->innerJoin('node', 'd', 'n.nid=d.nid'); // Tabelle node mit Titel joinen
    $query->fields('n', array('title'), array('nid'), array('vid')); // Felder auswählen
    $query->fields('b', array('body_value'));
    $query->condition('d.type', 'news'); // Filter nach Inhaltstyp 'news'
    $query->orderBy('n.timestamp', 'DESC'); // Sortieren nach Datum absteigend
    $query->range(0, 10); // Nur die letzten 10 auswählen
    $result = $query->execute(); // Query ausführen
    while($nodes = $result->fetch()){ // Ergebnisse verarbeiten
        $content .= '<h3>' . $nodes->title . '</h3>'; // Titel ausgeben
        $content .= $nodes->body_value; // Body ausgeben
    }
 
    return $content; // Inhalt zurückgeben
}

Man kann auch die Eigenschaft type nutzen, um die Seite in verschiedenen Menüs zu platzieren, z.B. im Admin-Menü oder Hauptmenü.

So machen wir das:

function sitemade_menu(){
    $items = array(); // Menüeinträge initialisieren
     
    $items['page_example'] = array(  // Seite unter 'page_example' hinzufügen
      'title' => 'Beispielseite', // Seitentitel
      'description' => 'Einfache Seite', // Beschreibung
      'page callback' => '_page_example', // Funktion zur Ausgabe
      'access callback' => TRUE, // Erlaubt allen Zugriff
      'expanded' => TRUE,
      'type' => MENU_NORMAL_ITEM,
      'menu_name' => 'main-menu',
  );    
    return $items; // Liste zurückgeben
}

Cache leeren und ein Link zur Seite erscheint im Menü.

Add menu

Man kann auch Seiten im Drupal-Admin-Menü anzeigen lassen:

function sitemade_menu(){
    $items = array(); // Menüeinträge initialisieren    
    $items['admin/config/content/page_example'] = array(  // Seite unter 'admin/config/content/page_example' hinzufügen
      'title' => 'Beispielseite', // Titel
      'description' => 'Einfache Seite', // Beschreibung
      'page callback' => '_page_example', // Funktion zur Ausgabe
      'access arguments' => array('administer site configuration'), // Zugriff nur für Admin
  );    
    return $items; // Liste zurückgeben
}

Die Seite wird nun nur für Administratoren angezeigt, der Link erscheint im Admin-Menü:

Drupal add menu page

Der Link erscheint im Admin-Menü, weil Drupal automatisch Links zu Pfaden unter admin/config/content/* einfügt. Für Pfade wie admin/config/people/* erscheint der Link im Benutzer-Block. Man kann statt der Sternchen beliebige Bezeichnungen verwenden, hier z.B. page_example.

Nun können wir Blöcke und Seiten erstellen, das sind die wichtigsten Hooks zur Inhalt-Ausgabe, die in euren Modulen häufig vorkommen werden.

Im nächsten Tutorial behandeln wir hook_perm(), um neue Benutzerberechtigungen zu erstellen.