Я нашел несколько сообщений с тем же вопросом, но ответы всегда расходятся с какой-то другой темой, или они не работают для моих нужд.
После сохранения узла я хочу, чтобы мой пользовательский модуль вставил строку в одну из моих пользовательских таблиц, которая содержит nid нового узла. Когда hook_node_submit
вызывается, nid еще не существует. hook_node_insert
имеет nid, но вызывается только при первом сохранении узла, но мне потенциально нужно предпринимать действия при каждом сохранении узла.
Мой план состоит в том, чтобы разделить мою функциональность на собственный метод и реализовать обе ловушки, но я пытаюсь научиться правильно работать с Drupal, и поэтому мне интересно, есть ли ловушка, которая действительно соответствует моим требованиям.
Есть ли ловушка, которая вызывается каждый раз, когда узел сохраняется и называется ПОСЛЕ завершения сохранения?
hook_node_insert
иhook_node_update
(действует каждый раз при сохранении узла).hook_node_submit
но нетhook_node_update
?hook_node_insert
так и inhook_node_update
.hook_node_insert()
иhook_node_update()
являются правильными хуками для этого,hook_node_submit()
вызывается во время процесса отправки формы перед сохранением узла. Не забывайте, что вам нужно очищать кэши каждый раз, когда вы добавляете / удаляете хукОтветы:
Глядя на комментарии к вопросу, кажется, что очевидным решением является использование хуков
hook_node_insert()
иhook_node_update()
.На самом деле я просто сделал нечто очень похожее, как описано в ответе: я написал функцию, которая делает то, что я хочу, каждый раз, когда создается / обновляется узел, и затем вызываю его из каждого из этих хуков. Работает просто отлично.
источник
hook_form_alter()
. drupal.stackexchange.com/a/221041/15055Правильный способ сделать это состоит в том, чтобы уважать транзакцию БД Drupal. Если вы хотите выполнить какое-либо действие с базой данных в hook_node_insert, вы должны учитывать, что узел на самом деле еще не сохранен. это означает, что если это не удается и выполняется откат, в результате вы получите потерянные данные в вашей базе данных. Поэтому следует использовать API базы данных Drupal, а не прямое выполнение запросов.
Если вы хотите обновить сам узел в hook_node_insert, вы не можете этого сделать, потому что невозможно использовать node_save, поскольку узел еще не сохранен в базе данных, и вызов его вызывает исключение. Одним из решений является использование функции register_shutdown_function и передачи nid, вы можете использовать node_load, чтобы убедиться, что оно действительно сохранено, а затем выполнить любое другое действие, которое вы можете захотеть на новом узле.
ОБНОВЛЕНИЕ: Вы также можете найти более простую альтернативу здесь /programming//a/24035797/1726778
источник
drupal_register_shutdown_function()
. Но учтите, что у них обоих, похоже, есть проблемы в среде php-fpm, см. Drupal.stackexchange.com/q/102603/10667og_is_group
. Я думаю, что я получил ложные негативы по этой причине.Есть новый модуль drupal, Hook Post Action , который добавляет хуки для пост-сохранения. Давайте попробуем это, чтобы видеть, работает ли это.
источник