Quale hook posso usare per le azioni post-salvataggio?


16

Ho trovato diversi post con questa stessa domanda, ma le risposte divergono sempre su qualche altro argomento o non funzionano per le mie esigenze.

Dopo aver salvato un nodo, voglio che il mio modulo personalizzato inserisca una riga in una delle mie tabelle personalizzate che contenga il nid del nuovo nodo. Quando hook_node_submitviene chiamato, il nid non esiste ancora. hook_node_insertha il nid, ma viene chiamato solo la prima volta che il nodo viene salvato, ma potenzialmente ho bisogno di agire ogni volta che il nodo viene salvato.

Il mio piano è quello di separare la mia funzionalità nel suo metodo e implementare entrambi gli hook, ma sto cercando di imparare a fare le cose correttamente con Drupal e quindi mi chiedo se esiste un hook che si adatti effettivamente alle mie esigenze.

Esiste un hook che viene chiamato ogni volta che un nodo viene salvato e chiamato DOPO che il salvataggio è completo?


3
puoi usare la combinazione di hook_node_inserte hook_node_update(agisce ogni volta che un nodo viene salvato).
AjitS

Sì, l'ho descritto nel post sopra.
Kenny Wyland,

@KennyWyland di cui hai parlato hook_node_submitma no hook_node_update?
David Thomas,

Otterrai il nodo nid in hook_node_inserte in hook_node_update.
Sumit Madan,

2
hook_node_insert()e hook_node_update()sono i ganci corretti per questo, hook_node_submit()viene chiamato durante il processo di invio del modulo prima che il nodo venga salvato. Non dimenticare che devi cancellare le cache ogni volta che aggiungi / rimuovi un hook
Clive

Risposte:


5

Guardando i commenti sulla domanda, sembra che la soluzione ovvia sia usare i ganci hook_node_insert()e hook_node_update().

In realtà ho appena fatto qualcosa di molto simile come descritto nella risposta: ho scritto una funzione che fa quello che voglio fare ogni volta che un nodo viene creato / aggiornato e quindi lo chiamo da ciascuno di questi hook. Funziona bene.


Questo è figo! Potresti persino farlo da hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannx L'aspetto negativo di quel metodo è che sarebbe chiamato solo quando un nodo veniva inserito / aggiornato tramite un modulo specifico. Nel mio caso, avevo bisogno di catturare tutte le aggiunte e le modifiche dei nodi.
Ciambella

12

Il modo corretto per farlo è rispettare la transazione db di Drupal. Se si desidera eseguire qualsiasi azione del database in hook_node_insert, è necessario considerare che il nodo non è stato ancora effettivamente salvato. il che significa che se fallisce e il rollback si finisce con dati orfani nel database. Quindi è necessario utilizzare l'API del database Drupal e non dirigere l'esecuzione della query.

Se si desidera aggiornare il nodo stesso in hook_node_insert, non è possibile perché non è possibile utilizzare node_save poiché il nodo non è ancora salvato nel database e la sua chiamata causa un'eccezione. Una soluzione consiste nell'utilizzare la funzione register_shutdown_function e il passaggio del nid, è possibile utilizzare node_load per assicurarsi che sia realmente salvato e quindi eseguire qualsiasi altra azione desiderata sul nuovo nodo.

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

AGGIORNAMENTO: Puoi anche trovare un'alternativa più semplice qui /programming//a/24035797/1726778


1
Buona idea. Anche se è meglio usare drupal_register_shutdown_function(). Ma tieni
Shevchuk

Ho avuto problemi a verificare se un nodo si comportava come un gruppo organico og_is_group. Penso che stavo ottenendo falsi negativi per questo motivo.
icicleking

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.