Ответ 1
Крюк не удаляется, а разбивается на отдельные крючки для каждого $op.
Смотрите: http://api.drupal.org/api/search/7/hook_node
Для пост-сохранения вы хотите hook_node_insert() и hook_node_update()
Как выполнять функцию каждый раз, когда обновляется node? Я попытался использовать hook_nodeapi, но похоже, что хук удален из Drupal 7.
Что я хочу сделать,
Чтобы сделать это, мне нужно убедиться, что всегда есть только один node с 'основным изображением', установленным в true.
Крюк не удаляется, а разбивается на отдельные крючки для каждого $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_presave
может быть вашим крюком, если вы хотите действовать до обновлен ваш node:
Действовать над сущностью, прежде чем быть создан или обновлен.
Или, если вы предпочитаете действовать после его обновления, посмотрите hook_entity_update
:
Активировать объекты при обновлении.
Просто для завершения этого немного больше, и если вам нужно выполнить любую операцию после сохранения/обновления 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 сохранялся в БД.
Другим способом достижения этого является расширение сущности Node с помощью пользовательского класса и вызов вашего кода внутри метода Node::postSave
. Этот метод будет вызван, когда узел будет сохранен или обновлен.
Вы определяете свой пользовательский расширенный класс, реализуя ловушку под названием hook_entity_type_build
и предоставляете свой новый класс, например: $entity_types['node']->setClass(NodeExtended::class)
Внутри вашего класса вы переопределяете метод postSave
. Я обычно просто отправляю свое пользовательское событие здесь, чтобы другие модули могли подписаться на это событие после сохранения узла, но это другая тема.