Entity Metadata Wrapper

Die Funktion entity_metadata_wrapper() ist verdammt leistungsstark, wenn es darum geht, mit Entities (egal welchen) zu arbeiten. Egal ob es darum geht, bestimmte Daten/Felder zu laden oder Referenzierungen (z.B. Node -> Author [User]) zu laden. Diese Funktionalität wird vom contrib Modul Entity API bereitgestellt, welches daher installiert sein muss, um die Funktion nutzen zu können.

Der Gegenpart für Entity Metadata Wrapper ist hook_property_info(). Hier werden die Informationen definiert, die dann im Wrapper genutzt werden können.

Eine kleine Dokumentation der Funktion gibt es auch auf drupal.org: Entity metadata wrappers

Ebenfalls empfohlen ist eine Blick in die README.txt des Moduls: README.txt

Wrapper laden/initialisieren

Zuerst muss der Wrapper geladen werden. Um z.B. eine Node als Quelle zu nutzen, kann folgendes Snippet genutzt werden:

// Load Wrapper for a node.
$node_wrapper = entity_metadata_wrapper('node', $node);
 
// Load Wrapper for a user.
$user_wrapper = entity_metadata_wrapper('user', $user);

Die Funktion entity_metadata_wrapper($type, $data) erwartet immer die beiden Argumente $type (Was für ein Entity Typ) und das entsprechende Entity Objekt selber (z.B. ein Node Objekt).

Wrapper analysieren

Da die Entities alle möglichen Properties (z.B. Felder) und Methoden haben können, ist es nicht so einfach herauszufinden, welche Möglichkeiten mir der Wrapper zur Verfüng steht.

Deshalb gibt es die Methode getPropertyInfo(), die es bei jedem Wrapper gibt.

// Print the skeleton of the current wrapper (devel module is needed).
dsm($wrapper->getPropertyInfo());

Diese Funktion kann überall innerhalb des Wrapper genutzt werden. Also, beispielsweise auch auf einer Child-Methode:

// Print the skeleton of the referenced user object (devel module is needed).
dsm($node_wrapper->author->getPropertyInfo());

Über Properties iterieren

Einige Properties auf einem Wrapper-Objekt können auch mehrere Values enthalten. Hier funktioniert die value() Methode natürlich nicht direkt. Entity Metadata Wrapper stellt hierfür deshalb eine Methode zum Iterieren zur Verfügung: getIterator().

foreach ($node_wrapper->field_tags->getIterator() as $tag) {
  // Print the skeleton of the Tag (Taxonomy Term) object.
  dsm($tag->getPropertyInfo());
 
  // Print the name of the Tag (Taxonomy Term Title).
  dsm($tag->name->value(), 'Tag Name');
}

Values ändern

Mit dem Entity Metadata Wrapper können Daten nicht nur geladen werden, sondern auch geschrieben werden. Damit wird diese Funktion erst so richtig leistungsstark und eigentlich unverzichtbar bei der Arbeit mit Drupal.

Beispiel: Wir ändern den Wert eines Nummern-Feldes („field_number“) einer Node.

$node_wrapper->field_number->set(32);
$node_wrapper->save();

Verschiedene Anwendungsszenarien

Lade Informationen über den Autor (User) einer Node

$node_wrapper = entity_metadata_wrapper('node', $node);
$author_mail = $node_wrapper->author->mail->value();