Drupal 7 hook_block_info() und hook_block_view(): Ausgabe von Informationen in einem Block
In der letzten Lektion haben wir ein Modul für Drupal 7 erstellt. In dieser Lektion erweitern wir unser Modul. Wir fügen einen Block über die Hooks hook_block_view() und hook_block_info() hinzu. Der Block zeigt Informationen über die letzten Benutzer der Seite mit Links zu deren Profilseiten an.
Beginnen wir mit der Beschreibung von hook_block_info():
Dieser Hook definiert alle vom Modul erzeugten Blöcke.
Er bestimmt, welche Blöcke im Modul ausgegeben werden und kann Einstellungen zur Blockausgabe beschreiben.
In hook_block_info() erhält jeder Block einen eindeutigen Bezeichner "delta", der als Schlüssel im zurückgegebenen Array verwendet wird. Das delta muss im Modul einzigartig sein und wird für folgende Zwecke genutzt:
- Als Argument in weiteren Hooks, um den Block zu identifizieren, der konfiguriert oder ausgegeben wird.
- Für die Erstellung von HTML-Templates im Format "block-MODULE-DELTA", die Drupal für jeden Block generiert. Dies hilft bei CSS oder JavaScript.
- Für die Definition von Thematisierungsfunktionen block__MODULE__DELTA zur erweiterten Gestaltung.
- Zur Identifikation des Blocks in hook_block_info_alter() und anderen Hooks.
Das delta kann ein String oder eine Zahl sein, max. Länge 32 Bytes.
Rückgabewert
Ein assoziatives Array mit delta als Schlüssel und Block-Beschreibungen als Werte. Die Block-Beschreibungen sind wiederum assoziative Arrays mit Schlüssel-Wert-Paaren:
- info (erforderlich): Lesbarer Name des Blocks für das Admin-Interface. Erscheint nicht auf der Website.
- cache (optional): Cache-Verhalten. Mögliche Werte:
- DRUPAL_CACHE_PER_ROLE (Standard): Block kann je nach Benutzerrolle variieren.
- DRUPAL_CACHE_PER_USER: Block kann sich pro Benutzer unterscheiden.
- DRUPAL_CACHE_PER_PAGE: Block kann je Seite unterschiedlich sein.
- DRUPAL_CACHE_GLOBAL: Block ist für alle Benutzer und Seiten gleich.
- DRUPAL_NO_CACHE: Block wird nicht gecached.
- properties (optional): Array mit zusätzlichen Meta-Daten.
Übliche properties sind:
- administrative: Boolean, ob der Block im administrativen Kontext verwendet wird.
- weight: Initialer Wert für Gewicht des Blocks.
- status: Initialer Status (1=aktiv, 0=deaktiviert).
- region: Initialer Regionenwert.
- visibility: Sichtbarkeitseinstellungen. Mögliche Werte:
- BLOCK_VISIBILITY_NOTLISTED: Zeige auf allen Seiten außer bestimmten.
- BLOCK_VISIBILITY_LISTED: Zeige nur auf bestimmten Seiten.
- BLOCK_VISIBILITY_PHP: Sichtbarkeit mit eigenem PHP-Code definieren.
- pages: Liste der Seitenpfade für Sichtbarkeit.
Beispiel: Einen Block hinzufügen via Hook:
<?php function sitemade_block_info(){ $blocks = array(); $blocks[1]['info'] = 'Benutzerliste'; return $blocks; } ?>
Der Block erscheint in der Admin-Oberfläche und kann im linken Sidebar platziert werden:
Nun den Blockinhalt ausgeben mit hook_block_view():
hook_block_view($delta = '')
:
Parameter
$delta: Identifiziert den Block, der ausgegeben wird. Der Wert entspricht dem delta aus hook_block_info().
Rückgabe
Ein Array mit folgenden Elementen:
- subject: Standardüberschrift des Blocks, übersetzt. Falls keiner vorhanden, NULL.
- content: Blockinhalt, entweder als Render-Array (bevorzugt) oder als HTML-String.
Beispiel für den Hook:
<?php function sitemade_block_view($delta = ''){ $block = array(); // leeres Block-Array initialisieren switch ($delta){ case 1: $block['subject'] = 'Benutzer'; // Blocktitel $block['content'] = ''; // String initialisieren $query = db_select('users', 'u') // Abfrage Benutzer ->fields('u', array('uid', 'name')) // Felder auswählen ->orderBy('u.uid', 'DESC') // absteigend sortieren ->range(0, 5) // fünf Benutzer auswählen ->execute(); // ausführen $users = $query->fetchAll(PDO::FETCH_ASSOC); // Array holen foreach($users as $user){ $block['content'] .= '<div><a href="' . base_path() . 'user/' . $user['uid'] . '">' . $user['name'] . '</a></div>'; // base_path() gibt den Pfad zur Seitenwurzel zurück } break; } return $block; } ?>
Damit wird eine Liste der letzten 5 registrierten Benutzer mit Links zu deren Profilseiten ausgegeben. Für Links ist allerdings die Funktion l() besser geeignet, dazu sollte ein eigener Artikel verfasst werden.