Was ist der Zweck der Funktion entity_metadata_wrapper () und warum sollte ich sie verwenden?

23

Ich scheine Add-Ons für viele Module zu entwickeln, die derzeit die Entity-API verwenden , und die entity_metadata_wrapper()Funktion taucht immer wieder auf.

Die Dokumentseite sagt dies dazu:

Gibt einen Eigenschaftenwrapper für die angegebenen Daten zurück.

Wenn eine Entität umbrochen wird, kann der Wrapper verwendet werden, um weitere Wrapper für die Berechtigungseigenschaften abzurufen.

Wenn ich die wunderbar freudsche Schreibweise des Wortes "Entität" ignoriere, verstehe ich nicht wirklich, was der Zweck dieser Umhüllungen ist.

Ich verstehe, dass die Funktion im Wesentlichen eine EntityDrupalWrapperKlasse zurückgibt :

Der Wrapper vereinfacht das Anwenden von Get- und Setter-Rückrufen von Entitätseigenschaften

Aber ich kann nicht verstehen, wie es die Dinge einfacher macht.

Zum Aktualisieren der Statuseigenschaft eines Knotens könnte ich beispielsweise den folgenden Code verwenden:

$node = node_load($nid);
$node->status = 1;
node_save($node);

Das ist ziemlich sauber. So wie ich es verstehe (aber vielleicht falsch), entity_metadata_wrapper()wäre die Verwendung des entsprechenden Codes ausführlicher.

Ich bin mir nicht sicher, ob es einfach die Verwendung des Begriffs "Wrapper" ist, die mich hier auslöst, aber ich habe auch den Code im Entity-Modul durchgesehen und bin dem Verständnis nicht näher gekommen.

Kann jemand die Vorteile dieser Funktion erläutern und möglicherweise ein einfaches Codebeispiel für einen allgemeinen Anwendungsfall bereitstellen?

Clive
quelle
Dies kann zu einem tieferen Verständnis der Entity-API und der Wrapper führen. Es ist ein Vortrag von Fago, dem Entity-Typ. wolfgangziegler.net/drupalcon-denver
Ken
Danke, das klingt nach dem Eröffnungsgambit wirklich nützlich. Ich werde es mir noch einmal ansehen, wenn ich etwas Zeit habe
Clive
Das "Video wurde von blip entfernt", aber die Folien werden weiterhin heruntergeladen.
Artfulrobot

Antworten:

23

Ja, das Ändern des Status eines Knotens ist trivial, da dies eine fest codierte Eigenschaft ist.

Felder hingegen sind viel komplizierter. Sie sind drei Ebenen tief verschachtelt, während es field_get_items () gibt , um sie in die richtige Sprache zu bringen, gibt es keine solche Funktion zum Festlegen von Feldwerten. Sie müssen also immer prüfen, ob ein Feld übersetzbar ist oder nicht, und Sie müssen wissen, welche Eigenschaft genau die Werte enthält, die Sie suchen / festlegen möchten.

Zwei Beispiele, die zeigen, was der Entity Wrapper kann:

  • In der folgenden Zeile wird der Bestellung die Werbebuchung für den Handel hinzugefügt, wobei die Sprache und die tatsächliche Eigenschaft, die die Referenz-ID enthält, berücksichtigt werden

    $order_wrapper->commerce_line_items[] = $line_item;
  • Auf ähnliche Weise können Sie direkt auf einen Wert eines Feldes zugreifen, ohne die Sprache oder das Delta überprüfen zu müssen, und Sie können sogar direkt auf referenzierte Entitäten zugreifen, die von /drupal//a/ stammen. 33010/31

    $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
    $default = $subnode->title;

Der Entity Wrapper ist die treibende Kraft hinter flexiblen, leistungsstarken Modulen wie Search API und Rules, da er es ihnen ermöglicht, sich durch mehrere Referenzebenen zu arbeiten, sodass Sie z. B. auf ein Feld des Produkts zugreifen können, das ein Benutzer in einer Bestellung mit etwas gekauft hat wie [commerce-order:commerce-line-items:0:commerce-product:some-field](vielleicht nicht wirklich richtig sein, aber so ähnlich), oder den Körper Zusammenfassung eines referenzierten Knoten zu Suchindex hinzuzufügen.

Trotzdem mag ich nicht unbedingt die eigentliche API des Wrappers, es sind riesige interne Arrays, und selbst einfache Eigenschaften sind wieder Wrapper-Klassen. Ich hoffe, dass das verbesserte Entity-System (und hoffentlich Field-System) in Drupal 8 die Notwendigkeit eines solchen Wrappers durch klassifizierte Entities überflüssig macht.

Berdir
quelle
Genial, ich wusste, dass ich damit etwas verpasst hatte. Ich denke, es war die Beschreibung der EntityDrupalWrapper, die die Verwirrung verursachte; als es um 'properties' ging, merkte ich gar nicht, dass felder involviert waren, ich dachte nur, es bedeutete wörtlich, dass die klasse sich um eigenschaften kümmerte (nid, status, etc). Vielen Dank, dass Sie das geklärt haben. Wenn Sie wissen, dass das Rules-Modul es für die Datenauswahl verwendet, ist das viel sinnvoller
Clive
@Berdir "Ich mag die API des Wrappers nicht unbedingt ..." Ich habe die gleichen Gefühle wie Sie. Tun Sie etwas, um dem entgegenzuwirken? Verwenden Sie field_view_value (), um Werte anzuzeigen? Wie würden Sie empfehlen, Werte in benutzerdefinierten Rückrufen für einen benutzerdefinierten Workflow oder ein benutzerdefiniertes Dashboard festzulegen?
Charlie Schliesser