Que gancho posso usar para ações pós-salvamento?

16

Eu encontrei vários posts com essa mesma pergunta, mas as respostas sempre divergem para outro tópico ou elas não funcionam para as minhas necessidades.

Depois que um nó é salvo, desejo que meu módulo personalizado insira uma linha em uma das minhas tabelas personalizadas que contém o nid do novo nó. Quando hook_node_submité chamado, o nid ainda não existe. hook_node_inserttem o nid, mas só é chamado na primeira vez em que o nó é salvo, mas potencialmente preciso tomar uma ação cada vez que o nó é salvo.

Meu plano é separar minha funcionalidade em seu próprio método e implementar os dois ganchos, mas estou tentando aprender a fazer as coisas corretamente com o Drupal e, portanto, estou me perguntando se existe um gancho que realmente se encaixe nos meus requisitos.

Existe um gancho chamado toda vez que um nó é salvo e chamado APÓS a gravação ser concluída?

Kenny Wyland
fonte
3
você pode usar a combinação de hook_node_inserte hook_node_update(atua sempre que um nó está sendo salvo).
precisa saber é
Sim, eu descrevi isso no post acima.
Kenny Wyland 15/01
@KennyWyland que você mencionou, hook_node_submitmas não hook_node_update?
18713 David David
Você vai ter o nid nó hook_node_insert, bem como em hook_node_update.
usar o seguinte comando
2
hook_node_insert()e hook_node_update()são os ganchos corretos para isso, hook_node_submit()é chamado durante o processo de envio do formulário antes que o nó seja salvo. Não se esqueça de que você precisa limpar os caches sempre que adicionar / remover um gancho
Clive

Respostas:

5

Olhando para os comentários sobre a questão, parece que a solução óbvia é usar os ganchos hook_node_insert()e hook_node_update().

Na verdade, fiz algo muito semelhante ao descrito na resposta: escrevi uma função que faz o que quero que seja feita toda vez que um nó é criado / atualizado e, em seguida, chamo-o de cada um desses ganchos. Funciona muito bem.

rosquinha
fonte
Isso é legal! Você pode até fazer isso hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx
11
@leymannx A desvantagem desse método é que ele só seria chamado quando um nó fosse inserido / atualizado por meio de um formulário específico. No meu caso, eu precisava capturar todas as adições e modificações de nós.
rosquinha
12

A maneira correta de fazer isso é respeitar a transação db do Drupal. Se você deseja executar alguma ação do banco de dados em hook_node_insert, considere que o nó ainda não foi realmente salvo. o que significa que, se falhar e reverter, você terá dados órfãos no banco de dados. Portanto, a API do banco de dados Drupal deve ser usada e não a execução direta da consulta.

Se você deseja atualizar o próprio nó em hook_node_insert, não é possível, porque não é possível usar o node_save, pois o nó ainda não está salvo no banco de dados e a chamada causa exceção. Uma solução é usar a função register_shutdown_function e passar o nid, você pode usar o node_load para garantir que ele esteja realmente salvo e executar qualquer outra ação que desejar no novo nó.

function your_module_node_update($node){
  if($node->type == 'your_node'){
    register_shutdown_function('_your_module_post_insert',$node->nid);
  }
}

function _your_module_post_insert($nid) {
  $node = node_load($nid);
  if ($node) {
      node_save($node);
  }
} 

ATUALIZAÇÃO: Você também pode encontrar uma alternativa mais fácil aqui /programming//a/24035797/1726778

Sina Salek
fonte
11
Boa ideia. Embora seja melhor usar drupal_register_shutdown_function(). Mas esteja ciente de que ambos parecem ter problemas em ambiente php-fpm, consulte drupal.stackexchange.com/q/102603/10667
Shevchuk
Eu estava tendo problemas para verificar se um nó estava agindo como um grupo orgânico og_is_group. Eu acho que estava recebendo falsos negativos por esse motivo.
Icicleking
5

Existe um novo módulo drupal, Hook Post Action , que adiciona os ganchos de pós-salvamento. Vamos tentar ver se funciona.

Druvision
fonte