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

Arbeiten mit der Datenbank in Drupal 7 – Lektion 5 – Extenders (Erweiterungen)

26/05/2025, by Ivan

Abfrageauswahl unterstützt Erweiterungen (Extenders). Eine Erweiterung ermöglicht es, zur Laufzeit zusätzliche Funktionalität zu einer Abfrage hinzuzufügen. Diese Funktionalität kann eine zusätzliche Methode sein oder das Verhalten einer existierenden Methode verändern.

Dafür werden in der OOP Design-Patterns verwendet; Erweiterungen implementieren dabei das Decorator-Pattern. Sie fügen dem dynamischen Objekt zusätzliche Aufgaben hinzu, indem sie flexible alternative Subklassen für die Erweiterungsmethode bereitstellen.

Verwendung von Extenders (Erweiterungen)

Um eine Erweiterung zu nutzen, benötigt man ein Abfrageobjekt. Die Methode extend() des Abfrageobjekts gibt ein neues Objekt zurück, das anstelle des aktuellen Abfrageobjekts verwendet wird. Zum Beispiel:

<?php
$query = $query->extend('PagerDefault');
?>

In diesem Beispiel wird ein neues PagerDefault-Abfrageobjekt erstellt, das das originale Abfrageobjekt enthält und ein neues Objekt zurückgibt. $query kann auch ohne Erweiterungen verwendet werden, aber mit ihnen erhält das Objekt zusätzliche Fähigkeiten. Beachten Sie, dass $query durch die Methode extend() überschrieben wird und das alte Objekt nicht erhalten bleibt. Das folgende Beispiel erklärt dies:

<?php
$query = db_select('node', 'n');
$query
  ->fields('n', array('nid', 'title'))
  ->extend('PagerDefault')   // Diese Zeile gibt ein neues PagerDefault-Objekt zurück.
  ->limit(5);               // Diese Zeile funktioniert, weil das PagerDefault-Objekt aufgerufen wird.

// Das Rückgabewert von extend() wurde nie einer Variablen zugewiesen, daher ist $query immer noch das Select-Objekt.
$query->orderBy('title');

// Diese Zeile führt das Select-Objekt aus, nicht die Erweiterung. Die Erweiterung existiert nicht mehr.
$result = $query->execute();
?>

Um Probleme zu vermeiden, empfehle ich, das erweiterte Abfrageobjekt in der gleichen Variable wie das ursprüngliche zu speichern.

<?php
$query = db_select('node', 'n')->extend('PagerDefault')->extend('TableSort');
$query->fields(...);
// ...
?>

Das stellt sicher, dass $query ein voll erweitertes Objekt ist. Mehrere Erweiterungen können an einem Objekt verwendet werden, aber die Reihenfolge kann wichtig sein. Zum Beispiel sollte ein Objekt, das mit TableSort erweitert wird, zuerst mit PagerDefault erweitert werden.

Erstellen neuer Erweiterungen

Eine Erweiterung ist einfach eine Klasse, die das Interface SelectQueryInterface implementiert und im Konstruktor zwei Parameter akzeptiert: die Select-Abfrage und das Datenbank-Verbindungsobjekt. Die Erweiterung muss alle Methoden von SelectQueryInterface implementieren und diese durch das Abfrageobjekt im Konstruktor weiterreichen.

In den meisten Fällen erfolgt dies durch Erweiterung der Klasse SelectQueryExtender, die alles intern abwickelt. Praktisch ist eine Erweiterung jede Klasse, die von SelectQueryExtender erbt. Der Klassenname ist dann der Parameter, der bei extend() verwendet wird.

Die Erweiterung kann Methoden hinzufügen oder überschreiben. Alle nicht überschriebenen Methoden werden direkt an das Abfrageobjekt weitergereicht. Überschriebene Methoden können das zugrundeliegende Abfrageobjekt aufrufen oder nicht, müssen aber ein erwartetes Ergebnis gemäß dem Interface zurückgeben. Meist wird das eigene Objekt zurückgegeben oder ein anderes Erweiterungsobjekt.

 

Das folgende Beispiel illustriert dies:

<?php
class ExampleExtender extends SelectQueryExtender {

  /**
   * Sortiert Datensätze.
   */
  public function orderBy($field, $direction = 'ASC') {
    return $this;
  }

  /**
   * Fügt eine eigene Methode hinzu.
   */
  public function orderByForReal($field, $direction = 'ASC') {
    $this->query->orderBy($field, $direction);
    return $this;
  }
}
?>

In diesem Beispiel überschreiben wir die Methode orderBy() der Abfrage, fügen aber nichts hinzu. Stattdessen verwenden wir die zusätzliche Methode orderByForReal(), die eine Sortierung aufsteigend ausführt. Beide Methoden geben das Abfrageobjekt zurück, damit das Objekt erhalten bleibt.

Jedes Modul kann Erweiterungen definieren. Der Drupal-Kern stellt zwei gute Erweiterungen bereit: PagerDefault und TableSort.

Unterstützung mehrerer Datenbanken

Die Erweiterungsmethode funktioniert wie db_select, die Erweiterung sucht Klassen mit einem Suffix für den verwendeten DB-Treiber. Sie können also z.B. ExampleExtender_pgsql definieren oder eine allgemeine ExampleExtender, die verwendet wird, wenn keine spezifische verfügbar ist.