Создание нового события в модуле - PullRequest
0 голосов
/ 12 декабря 2011

Я пытаюсь выполнить некоторый код прямо перед удалением контента. Модуль правил имеет события для

  • После обновления существующего контента
  • Перед сохранением содержимого
  • После сохранения нового контента
  • После удаления контента

Однако ни один из них не выполняет мой код в нужное время.

Я обнаружил простой модуль под названием Predelete , который предоставляет ловушки для выполнения кода перед удалением. Это выглядело как превосходный кандидат для вызова правила с.

Итак, я создал очень простой модуль, основанный на примере модуля "preletelete_field", который содержится в Predelete. Папка с именем «поле предварительного просмотра» находится в папке «модули» и содержит следующие файлы:

1: priorlete_field.info

   core = "7.x"
   dependencies[] = "rules"
   dependencies[] = "list"
   dependencies[] = "predelete"
   description = "Example for the predelete module with a content type and a node"
   name = "Predelete Field"
   package = Other
   project = "predelete_field"
   version = "7.x-1.0"

   ; Information added by drupal.org packaging script on 2011-07-11
   version = "7.x-1.1"
   core = "7.x"
   project = "predelete"
   datestamp = "1310360219"

2: priorlete_field.module

<?php

/**
 * Implements hook_predelete_node().
 */
function predelete_field_predelete_node($node) {

  drupal_set_message( "PREDELETE HOOK CALLED", 'warning' );

  rules_invoke_event('predelete_field', $node);

  $deletable = TRUE;
  $reason = t('Deletable by default.');

  return array('result' => $deletable, 'reason' => $reason);
}

3: priorlete_field.rules.inc

<?php

/**
 * Implements hook_rules_event_info() on behalf of the predelete_field module.
 */
function rules_predelete_field_event_info() {
  $items = array(
    'predelete_field_predelete' => array(
      'label' => t('Before deleting content'),
      'group' => t('Node'),
    ),
  );

  return $items;
}

К сожалению, это не похоже на работу: событие не отображается в списке событий, даже после очистки кэша и отключения и повторного включения модуля. Аналогично, функция drupal_set_message не срабатывает.

Может ли кто-нибудь обнаружить какие-либо ошибки, которые я мог совершить, или предложить решение?

1 Ответ

0 голосов
/ 13 декабря 2011

Кажется, что модуль Predelete просто подключается к форме подтверждения удаления нескольких узлов, он никогда не будет запущен с использованием правил, так как правила не вызывают форму, а вместо этого используют API узла.

Если вы посмотрите на node_delete_multiple() функцию , вы увидите, что несколько ловушек вызываются до того, как какой-либо контент будет фактически удален из базы данных (а именно hook_node_delete и hook_entity_delete). Одним из них является хук, который вы хотите реализовать в своем пользовательском модуле, например:

function mymodule_node_delete($node) {
  // Perform some action based on values in $the node object.
  // Nothing has been deleted from the database at this point.
}

Вам нужно будет снова очистить кеш Drupal, когда вы добавите этот хук, но согласно документации он должен работать.

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