После сохранения обратного вызова? - PullRequest
10 голосов
/ 15 марта 2011

Как выполнить функцию каждый раз, когда обновляется узел?Я пытался использовать hook_nodeapi, но похоже, что ловушка удалена из Drupal 7.

Что я хочу сделать, это

  1. добавить новое поле в мой тип контента под названием'main image (bool)', чтобы позволить администратору установить основное изображение.
  2. Я собираюсь использовать модуль Views для отображения узлов, но упорядочить узлы по полю 'main image' и дате добавления.
  3. так, чтобы первый узел всегда был основным изображением.

, чтобы сделать это, мне нужно убедиться, что всегда есть только один узел с 'main image', установленным в true.

Ответы [ 4 ]

13 голосов
/ 04 июня 2014

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

Итак Модуль действий Hook Post представляет несколько новых хуков Drupal для преодоления этого ограничения:

8 голосов
/ 15 марта 2011

Хук не был удален, но разделен на отдельные хуки для каждого $ op.

См .: http://api.drupal.org/api/search/7/hook_node

Для пост-сохранения вы хотите hook_node_insert () и hook_node_update ()

7 голосов
/ 15 марта 2011

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

действовать на субъекта до того, как он собирается быть создан или обновлен.


Или, если вы предпочитаете играть после обновления, посмотрите на hook_entity_update:

Действовать в отношении сущностей при обновлении.

3 голосов
/ 04 сентября 2017

Просто чтобы завершить это немного больше, и если вам нужно выполнить какую-либо операцию после того, как узел был сохранен / обновлен, вы можете использовать модуль @ 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 , вы обязательно вызываете свою пользовательскую функцию, когда перехват завершен и узел сохранен в БД.

...