Какой хук я могу использовать для действий после сохранения?


16

Я нашел несколько сообщений с тем же вопросом, но ответы всегда расходятся с какой-то другой темой, или они не работают для моих нужд.

После сохранения узла я хочу, чтобы мой пользовательский модуль вставил строку в одну из моих пользовательских таблиц, которая содержит nid нового узла. Когда hook_node_submitвызывается, nid еще не существует. hook_node_insertимеет nid, но вызывается только при первом сохранении узла, но мне потенциально нужно предпринимать действия при каждом сохранении узла.

Мой план состоит в том, чтобы разделить мою функциональность на собственный метод и реализовать обе ловушки, но я пытаюсь научиться правильно работать с Drupal, и поэтому мне интересно, есть ли ловушка, которая действительно соответствует моим требованиям.

Есть ли ловушка, которая вызывается каждый раз, когда узел сохраняется и называется ПОСЛЕ завершения сохранения?


3
Вы можете использовать комбинацию hook_node_insertи hook_node_update(действует каждый раз при сохранении узла).
AjitS

Да, я описал это в посте выше.
Кенни Уайлэнд

@KennyWyland вы упомянули, hook_node_submitно нет hook_node_update?
Дэвид Томас

Вы получите как nid, hook_node_insertтак и in hook_node_update.
Сумит Мадан

2
hook_node_insert()и hook_node_update()являются правильными хуками для этого, hook_node_submit()вызывается во время процесса отправки формы перед сохранением узла. Не забывайте, что вам нужно очищать кэши каждый раз, когда вы добавляете / удаляете хук
Клайв

Ответы:


5

Глядя на комментарии к вопросу, кажется, что очевидным решением является использование хуков hook_node_insert()и hook_node_update().

На самом деле я просто сделал нечто очень похожее, как описано в ответе: я написал функцию, которая делает то, что я хочу, каждый раз, когда создается / обновляется узел, и затем вызываю его из каждого из этих хуков. Работает просто отлично.


Это классно! Вы могли бы даже сделать это из hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannx Недостатком этого метода является то, что он будет вызываться только тогда, когда узел вставляется / обновляется с помощью определенной формы. В моем случае мне нужно было отловить все дополнения и модификации узлов.
пончик

12

Правильный способ сделать это состоит в том, чтобы уважать транзакцию БД Drupal. Если вы хотите выполнить какое-либо действие с базой данных в hook_node_insert, вы должны учитывать, что узел на самом деле еще не сохранен. это означает, что если это не удается и выполняется откат, в результате вы получите потерянные данные в вашей базе данных. Поэтому следует использовать API базы данных Drupal, а не прямое выполнение запросов.

Если вы хотите обновить сам узел в hook_node_insert, вы не можете этого сделать, потому что невозможно использовать node_save, поскольку узел еще не сохранен в базе данных, и вызов его вызывает исключение. Одним из решений является использование функции register_shutdown_function и передачи nid, вы можете использовать node_load, чтобы убедиться, что оно действительно сохранено, а затем выполнить любое другое действие, которое вы можете захотеть на новом узле.

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

ОБНОВЛЕНИЕ: Вы также можете найти более простую альтернативу здесь /programming//a/24035797/1726778


1
Хорошая идея. Хотя лучше использовать drupal_register_shutdown_function(). Но учтите, что у них обоих, похоже, есть проблемы в среде php-fpm, см. Drupal.stackexchange.com/q/102603/10667
Шевчук,

У меня были проблемы с проверкой, действовал ли узел как Органическая Группа og_is_group. Я думаю, что я получил ложные негативы по этой причине.
icicleking

5

Есть новый модуль drupal, Hook Post Action , который добавляет хуки для пост-сохранения. Давайте попробуем это, чтобы видеть, работает ли это.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.