web-dev-qa-db-ja.com

カスタムルールアクションイベント条件を作成する方法

カスタムルールのアクション、イベント、条件を作成するための汎用の数式またはモジュールはありますか?そのため、必要な値を置き換えるだけで、残りのコードは変わりません。検索しましたが、そのようなコードは見つかりませんでした。いくつかは見つかりましたが、それらは特定のニーズ/質問に向けられていました。

たとえば、足りないものがたくさんあります。 メッセージモジュール を使用してアクティビティをログに記録しています。 statuses module および flag 2 を使用しています(フラグ3はstatusesモジュールと互換性がありません)私は以下を実行しようとしています

  1. ログステータスコメント。 「現在ログインしているユーザー」のログのみ。コメントしたユーザーを特定できません。例えばジョンはあなたのステータス更新についてコメントしました。イベントは利用可能ですが、コメントしたユーザーではなく、現在のユーザー名のみが表示されます。
  2. 「ジョンはあなたのステータス更新を気に入りました」のログアクティビティ。イベントはありません。
  3. 同様に、ステータス更新コメントについては、「いいねフラグ」です。
  4. Johnがstackexchangeであなたをフォローし始めました。イベントは利用できますが、誰があなたをフォローしているかを知らせるオプションもありません。また、現在のユーザー名のみが表示されます。明らかにあなたはここであなたの名前を必要としません、あなたは誰があなたをフォローしたか知りたいです。
  5. Johnがstackexchangeであなたに言及しました。ここでも、ジョンの代わりに、ルールを設定するときにオプションがないため、現在のユーザーが表示されます。

シンプルなアクティビティは簡単に作成できます。

5
Umair

カスタムルールのアクション、イベント、条件を作成するための普遍的な数式またはモジュール」(質問どおり)は、カスタムモジュールを作成することです。これを行うには、新しいモジュールを作成するか、既存のカスタムモジュールを拡張します。方法についての優れたチュートリアルについては、 Drupalカスタムルールで独自のイベント条件、アクション、カスタムオブジェクト(+カスタムトークン)を記述する方法 を参照してください。このチュートリアルで詳しく説明されている主な手順は、以下でさらに説明されています(そのリンクから引用された以下のコードが引用されています)。

パート1:イベント、条件、アクションの定義

ルールイベントを定義する

/**
* Implementation of hook_rules_event_info().
* @ingroup rules
*/
function your_module_rules_event_info() {
  return array(
    'your_module_package_bought' => array(
      'label' => t('A package was bought'),
      'module' => 'your_module',
      'arguments' => array(
        'acting_user' => array('type' => 'user', 'label' => t('The user who bought the package.')),
        'package' => array('type' => 'package', 'label' => t('The purchased package.')),
      ),
    ),
  );
}

ルール条件を定義する

/**
 * implementation of hook_rules_condition_info()
 */
function your_module_rules_condition_info() {
  return array(
    'your_module_condition_package_type' => array(
      'label' => t('Type of the package'),
      'arguments' => array(
        'package_id' => array('type' => 'value', 'label' => t('The type of the purchased package.')),
        'package_type' => array('type' => 'string', 'label' => t('The type of the purchased package is')),
      ),
      'module' => 'your_module',
    ),
  );
}

ルールアクションの定義

/**
 * Implementation of hook_rules_action_info().
 */
function packages_rules_action_info() {
  return array(
    'your_module_action_change_order_status' => array(
      'label' => t('Change the order status'),
      'arguments' => array(
        'order' => array('type' => 'value', 'label' => t('The order object.')),
      ),
      'module' => 'your_module',
    ),
  );
}

パート2:カスタムイベント、条件、アクションのコーディング

イベント:

カスタムモジュールのどこかに、次の例のようなものを使用して、イベントをトリガーするロジックを含める必要があります(その中のyour_module_package_boughtに注意してください)。

  //here the code for buying a package will be located
  //when that code returns that a package was bought trigger the rule
  $order = order_load($oid);//$oid will be the id of the order made
  $package = package_load($pid);//pid will be the id of the bought package
  global $user;
  rules_invoke_event('your_module_package_bought', $user, $package, $order);

状態:

ルール条件を評価する(TRUEまたはFALSEかどうかを確認する)ために、提供された引数を使用して関数your_module_condition_package_typeが実行されます。このような関数の例を次に示します。

function your_module_condition_package_type($pid, $type) {
  $package = package_load($pid);
  return ($package->type == $type) ? true : false;
}

アクション:

カスタムモジュールのどこかに、実際のアクションを実行するロジックを含める必要があります。この例では、your_module_action_change_order_statusという名前の関数内で実行する必要があります。

6
Pierre.Vriens