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

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

15.03.2011 10:00:40 Просмотров 38 Источник

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

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

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

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

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/5308465/post-save-callback#comment5987576_5308465
Вместо добавления Drupal 7 к заголовку вопроса, Вы можете использовать тег drupal-7, что сэкономит вам немного места.
https://stackoverflow.com/questions/5308465/post-save-callback#comment5987648_5308465
@berdir // я сделаю это. Спасибо за предложение
https://stackoverflow.com/questions/5308465/post-save-callback#comment5990216_5308465
Отредактировал пост в соответствии с предложением Бердира. Кстати, сейчас есть сайт Stack Exchange, посвященный Drupal: drupal.stackexchange.com .
https://stackoverflow.com/questions/5308465/post-save-callback#comment5999580_5308465
@marcvangend // спасибо за редактирование и сайт Drupal!

Ответы - Обратный вызов после сохранения? / Post-save callback?

Является ответом!
Berdir

15.03.2011 10:04:05

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

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

После сохранения, вы хотите hook_node_insert() и hook_node_update()

https://stackoverflow.com/questions/5308465/post-save-callback/5308485#comment17262451_5308485
Узел не полностью сохранен в этот момент, потому что транзакция еще не зафиксирована.
https://stackoverflow.com/questions/5308465/post-save-callback/5308485#comment29727920_5308485
Как сказал Джоррит, это неверно, поскольку сделка все еще открыта.
https://stackoverflow.com/questions/5308465/post-save-callback/5308485#comment34862432_5308485
Узел полностью сохраняется с точки зрения выполняемого кода, запросы по БД будут работать как ожидалось и находить данные узла, потому что они будут выполняться внутри транзакции. Это определение "полностью сохранено" соответствует варианту использования OP.
Pascal MARTIN

15.03.2011 10:04:33

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

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


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

Действуйте на объекты при обновлении.

Sina Salek

04.06.2014 03:07:50

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

Таким образом модуль 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

https://stackoverflow.com/questions/5308465/post-save-callback/24035797#comment37319124_24035797
Спасибо - это выглядит полезным. Я хотел восстановить свою карту сайта.xml после добавления, удаления или обновления узлов, поэтому это выглядит идеально для моих нужд. Я установил его, и все, кажется, работает отлично тоже :)
Salvador P.

04.09.2017 05:10:25

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

https://stackoverflow.com/questions/5308465/post-save-callback/46038871#comment92917108_46038871
Это самое маленькое и самое простое решение.
bpile

03.10.2019 01:57:55

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

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

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

Закрыть X