¿Cómo actualizar un valor de campo para un nodo?

21

Quiero cambiar el valor de un campo para un nodo. Utilicé el siguiente código:


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

El problema es $node->languagedevuelve esmientras está en print_r($node)él und. ¿Por qué $node->languagees diferente de lo que hay en la matriz $ node y cómo puedo obtenerlo?

hpn
fuente

Respuestas:

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

¡El contenedor de metadatos de entidad es una excelente manera de establecer o leer valores de campos en el nodo!

Kyvour
fuente
Prefiero entity_metadata_wrapper bc porque hace las cosas bonitas y limpias. Incluiría una comprobación de si $ node existe después de node_load () para evitar un error desagradable al pasar NULL inadvertidamente a entity_metadata_wrapper ().
texas-bronius
Puede pasar directamente el $ nid a EMW.
nawfal
El uso de entity_metadata_wrapper debe ser la respuesta aceptada.
akalata
2
En caso de que no sea obvio para otros, entity_metadata_wrapper () es parte del módulo Entity API: drupal.org/project/entity
BWPanda
9

Prueba la field_attach_update()función.

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

Actualizará el valor del campo y funcionará mejor que node_save.

zaibatsu
fuente
1
¿Por qué field_attach_update se rechaza?
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
fuente
4

Si desea actualizar solo el valor del campo (sin actualizar los metadatos del nodo sobre el tiempo actualizado, las revisiones) use la función field_attach_update().

Ejemplo:

$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 veces, adicionalmente, es posible que deba restablecer el caché estático del nodo con resetCache(array($nid)):

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

Fuente: guardar campos del nodo sin guardar el nodo en sí

milkovsky
fuente
2

Acabo de implementar esto y descubrí que este código funcionó para mí.

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

Tenga en cuenta que al actualizar field_fieldname encontré que al usar esto en la línea 4

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

no funcionó.

Niccolo
fuente