Como atualizar um valor de campo para um nó?

21

Quero alterar o valor de um campo para um nó. Usei o seguinte código:


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

O problema é o $node->languageretorno esenquanto print_r($node)está nele und. Por que $node->languageé diferente do que está na matriz $ node e como posso obtê-lo?

hpn
fonte

Respostas:

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

O wrapper de metadados da entidade é uma ótima maneira de definir ou ler valores de campos no nó!

Kyvour
fonte
Prefiro entity_metadata_wrapper bc, torna as coisas boas e limpas. Eu incluiria uma verificação para saber se $ node existe após o node_load () para evitar um erro grave ao passar inadvertidamente NULL para entity_metadata_wrapper ().
Texas-bronius
Você pode passar diretamente o $ nid para o EMW.
Nawfal # 4/16
usar entity_metadata_wrapper deve ser a resposta aceita.
akalata
2
No caso não é óbvio para os outros, entity_metadata_wrapper () é parte do módulo API Entity: drupal.org/project/entity
BWPanda
9

Tente field_attach_update()função.

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

Ele atualizará o valor do campo e terá um desempenho melhor que node_save.

zaibatsu
fonte
1
por que field_attach_update está com voto negativo?
milkovsky 22/02
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
fonte
4

Se você quiser atualizar apenas o valor do campo (sem atualizar os metadados nó sobre o tempo atualizado, revisões) use a função field_attach_update().

Exemplo:

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

Às vezes, adicionalmente, você pode precisar redefinir o cache estático do nó com resetCache(array($nid)):

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

Origem: salvando os campos do nó sem salvar o próprio nó

milkovsky
fonte
2

Acabei de implementar isso e descobri que esse código funcionava para mim.

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

Observe que ao atualizar field_fieldname, descobri que usando isso na linha 4

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

não funcionou.

Niccolo
fonte