Wie aktualisiere ich einen Feldwert für einen Knoten?

21

Ich möchte den Wert eines Feldes für einen Knoten ändern. Ich habe den folgenden Code verwendet:


$node = node_load($nid); // $nid is the function's parameter
$node->field['field_myfield'][$node->language][0]['value'] = 1;
node_save($node);

Das Problem ist die $node->languageRückkehr, eswährend print_r($node)es ist und. Warum $node->languageist anders als in $ node array und wie kann ich es bekommen?

hpn
quelle

Antworten:

41
$node = node_load($nid);
$node_wrapper = entity_metadata_wrapper('node', $node);
$node_wrapper->field_myfield->set(1);
$node_wrapper->save();

Entity Metadata Wrapper ist eine großartige Möglichkeit, Werte von Feldern im Knoten zu setzen oder zu lesen!

kyvour
quelle
Ich bevorzuge entity_metadata_wrapper, weil es die Dinge schön und sauber macht. Ich würde eine Überprüfung einschließen, ob $ node nach node_load () vorhanden ist, um einen unangenehmen Fehler zu vermeiden, wenn versehentlich NULL an entity_metadata_wrapper () übergeben wird.
Texas-Bronius
Sie können die $ nid direkt an EMW übergeben.
Nawfal
Die Verwendung von entity_metadata_wrapper sollte die akzeptierte Antwort sein.
Akalata
2
Falls es für andere nicht offensichtlich ist, ist entity_metadata_wrapper () Teil des Entity-API-Moduls: drupal.org/project/entity
BWPanda
9

field_attach_update()Funktion ausprobieren .

$node = node_load($nid); // $nid is the function's parameter
$node->field['field_myfield'][LANGUAGE_NONE][0]['value'] = 1;
field_attach_update('node', $node);

Der Feldwert wird aktualisiert und die Leistung ist besser als node_save.

zaibatsu
quelle
1
warum ist field_attach_update downvoted?
Milkovsky
6
$node = node_load($nid); 
$field_language = field_language('node', $node, 'field_myfield');
$node->field['field_myfield'][$field_language][0]['value'] = 1;
node_save($node);
lenni
quelle
4

Wenn Sie nur den Feldwert aktualisieren möchten (ohne die Metadaten des Knotens zur aktualisierten Zeit und zu Revisionen zu aktualisieren), verwenden Sie die Funktion field_attach_update().

Beispiel:

$node = node_load($nid);
$field_language = field_language('node', $node, 'field_myfield');
$node->field_fieldname[$field_language][0]['value'] = 'some value';
field_attach_update('node', $node);

Manchmal müssen Sie zusätzlich möglicherweise den statischen Cache des Knotens zurücksetzen mit resetCache(array($nid)):

entity_get_controller('node')->resetCache(array($node->nid));

Quelle: Speichern der Felder des Knotens, ohne den Knoten selbst zu speichern

milkovsky
quelle
2

Ich habe dies gerade implementiert und festgestellt, dass dieser Code für mich funktioniert.

$node = node_load($nid); 
if (isset($node)) {
  $field_language = field_language('node', $node, 'field_myfield');
  $node->field_fieldname[$field_language][0]['value'] = 'some value';
  node_save($node);
}

Beachten Sie, dass ich bei der Aktualisierung von field_fieldname festgestellt habe, dass dies in Zeile 4 verwendet wird

$node->field['field_myfield'][0]['value'] = 'some value';

funktioniert nicht.

Niccolo
quelle