Ответ на вызов после сохранения?

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

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

  • добавьте новое поле в мой тип контента, называемый "основным изображением (bool)", чтобы администратор установил основное изображение.
  • Я собираюсь использовать модуль Views для отображения узлов, но упорядочить узлы по полю "основное изображение" и добавить дату.
  • так что первый node всегда является основным изображением.

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

Ответ 2

В настоящее время ядро 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

https://drupal.org/project/hook_post_action

Ответ 3

Я полагаю, что hook_entity_presave может быть вашим крюком, если вы хотите действовать до обновлен ваш node:

Действовать над сущностью, прежде чем быть создан или обновлен.


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

Активировать объекты при обновлении.

Ответ 4

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

Ответ 5

Другим способом достижения этого является расширение сущности Node с помощью пользовательского класса и вызов вашего кода внутри метода Node::postSave. Этот метод будет вызван, когда узел будет сохранен или обновлен.

Вы определяете свой пользовательский расширенный класс, реализуя ловушку под названием hook_entity_type_build и предоставляете свой новый класс, например: $entity_types['node']->setClass(NodeExtended::class)

Внутри вашего класса вы переопределяете метод postSave. Я обычно просто отправляю свое пользовательское событие здесь, чтобы другие модули могли подписаться на это событие после сохранения узла, но это другая тема.