Wrapper für Entitätsmetadaten
Die Entitäts-API bietet einige Wrapper-Klassen, mit denen Sie auf einfache Weise mit Entitäten umgehen und die bereitgestellten Entitätseigenschafts-Informationsmodule nutzen können. Mit Hilfe der Wrapper können Sie auf die Eigenschaftsinformationen zugreifen, bekannte Eigenschaften durchlaufen oder einfach die beschriebenen Datenwerte abrufen / festlegen usw.
Dies sind einige einfache Anwendungsbeispiele, wie sie in der README zu finden sind:
Um diese Informationen (Metadaten) zu nutzen, stellt das Modul einige Wrapper-Klassen zur Verfügung, die das Abrufen und Festlegen von Werten erleichtern. Der Wrapper unterstützt die verkettete Verwendung zum Abrufen von Wrappern von Entitätseigenschaften, z. B. um die E-Mail-Adresse eines Knotenautors abzurufen, die verwendet werden kann:
$wrapper = entity_metadata_wrapper('node', $node);
$wrapper->author->mail->value();
Um die E-Mail-Adresse des Benutzers zu aktualisieren, könnte man verwenden
$wrapper->author->mail->set('[email protected]');
oder
$wrapper->author->mail = '[email protected]';
Die Wrapper geben die Daten immer wie in den Eigenschaftsinformationen beschrieben zurück, die direkt über entity_get_property_info () oder vom Wrapper abgerufen werden können:
$mail_info = $wrapper->author->mail->info();
Um zu erzwingen, dass ein Textwert für die Ausgabe bereinigt wird, kann man z
$wrapper->title->value(array('sanitize' => TRUE));
um den Titel des bereinigten Knotens zu erhalten. Wenn eine Eigenschaft wie der Knotenkörper bereits standardmäßig bereinigt zurückgegeben wird, möchten Sie möglicherweise die nicht bereinigten Daten abrufen, wie sie in einem Browser für andere Anwendungsfälle angezeigt würden. Dazu kann die Option 'decode' aktiviert werden, mit der sichergestellt wird, dass die Tags für bereinigte Daten entfernt und HTML-Entitäten dekodiert werden, bevor die Eigenschaft zurückgegeben wird:
$wrapper->body->value->value(array('decode' => TRUE));
Auf diese Weise erhält man die Daten immer so, wie sie dem Benutzer angezeigt werden. Wenn Sie jedoch den unverarbeiteten Rohwert auch für bereinigte Textdaten erhalten möchten, können Sie dies über Folgendes tun:
$wrapper->body->value->raw();
Mehr Beispiele:
$wrapper->body->set(array('value' => "content"));
$wrapper->field_text[0] = 'the text';
$wrapper->field_text[0]->set(array('value' => "content"));
$wrapper->field_text2->summary = 'the summary';
$wrapper->field_text2->value = 'the text';
$wrapper->save();
$wrapper->delete();
Weitere Dokumente : http://drupal.org/node/1021556
Anruf
field_attach_update('node', $node)
am Endehook_node_update
hat bei mir geklappt. Ich gehe davon aus, dassfield_attach_insert('node', $node)
am Endehook_node_insert
auch funktionieren würde. Eine Beispielfunktion würde also so aussehen:Sie müssen nicht anrufen
node_load
node_save
nichts oder zurückgeben.Ich denke, der Grund dafür ist, dass
node_save
, von dem aushook_node_update
undhook_node_insert
aufgerufen werden, alle Datenbankabfragen in eine Transaktion eingeschlossen werden. (Beachten Sie die erste Zeile vonnode_save
:.$transaction = db_transaction()
) Diese Abfragen werden erst nach Abschluss aufgerufennode_save
. Die letzte Abfrage,node_save
die der Transaktion hinzugefügt wirdfield_attach_update
, wird von aufgerufen. Dabei wird das $ node-Objekt wie zuvorhook_node_update
aufgerufen. Sie müssen also eine weitere Abfrage in die Warteschlange stellen, indem Sie anrufenfield_attach_update
erneut . Zumindest verstehe ich das so.Wenn Sie Probleme beim Ändern von Nichtfeldattributen des Knotens haben (z. B.
$node->log
), rufen Sie_node_save_revision($node, $user->uid, 'vid');
ebenfalls an. Dadurch wird keine neue Revision erstellt.quelle
So ändern Sie Werte auf einem Knoten:
quelle
und
ist hier nicht wirklich angebracht, OP hat bereits im Code angegeben, dass sie$node->language
für den Sprachcode verwendenEine Verbesserung der obigen Lance-Lösung, bei der das Speichern eines gesamten Knotens vermieden wird, wenn nur wenige Feldwerte geändert werden:
Dies könnte auch nützlich sein, um Nebenwirkungen von zu vermeiden
node_save()
.Quelle: Speichern der Felder des Knotens, ohne den Knoten selbst zu speichern
https://www.urbaninsight.com/2011/10/24/saving-nodes-fields-without-saving-node-itself
quelle