Який гачок можна використовувати для дій після збереження?


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як в, так і в hook_node_update.
Суміт Мадан

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

Відповіді:


5

Дивлячись на коментарі до питання, схоже, очевидним рішенням є використання гачків hook_node_insert()і hook_node_update().

Я фактично просто зробив щось дуже схоже, як описано у відповіді: я написав функцію, яка робить те, що я хочу робити щоразу, коли вузол створюється / оновлюється, а потім викликаю його з кожного з цих гаків. Це працює просто чудово.


Круто! Ви навіть могли це зробити з hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannx Недоліком цього методу є те, що він буде викликаний лише тоді, коли вузол вставляється / оновлюється через певну форму. У моєму випадку мені потрібно було зловити всі доповнення та модифікації вузлів.
пончик

12

Правильний спосіб зробити це - поважати db-транзакції Drupal. Якщо ви хочете виконати будь-яку дію з базою даних у moll_node_insert, ви повинні врахувати, що вузол насправді ще не збережений. Це означає, що якщо вона не вдасться відмовитись, ви в кінцевому підсумку отримаєте осиротілі дані у своїй базі даних. Тож слід використовувати API баз даних Drupal, а не пряме виконання запитів.

Якщо ви хочете оновити сам вузол у moll_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. Я думаю, що я отримував помилкові негативи з цієї причини.
льодяник

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.