Последний крючок, который будет вызван после сохранения сущности?


Из различных крючков, вызываемых во время процесса сохранения сущности, который вызывается последним?

Есть ли способ инициировать событие после создания сущности, после сохранения всех полей, после обновления кэшей и т.д.? Так что, когда пользователь сохраняет форму обновления, это действие происходит последним перед загрузкой страницы перенаправления?

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

(контекст: У меня проблема, когда создаются кэши полей, из-за чего вновь созданные узлы и другие типы объектов, доступные для заполнения, загружаются так, как будто они пустые и как будто у них нет данных полей - но все попытки до сих пор использовали cache_get и cache_clear_all не находит кэш - он создается в конце процесса. Поэтому я ищу последний возможный крючок, который обязательно его получит)

(Соответствующая информация: hook_entity_postsave не существует, и это одна из тех основных проблем, которые застряли месяцы и месяцы назад)

Author: user56reinstatemonica8, 2012-08-08

3 answers

Различные функции-оболочки (node_save(), user_save(), и т.д.) отвечают за сброс кэша сущностей после вызова метода сохранения на контроллере сущностей.

Если вы возьмете в качестве примера функцию user_save(), этот сброс кэша произойдет после того, как функция вызовет различные крючки сущностей (то же самое касается node_load())

Имея это в виду, я думаю, что тогда возникает вопрос: "Какой последний крючок будет вызван во время сущности спасти"?...и ответ таков hook_entity_update() / hook_entity_insert(). Но они вызываются до сброса кэша (по очевидным причинам).

Метод entity_save() просто вызывает обработчик сохранения для этого конкретного типа сущности и не вызывает никаких собственных крючков, поэтому на самом деле ваши единственные варианты:

  • Создайте свой собственный контроллер сущностей для различных сущностей, которые вам нужно перехватить, изменив метод save() для вызова крючка после очистки кэша.
  • Взломать/исправить существующую сущность контроллеры с тем же кодом.

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

 3
Author: Clive, 2012-08-08 11:18:02

У меня была аналогичная проблема, когда я хотел выполнить представление после сохранения узла. Узел появился в представлении, но в полях были старые данные, несмотря на то, что они были только что сохранены. Последующие вызовы представления имели последние значения полей.

Я вызвал следующее в начале моего hook_node_update, которое, по-видимому, решает проблему (для меня).

/**
 * Implements hook_node_update().
 */
function mymodule_node_update($node) {
  // Clear internal properties.                                           
  unset($node->is_new);                                                   
  unset($node->original);                                                 
  // Clear the static loading cache.                                      
  entity_get_controller('node')->resetCache(array($node->nid));  

  // Rest of my code e.g. execute a view.
}

Эта команда сброса кэша выполняется функцией node_save после вызова всех hook_node_update.

 2
Author: John, 2012-09-23 17:59:21

Да, существует модуль дополнения, который предоставляет хук для вызова после сохранения сущности. Это называется Действие после крючка . На это уже был дан ответ на stackoverflow.com.

 2
Author: Druvision, 2017-05-23 12:41:25