Wrappers de metadados da entidade
A API da entidade fornece algumas classes de wrapper que você pode usar para lidar facilmente com entidades e alavancar os módulos de informações de propriedade da entidade fornecidos. Com a ajuda dos wrappers, você pode acessar as informações da propriedade, fazer um loop sobre propriedades conhecidas ou apenas obter / definir os valores de dados descritos etc.
Estes são alguns exemplos simples de uso, conforme encontrados no README:
Para utilizar essas informações (metadados), o módulo fornece algumas classes de wrapper que facilitam a obtenção e a configuração de valores. O wrapper suporta o uso encadeado para recuperar os wrappers das propriedades da entidade, por exemplo, para obter o endereço de email do autor do nó que se poderia usar:
$wrapper = entity_metadata_wrapper('node', $node);
$wrapper->author->mail->value();
Para atualizar o endereço de e-mail do usuário, pode-se usar
$wrapper->author->mail->set('[email protected]');
ou
$wrapper->author->mail = '[email protected]';
Os wrappers sempre retornam os dados, conforme descrito nas informações da propriedade, que podem ser recuperadas diretamente via entity_get_property_info () ou no wrapper:
$mail_info = $wrapper->author->mail->info();
Para forçar a obtenção de um valor textual higienizado para a saída, pode-se usar, por exemplo,
$wrapper->title->value(array('sanitize' => TRUE));
para obter o título do nó higienizado. Quando uma propriedade já é retornada higienizada por padrão, como o corpo do nó, é possível obter os dados não higienizados como apareceriam em um navegador para outros casos de uso. Para isso, é possível ativar a opção 'decodificar', que garante que todos os dados higienizados sejam removidos e as tags HTML decodificadas antes da devolução da propriedade:
$wrapper->body->value->value(array('decode' => TRUE));
Dessa forma, sempre se obtém os dados como mostrado ao usuário. No entanto, se você realmente deseja obter o valor bruto e não processado, mesmo para dados textuais higienizados, é possível:
$wrapper->body->value->raw();
Mais exemplos:
$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();
Mais documentos : http://drupal.org/node/1021556
Ligar
field_attach_update('node', $node)
para o final dehook_node_update
funcionou para mim. Suponho quefield_attach_insert('node', $node)
no finalhook_node_insert
funcionaria também. Portanto, uma função de amostra ficaria assim:Não há necessidade de ligar
node_load
node_save
ou devolver nada.Penso que a razão para isto é que
node_save
, a partir da qualhook_node_update
ehook_node_insert
chamado, agrupa todas as consultas de banco de dados em uma transação. (Observe a primeira linha denode_save
:.$transaction = db_transaction()
) Essas consultas não são chamadas até onode_save
término. A última consulta que énode_save
adicionada à transação é chamada defield_attach_update
, que usa o objeto $ node como anteshook_node_update
. Então, você precisa enfileirar outra consulta chamandofield_attach_update
novamente. Pelo menos, essa é a minha compreensão do que está acontecendo.Se estiver com problemas para alterar atributos que não são de campo do nó (por exemplo,
$node->log
), tente ligar_node_save_revision($node, $user->uid, 'vid');
também. Isso não criará uma nova revisão.fonte
É assim que você altera os valores em um nó:
fonte
und
não é realmente apropriado aqui, o OP já declarou no código que está usando$node->language
o código do idiomaUma melhoria da solução de Lance acima, evitando o salvamento de um nó inteiro quando apenas alguns valores de campo são modificados:
Isso também pode ser útil para evitar efeitos colaterais
node_save()
.Origem: salvando os campos do nó sem salvar o próprio nó
https://www.urbaninsight.com/2011/10/24/saving-nodes-fields-without-saving-node-itself
fonte