"Set" -Version von field_get_items?

9

Mit kann man Feldelemente aus einer Entität abrufen

// Find all terms on $node in field 'field_tags'.
$terms = field_get_items('node', $node, 'field_tags');

Aber gibt es eine bequeme Möglichkeit, das Gegenteil zu tun, Core oder auf andere Weise?

// Attach new term $term to $node in field 'field_tags'.
$term = taxonomy_term_load($tid);
$node = field_set_items('node', $node, 'field_tags', 'taxonomy_term', $term);
node_save($node);

Ich möchte den Aufwand vermeiden, einen $ -Term manuell manuell zuzuweisen, in der Entwicklung nachzuschauen, wie die Array-Struktur aussieht, und dann das Array von Hand zu erstellen, da es manchmal nicht trivial ist.

Das einzige Problem in der Kernwarteschlange, das ich finden konnte und das vage ähnlich aussah, betraf die Feldsprache API DX .

Letharion
quelle

Antworten:

6

Nein, es gibt keine solche Funktion.

Siehe meinen Kommentar unter Sprachunterstützung für Entitätsfelder .

Berdir
quelle
1
Danke Berdir. Ich hatte gehofft, dass du auftauchst;) und ich hatte auch Angst, dass du es sagst. Das Problem mit dem Code in Ihrem Kommentar ist, dass für viele Felder der Wert möglicherweise unzureichend oder einfach falsch ist.
Letharion
field_get_items () hilft Ihnen auch nicht dabei, es gibt ein Array von Elementen zurück, die Wert enthalten. Oder was auch immer der Feldtyp definiert. Es gibt keine Möglichkeit, dies zu abstrahieren.
Berdir
Beispielsweise gibt field_get_items () ein Array zurück (array ('tid' => 123)). Ihr Code muss wissen, dass field_tags eine Referenz für einen Taxonomiebegriff ist, dass der tid-Schlüssel festgelegt ist und dass es sich um eine Referenz zu einem Taxonomiebegriff handelt.
Berdir
Die Kommentare sind auf dieser Seite gemäß dem angegebenen Link nicht mehr sichtbar.
Junaid
Kommentare sind jetzt auf der Diskussionsseite: drupal.org/node/1500308/discuss
Berdir
2

Damit eine solche Funktion existiert, field_set_items()müsste sie in der Lage sein, das stdClassObjekt als das eines Taxonomiebegriffs zu identifizieren und es auch einer Funktion zuzuordnen, die das Objekt dekodieren und daraus ein Feldarray erstellen kann.

Da es dafür keine Kernfunktion gibt, denke ich nicht, dass dies einfach sein wird.

Clive
quelle
Es ist furchtbar irritierend, dass es (noch) keine Eigenschaft $ entity-> entity_type gibt , aber unabhängig davon könnte dies leicht zu meinem Beispiel-Rückruf hinzugefügt werden. Ich habe die Frage aktualisiert, um dies widerzuspiegeln.
Letharion
1
Das Fehlen eines entity_typeist meiner Meinung nach nicht wirklich das Problem ... das Problem ist genau das, was Sie Ihrer Frage hinzugefügt haben: "Es ist manchmal nicht trivial". Da die Daten nicht trivial sind, field_set_itemsmuss jeder Feldtyp im System eine Art Schnittstelle implementieren, die beschreibt, wie das Datenarray aus einem Objekt / einer beliebigen Variablen rückentwickelt wird, damit Sie wie gewünscht arbeiten können.
Clive
2

Obwohl dies nicht dazu beiträgt, die manchmal komplizierte Array-Struktur aufzubauen, sehe ich, dass das, wonach ich suche, in Drupal 8 zu einem gewissen Grad eingeführt wurde. Vielleicht wird es in Zukunft weiter ausgebaut. :) :)

Neue einfachere API für den Zugriff auf Felder, Eigenschaften und Sprachinformationen .

Anwendungsbeispiel von der verlinkten Seite:

<?php
// Change a field value.
$body = $comment->get('comment_body');
$body[0]['value'] = 'This is actually a perverted tango';
$comment->set('comment_body', $body);
Letharion
quelle