Contenedores de metadatos de entidad
La API de entidad proporciona algunas clases de contenedor que puede usar para tratar fácilmente con entidades y aprovechar los módulos de información de propiedad de entidad proporcionados. Con la ayuda de los contenedores, puede acceder a la información de la propiedad, recorrer las propiedades conocidas o simplemente obtener / establecer los valores de datos descritos, etc.
Estos son algunos ejemplos de uso simples que se encuentran en el archivo README:
Para hacer uso de esta información (metadatos), el módulo proporciona algunas clases de contenedor que facilitan la obtención y el establecimiento de valores. El contenedor admite el uso encadenado para recuperar contenedores de propiedades de entidad, por ejemplo, para obtener la dirección de correo del autor de un nodo, se podría usar:
$wrapper = entity_metadata_wrapper('node', $node);
$wrapper->author->mail->value();
Para actualizar la dirección de correo del usuario, se podría usar
$wrapper->author->mail->set('[email protected]');
o
$wrapper->author->mail = '[email protected]';
Los contenedores siempre devuelven los datos como se describe en la información de la propiedad, que se puede recuperar directamente a través de entity_get_property_info () o desde el contenedor:
$mail_info = $wrapper->author->mail->info();
Para forzar la obtención de un valor textual desinfectado para la salida, se puede usar, por ejemplo
$wrapper->title->value(array('sanitize' => TRUE));
para obtener el título del nodo desinfectado. Cuando una propiedad ya se devuelve desinfectada de manera predeterminada, como el cuerpo del nodo, uno posiblemente quiera obtener los datos no desinfectados como aparecerían en un navegador para otros casos de uso. Para hacerlo, se puede habilitar la opción 'decodificar', que garantiza que para cualquier información desinfectada se eliminen las etiquetas y se decodifiquen las entidades HTML antes de que se devuelva la propiedad:
$wrapper->body->value->value(array('decode' => TRUE));
De esa manera, uno siempre obtiene los datos como se muestran al usuario. Sin embargo, si realmente desea obtener el valor sin procesar, incluso para los datos textuales desinfectados, puede hacerlo a través de:
$wrapper->body->value->raw();
Más ejemplos:
$wrapper->body->set(array('value' => "content"));
$wrapper->field_text[0] = 'the text';
$wrapper->field_text[0]->set(array('value' => "content"));
$wrapper->field_text2->summary = 'the summary';
$wrapper->field_text2->value = 'the text';
$wrapper->save();
$wrapper->delete();
Más documentos : http://drupal.org/node/1021556
Llamar
field_attach_update('node', $node)
al final dehook_node_update
trabajado para mí. Supongo quefield_attach_insert('node', $node)
al finalhook_node_insert
también funcionaría. Entonces, una función de muestra se vería así:No hay necesidad de llamar
node_load
node_save
o devolver nada.Creo que la razón de esto es que
node_save
, a partir de la cualhook_node_update
yhook_node_insert
se llama, envuelve todas las consultas de la base de datos en una transacción. (Tenga en cuenta la primera línea denode_save
:.$transaction = db_transaction()
) Estas consultas no se llaman hasta quenode_save
finaliza. Senode_save
llama a la última consulta que se agrega a la transacciónfield_attach_update
, que usa el objeto $ node como se llama anteshook_node_update
. Por lo tanto, debe poner en cola otra consulta llamandofield_attach_update
nuevamente. Al menos, esa es mi comprensión de lo que está sucediendo.Si tiene problemas para cambiar los atributos que no son de campo del nodo (por ejemplo,
$node->log
), intente llamar_node_save_revision($node, $user->uid, 'vid');
también. Esto no creará una nueva revisión.fuente
Así es como cambia los valores en un nodo:
fuente
und
no es realmente apropiado aquí, OP ya ha indicado en el código que están usando$node->language
para el código de idiomaUna mejora de la solución anterior de Lance, que evita guardar un nodo completo cuando solo se modifican unos pocos valores de campo:
Esto también podría ser útil para evitar los efectos secundarios de
node_save()
.Fuente: guardar campos del nodo sin guardar el nodo en sí
https://www.urbaninsight.com/2011/10/24/saving-nodes-fields-without-saving-node-itself
fuente