Jakiego haka mogę użyć do działań po zapisaniu?

16

Znalazłem kilka postów z tym samym pytaniem, ale odpowiedzi zawsze odnoszą się do innego tematu lub nie odpowiadają moim potrzebom.

Po zapisaniu węzła chcę, aby mój moduł niestandardowy wstawił wiersz do jednej z moich tabel niestandardowych, która zawiera identyfikator nowego węzła. Kiedy hook_node_submitjest wywoływany, nid jeszcze nie istnieje. hook_node_insertma identyfikator nid, ale wywoływany jest tylko przy pierwszym zapisaniu węzła, ale potencjalnie muszę podjąć działanie za każdym razem, gdy węzeł zostanie zapisany.

Mój plan polega na rozdzieleniu mojej funkcjonalności na własną metodę i zaimplementowaniu obu haczyków, ale staram się nauczyć, jak robić rzeczy poprawnie z Drupalem, więc zastanawiam się, czy istnieje hak, który rzeczywiście odpowiada moim wymaganiom.

Czy istnieje hak, który jest wywoływany za każdym razem, gdy węzeł jest zapisywany i wywoływany PO zakończeniu zapisu?

Kenny Wyland
źródło
3
możesz użyć kombinacji hook_node_inserti hook_node_update(działa przy każdym zapisywaniu węzła).
AjitS 15.01.2013
Tak, opisałem to w powyższym poście.
Kenny Wyland
@KennyWyland wspomniałeś, hook_node_submitale nie hook_node_update?
David Thomas
Dostaniesz węzeł nid, hook_node_insertjak również w hook_node_update.
Sumit Madan 15.01.2013
2
hook_node_insert()i hook_node_update()są do tego odpowiednie zaczepy, hook_node_submit()są wywoływane podczas procesu przesyłania formularza przed zapisaniem węzła. Nie zapomnij, że musisz wyczyścić pamięć podręczną za każdym razem, gdy dodajesz / usuwasz haczyk
Clive

Odpowiedzi:

5

Patrząc na komentarze do pytania, wygląda na to, że oczywistym rozwiązaniem jest użycie haczyków hook_node_insert()i hook_node_update().

Właśnie zrobiłem coś bardzo podobnego do opisanego w odpowiedzi: napisałem funkcję, która robi to, co chcę, za każdym razem, gdy węzeł jest tworzony / aktualizowany, a następnie wywołuję go z każdego z tych zaczepów. Działa dobrze.

pączek
źródło
To super! Możesz nawet to zrobić hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx
1
@leymannx Minusem tej metody jest to, że zostanie wywołana tylko wtedy, gdy węzeł zostanie wstawiony / zaktualizowany za pomocą określonego formularza. W moim przypadku potrzebowałem złapać wszystkie dodatki i modyfikacje węzłów.
pączek
12

Prawidłowym sposobem na to jest przestrzeganie transakcji db Drupala. Jeśli chcesz wykonać dowolną akcję bazy danych w hook_node_insert, musisz wziąć pod uwagę, że węzeł nie został jeszcze zapisany. co oznacza, że ​​jeśli zawiedzie i zostanie przywrócony, w bazie danych zostaną osierocone dane. Dlatego należy używać interfejsu API bazy danych Drupal, a nie bezpośredniego wykonywania zapytań.

Jeśli chcesz zaktualizować sam węzeł w hook_node_insert, nie możesz tego zrobić, ponieważ nie jest możliwe użycie node_save, ponieważ węzeł nie jest jeszcze zapisany w bazie danych, a wywołanie go powoduje wyjątek. Jednym z rozwiązań jest użycie funkcji register_shutdown_function i przekazanie nid, możesz użyć node_load, aby upewnić się, że jest naprawdę zapisany, a następnie wykonać dowolną inną akcję na nowym węźle.

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

AKTUALIZACJA: Możesz również znaleźć łatwiejszą alternatywę tutaj /programming//a/24035797/1726778

Sina Salek
źródło
1
Dobry pomysł. Chociaż lepiej go używać drupal_register_shutdown_function(). Ale pamiętaj, że oba wydają się mieć problemy w środowisku php-fpm, patrz drupal.stackexchange.com/q/102603/10667
Szewczuk
Miałem problem ze sprawdzeniem, czy węzeł działa jako grupa organiczna og_is_group. Myślę, że z tego powodu dostawałem fałszywe negatywy.
Sopel lodu
5

Dostępny jest nowy moduł drupal, Hook Post Action , który dodaje haczyki zapisu postu. Spróbujmy, czy to działa.

Druvision
źródło