Atualizar programaticamente o valor de um campo

14

Desejo atualizar o valor de um campo de nó quando um nó é atualizado.

Tentei usar o código mencionado aqui Atualizando programaticamente um nó Drupal 8

use Drupal\node\Entity\Node;

    function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {

      $check = \Drupal::routeMatch()->getParameter('node');

      if ($check) {
      $node = Node::load($check->nid->value);
      $node->title->value = 'testing';     //set value for field
      $node->save();
      }
    }

mas não funcionou. Eu recebo um erro 500 depois de salvar o nó. Também tentei retirar a instrução if e especificar uma identificação de nó$node = Node::load(1);

Eu também tentei usar Atualizar um nó / Entidade programaticamente no Drupal 8

use Drupal\node\Entity\Node;


function hello_world_node_update(Drupal\node\NodeInterface $node) {

$node = Node::load(1);
$node->set("title", 'New value'); // also tried $node->setTitle('The new Title');
$node->save();

}

mas sem sorte também.

Além disso, tentei usar diferentes ganchos entity_presave, entity_update, node_update, mas não fez nenhuma diferença.

Sem suor
fonte

Respostas:

25

Você pode tentar este código:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}
MrD
fonte
Graças a isso funcionou, se alguém quiser adicionar outras variações possíveis, fique à vontade para adicionar outra resposta.
No Sssweat
1
@NoSssweat: estou certo ao supor que a linha com "corpo" no código mostrado nesta resposta não é realmente necessária para responder à sua pergunta? E que essa linha ilustra como você pode fazer coisas semelhantes com (por exemplo) corpo? Além disso, como sua pergunta era sobre um "campo", você poderia usar uma linha semelhante à linha com "corpo" para um campo personalizado, com o nome da máquina (por exemplo) field_my_extra_field? Desculpem o que parece ser um seqüestro de uma resposta para fazer novas perguntas, mas apenas "mostrar código" em uma resposta (sem nenhuma explicação) também não é percebido como uma boa prática por aqui, certo?
precisa saber é o seguinte
1
@ Pierre.Vriens Eu usei o título no meu Q para simplificar. Imaginei que, se soubesse como alterar o título, seria o mesmo para qualquer campo, basta alterar o nome da máquina. Acontece que esta resposta usa um método específico para alterar o título, o que não funcionaria em nenhum outro campo, por isso é realmente importante que ele mostre o método para o corpo.
No Sssweat,
Não consigo pegar esse gancho. Eu edito um tipo de conteúdo, clique em enviar, mas nada.
Pablo Pablo
7

Essa é outra variação do uso do gancho que você tentou usar originalmente.

Eu acho que o problema com o seu código é que você tenta carregar uma nova instância do nó, mas você deve usar o nó que é fornecido como paramater $entity:

use Drupal\node\NodeInterface;

function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity)   {
  if ($entity instanceof NodeInterface) {
    $entity->title->value = 'testing';     //set value for field
    // $entity->save(); (not needed)
  }
}

Editar:

Adicionada a instrução de uso ao código.

4k4
fonte
1
apenas tentei o seu código, mas ele está quebrando o site, recebendo o clássicoThe website encountered an unexpected error. Please try again later.
Não Sssweat
1
Este código é apenas para demonstrar como usar o gancho. Você precisa das instruções de uso corretas. Você pode descobrir isso, se procurar em watchdog (/ admin / reports / dblog).
4k4
1
adicionar use Drupal\node\NodeInterface;código não interrompe mais automaticamente o site, mas depois de salvar o nó, recebo o erro 500 como estava na minha pergunta e os logs não registram nada sobre isso.
No Sssweat
1
Eu só queria apontar para o problema: não carregue uma nova instância do nó, mas use a fornecida como parâmetro de função. Que erro está por trás de 500? Verifique seus arquivos de log ou ative o log de erros.
4k4
1
Eu limpar o registo, então eu não ficar confuso com todos os outros erros anteriores, mas depois de salvar e recebendo o erro várias vezes os arquivos de log estão vazios
Não Sssweat
3

Os títulos no Drupal 8 não são definidos como campos padrão; eles têm sua própria função. Use $node->setTitle('New Title');para um nó ou $entity->setLabel('New Title');para uma entidade genérica. Veja Node :: setTitle para mais informações.

Tom Bisciglia
fonte