Comment mettre à jour une valeur de champ pour un nœud?

21

Je souhaite modifier la valeur d'un champ pour un nœud. J'ai utilisé le code suivant:


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

Le problème est le $node->languageretour espendant print_r($node)qu'il est und. Pourquoi $node->languageest différent de ce qui est dans le tableau $ node et comment puis-je l'obtenir?

hpn
la source

Réponses:

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

L'encapsuleur de métadonnées d'entité est un excellent moyen de définir ou de lire les valeurs des champs dans le nœud!

kyvour
la source
Je préfère entity_metadata_wrapper car cela rend les choses agréables et propres. Je voudrais inclure une vérification pour savoir si $ node existe après le node_load () pour éviter une erreur désagréable lors du passage par inadvertance de NULL dans entity_metadata_wrapper ().
texas-bronius
Vous pouvez directement transmettre le $ nid à EMW.
nawfal
l'utilisation de entity_metadata_wrapper devrait être la réponse acceptée.
akalata
2
Dans le cas où cela n'est pas évident pour les autres, entity_metadata_wrapper () fait partie du module API d'entité: drupal.org/project/entity
BWPanda
9

Essayez la field_attach_update()fonction.

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

Il mettra à jour la valeur du champ et il fonctionne mieux que node_save.

zaibatsu
la source
1
pourquoi field_attach_update est voté en aval?
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
la source
4

Si vous souhaitez mettre à jour uniquement la valeur du champ (sans mettre à jour les métadonnées du nœud sur l'heure mise à jour, les révisions), utilisez la fonction field_attach_update().

Exemple:

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

Parfois, vous devrez également réinitialiser le cache statique du nœud avec resetCache(array($nid)):

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

Source: enregistrement des champs du nœud sans enregistrer le nœud lui-même

milkovsky
la source
2

Je viens de l'implémenter et j'ai constaté que ce code fonctionnait pour moi.

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

Notez que lors de la mise à jour de field_fieldname, j'ai trouvé que l'utilisation de ceci à la ligne 4

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

n'a pas fonctionné.

Niccolo
la source