0

コンテンツが削除される直前にコードを実行しようとしています。Rules モジュールには次のイベントがあります。

  • 既存のコンテンツを更新した後
  • コンテンツを保存する前に
  • 新しいコンテンツを保存した後
  • コンテンツ削除後

ただし、これらのどれも適切なタイミングでコードを実行しません。

削除前にコードを実行するためのフックを提供するPredeleteという単純なモジュールを発見しました。これは、ルール イベントを呼び出す優れた候補のように思えました。

そこで、Predelete に含まれる「predelete_field」サンプル モジュールに基づいて、非常に単純なモジュールを作成しました。フォルダーは「predelete_field」と呼ばれ、「modules」フォルダーにあり、次のファイルが含まれています。

1: predelete_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: predelete_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: predelete_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関数は起動していないようです。

私が犯した可能性のあるエラーを見つけたり、解決策を提供したりできる人はいますか?

4

1 に答える 1

0

Predelete モジュールは、複数のノードの削除の確認フォームにフックしているように見えます。ルールはフォームを呼び出さず、代わりにノード API を使用するため、ルールを使用して起動されることはありません。

ただし、node_delete_multiple()関数を見ると、コンテンツが実際にデータベースから削除される前に、いくつかのフックが呼び出されていることがわかります (つまりhook_node_delete、 とhook_entity_delete)。これらの 1 つは、次のように、カスタム モジュールに実装するフックです。

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 のキャッシュを再度クリアする必要がありますが、ドキュメントによると動作するはずです。

于 2011-12-12T22:55:59.487 に答える