Come aggiornare un valore di campo per un nodo?


21

Voglio cambiare il valore di un campo per un nodo. Ho usato il seguente codice:


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

Il problema è $node->languagerestituisce esmentre in print_r($node)è und. Perché $node->languageè diverso da ciò che è nell'array $ node e come posso ottenerlo?

Risposte:


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

Il wrapper dei metadati delle entità è un ottimo modo per impostare o leggere i valori dei campi nel nodo!


Preferisco entity_metadata_wrapper bc rende le cose belle e pulite. Includerei un controllo per verificare se $ node esiste dopo node_load () per evitare un brutto errore quando inavvertitamente passa NULL in entity_metadata_wrapper ().
texas-bronius,

È possibile passare direttamente $ nid a EMW.
nawfal,

usando entity_metadata_wrapper dovrebbe essere la risposta accettata.
Akalata,

2
Nel caso in cui non sia ovvio per gli altri, entity_metadata_wrapper () fa parte del modulo API Entity: drupal.org/project/entity
BWPanda

9

Prova la field_attach_update()funzione.

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

Aggiornerà il valore del campo e si comporta meglio di node_save.


1
perché field_attach_update è sottoposto a downgrade?
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);

4

Se si desidera aggiornare solo il valore del campo (senza aggiornare i metadati del nodo relativi all'ora e alle revisioni aggiornate) utilizzare la funzione field_attach_update() .

Esempio:

$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);

A volte potrebbe essere necessario ripristinare la cache statica del nodo con resetCache(array($nid)):

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

Origine: salvataggio dei campi del nodo senza salvare il nodo stesso


2

Ho appena implementato questo e ho scoperto che questo codice ha funzionato per me.

$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);
}

Si noti che durante l'aggiornamento di field_fieldname ho scoperto che utilizzando questo nella riga 4

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

non ha funzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.