После сохранения обратного вызова?
Как выполнить функцию каждый раз, когда обновляется узел? Я пытался использовать hook_nodeapi, но похоже, что ловушка удалена из Drupal 7.
Что я хочу сделать, это
- добавьте новое поле к моему типу контента под названием "основное изображение (bool)", чтобы администратор мог установить основное изображение.
- Я собираюсь использовать модуль Views для отображения узлов, но упорядочить узлы по полю "основного изображения" и дате добавления.
- так что первый узел всегда является основным изображением.
чтобы сделать это, мне нужно убедиться, что всегда есть только один узел с 'main image' установленным в true.
4 ответа
Хук не был удален, но разделен на отдельные хуки для каждого $op.
Смотрите: http://api.drupal.org/api/search/7/hook_node
Для пост-сохранения вы хотите hook_node_insert() и hook_node_update()
В настоящее время ядро Drupal не предлагает никаких хуков для выполнения действий после того, как узел / сущность вставлен / обновлен / удален в базе данных. Например, вы не можете отправить электронное письмо с указанием узла после того, как узел вставлен, потому что Drupal использует транзакции SQL, и узел еще не полностью записан в базу данных, когда вызывается предварительное сохранение ловушечного узла, поэтому, если по какой-либо причине откат транзакции выполняется, пользователи получит ложное письмо.
Итак, модуль Hook Post Action представляет несколько новых хуков Drupal для преодоления этого ограничения:
- hook_entity_postsave
- hook_entity_postinsert
- hook_entity_postupdate
- hook_entity_postdelete
- hook_node_postsave
- hook_node_postinsert
- hook_node_postupdate
- hook_node_postdelete
Я полагаю hook_entity_presave
может быть тем крючком, который вы ищете, если вы хотите действовать до обновления вашего узла:
Действуйте на объект, прежде чем он собирается быть создан или обновлен.
Или, если вы предпочитаете играть после обновления, посмотрите на hook_entity_update
:
Действуй на сущности при обновлении.
Просто чтобы завершить это немного больше, и если вам нужно выполнить какую-либо операцию после того, как узел был сохранен / обновлен, вы можете использовать модуль @ sina-salek, рекомендованный вами, или вы можете использовать этот код:
// Same for hook_node_save!
function my_module_node_update($node) {
if ($node->type == 'content_type_name') {
// Invoke your callback function AFTER the node is updated.
drupal_register_shutdown_function('_my_module_the_function_to_call', $node);
}
}
function _my_module_the_function_to_call($node) {
// do stuff...
}
Используя функцию drupal_register_shutdown_function, вы обязательно вызываете свою пользовательскую функцию, когда перехват завершен, а узел сохранен в БД.
Другой способ добиться этого - расширить сущность Node с помощью настраиваемого класса и вызвать код внутри Node::postSave
метод. Этот метод будет вызываться при сохранении или обновлении узла.
Вы указываете свой собственный расширенный класс, реализуя хук, называемый hook_entity_type_build
и укажите свой новый класс, например: $entity_types['node']->setClass(NodeExtended::class)
Внутри вашего класса вы переопределяете postSave
метод. Обычно я просто отправляю сюда свое собственное событие, чтобы другие модули могли подписаться на это событие сохранения публикации узла, но это уже другая тема.