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_submit
jest wywoływany, nid jeszcze nie istnieje. hook_node_insert
ma 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?
hook_node_insert
ihook_node_update
(działa przy każdym zapisywaniu węzła).hook_node_submit
ale niehook_node_update
?hook_node_insert
jak również whook_node_update
.hook_node_insert()
ihook_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 haczykOdpowiedzi:
Patrząc na komentarze do pytania, wygląda na to, że oczywistym rozwiązaniem jest użycie haczyków
hook_node_insert()
ihook_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.
źródło
hook_form_alter()
. drupal.stackexchange.com/a/221041/15055Prawidł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.
AKTUALIZACJA: Możesz również znaleźć łatwiejszą alternatywę tutaj /programming//a/24035797/1726778
źródło
drupal_register_shutdown_function()
. Ale pamiętaj, że oba wydają się mieć problemy w środowisku php-fpm, patrz drupal.stackexchange.com/q/102603/10667og_is_group
. Myślę, że z tego powodu dostawałem fałszywe negatywy.Dostępny jest nowy moduł drupal, Hook Post Action , który dodaje haczyki zapisu postu. Spróbujmy, czy to działa.
źródło