Выполнение действий после сохранения ноды – обход стандартных ограничений

Поговорим о ситуациях, когда hook_node_inserthook_node_update гибки не на столько хорошо, и нужны альтернативные способы выполнения кода после полного завершения транзакций или даже после отправки ответа браузеру.

Проблема

Стандартные хуки hook_node_insert / hook_node_update вызываются внутри той же транзакции, что и само сохранение узла. Это значит:

  • Если внутри этих хуков вы сохраняете другую сущность (например, комментарий, термин таксономии, пользователя), изменения могут быть ещё не зафиксированы до окончания всего вызова node_save().
  • Другие модули, реализующие hook_entity_update() для этих сущностей, могут не увидеть обновлённый узел (например, если они пытаются прочитать его свежие данные через node_load() внутри своей логики).
  • В случае отката транзакции (исключения) весь код из хуков тоже будет откачен.

Решения

Использовать hook_node_update_index()

Этот хук вызывается не сразу после сохранения, а во время работы cron при индексации узла поисковой системой. Он идеально подходит для фоновых задач, которые:

  • не требуют мгновенного выполнения;
  • должны видеть полностью сохранённый узел (включая поля и связанные данные).

Зарегистрировать shutdown‑функцию

Эта функция выполняется после того, как PHP завершил обработку запроса (но до того, как соединение с БД окончательно закроется). Она гарантирует, что:

  • транзакция уже зафиксирована;
  • можно безопасно отправлять почту, писать в лог, вызывать внешние API без риска нарушить сохранение узла.

Есть нюанс в том, что shutdown‑функция не должна полагаться на состояние глобальных переменных, которые могли быть уничтожены. Лучше передавать явные примитивы (nid, uid, timestamp).

Использовать очередь (Queue API) для отложенной обработки

Самый надёжный способ для тяжёлых или долгих задач – поместить их в очередь:

Затем в крон‑обработчике:

Изменить порядок вызова хуков

Если вам нужно, чтобы ваш модуль реагировал на сохранение после того, как это сделали другие модули, можно изменить приоритет:

Это не решает проблему транзакций, а только влияет на последовательность вызова модулей.

Мало букафф? Читайте есчо !

Получить имя текущей темы по дефолту в Drupal

Январь 21, 2019 г.

Theme API к сожалению не даёт прямого метода, чтобы прочитать это значение. Как его получить? Иногда программно нужно установить, что именно видит пользователь на фронт-енд (какую тему использует движок). Необходимость возникает из-за того, ...

Читать

Вывод сообщений валидации формы рядом с формой

Март 20, 2019 г.

При возникновении ошибок, во время проверки формы друпал выполняет две вещи, которые отражаются на фронт-энд - добавляет сообщение об ошибке в стек сообщений и маркирует классом error поле, содержащее ошибку. Если форма находится далеко от места вывода ...

Читать

Error: Class 'Aws\S3\StreamWrapper' not found (Drupal 7)

Август 29, 2022 г.

При обновлении модуля s3fs с ветки 7.x-2.x -> 7.x->3.x друпалу не удаётся найти указанный класс. Все необходимые шаги по апгрейду сделаны, как описано в readme.txt модуля. Это проблема инициализации библиотеки awssdk в s3fs_libraries_info(). Drupal ...

Читать

Ctools modal закрытие при клике вне модального окна

Июнь 28, 2019 г.

Привычное для пользователей поведение модального окна изначально не реализовано в ctools. Давайте добавим немного js, реализующего нужный функционал. Код универсален для модального окна создаваемого ctools, т.к. привязан к верстке окна: [crayon-6a104b5698dac129572392/] ...

Читать
 

Комментарии к «Выполнение действий после сохранения ноды – обход стандартных ограничений»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: