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 EntityDrupalWrapper
Klasse 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?
Antworten:
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
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
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.
quelle
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