web-dev-qa-db-ja.com

分類基準に基づいてノード作成時にユーザーにメールを送信する

ユーザーとノードの両方で参照される2つの分類語彙(町とトピック)があります。ノードが作成されたら、ノードが直接(ユーザー参照フィールドを使用して)ユーザーに割り当てられている場合を除き、ノードで参照されている用語を参照しているすべてのユーザーにメールを送信する必要があります。

Subscriptions モジュールは、特定の用語を使用してすべての新しいノードをユーザーに通知するのに最適ですが、他のフィールド(私の場合はユーザーリファレンス)に基づいてノードを除外する方法を見つけることができません。

Rules を使用して、ユーザー参照なしで新しいノードが作成されたときに電子メールを送信できますが、受信者を「参照されている用語を使用するすべてのユーザー」として定義する方法がわかりません。新しいノード」。 [〜#〜] vbo [〜#〜] が答えかもしれませんが、ルールからビューを生成する方法がわかりません。

助言がありますか?ありがとう。

2
Steven Dunwoody

実際には、「プロパティによるエンティティのフェッチ」アクションを使用して、フィールド値に基づいてすべてのユーザー(または任意のエンティティ)をプルアップできます。

ユーザー(およびノー​​ド、コメントなど)はすべてエンティティであるため、このアクションを使用して、フィールドに特定の値を持つユーザーのリストをプルアップできます。

あなたのルールでは、それはノードの更新時に起動されます、単に

  • 'Fetch entity by property'アクションを追加し、
  • エンティティタイプとして「ser」を選択し、
  • 最後の画面で、確認するフィールド(この場合は用語参照)と、確認する特定の値を選択します。
  • 取得するエンティティの名前は自由に変更してください。デフォルトでは、それらはfetched_entityと呼ばれます。

次に、このフェッチの後にアクションセットにループを追加して、見つかった各エンティティを調べます。このループでは、2番目のフィールドをチェックし、必要なフィールドを除外します。私が理解していることから、編集したノードのユーザー参照フィールドに一致するidを持つものを除外する必要があります。

だからここに方法があります:

これで、ルールのアクションセットは次のようになります。分類プロパティでユーザーをフェッチし、見つかったすべてのエントリをループします(デフォルトで10に制限されているため、必要な数だけプルしていることを確認してください)。ところで)。

enter image description here

次に、ルールにコンポーネントを追加します。コンポーネントは、アクション領域で実行するまったく新しいルールが必要な場合に使用されます。ユーザーをループしているので、呼び出す新しいルールが必要です(ユーザーにフィールドxがない場合は、yを実行してください)。ただし、アクション領域にいるときは、条件を呼び出すことはできません。そのため、それ自体がルールであるコンポーネントを作成し、ここから呼び出します。

  • Admin/config/workflow/rules/componentsまたは設定->ワークフロー->ルール->コンポーネントに移動します
  • 新しいコンポーネントを追加」をクリックします
  • コンポーネントプラグインに "Rule"を選択します。これを単なる条件テストやアクションにしたくないので、条件とアクションの両方を含めたいです!
  • 「参照されていないユーザーにメールを送信する」などの名前にします
  • 2つのパラメーターを渡します。ユーザーのuidとノードのユーザー参照フィールドを比較するため、現在ループしているユーザーと変更された(ルールをトリガーした)ノードを渡す必要があります。

enter image description here

  • 'データ比較'条件であるコンポーネントに条件を追加し、looped_user:uid(またはその着信パラメーターと呼ばれるもの)を、updated_node(またはそれと呼ばれるもの)のユーザー参照フィールドと比較します。入力パラメータ)
  • ここで注意してください。条件の下にある「否定」チェックボックスを必ずオンにしてください。 2つのフィールドが一致しないユーザー、つまり参照されていないユーザーのみを通過させます。

enter image description here -コンポーネントのアクションとして、システムに必要なメールを送信させる

出来上がり!ほぼ完了しました。このコンポーネントは、ループされたユーザーを(正しい用語で)参照されていないユーザーに絞り込み、電子メールで送信します。残すべきことの1つは、このコンポーネントをユーザーループで呼び出すことです。

元のルールに戻り、「アクションの追加」をクリックしますループへ(その下ではなく、その上) enter image description here

アクションのリストの一番下に、作成したコンポーネントの名前が表示されます。新しいコンポーネントがそこにあるはずです。それを選択し、更新されたノードと 'fetched_entity'(現在ループしているユーザー)を2つのパラメーターとして渡します。

テスト!

お役に立てれば。

7

カスタムモジュールで、独自のカスタムルールアクションを作成するには、hook_rules_action_info()を使用します。 http://drupalcontrib.org/api/drupal/contributions!rules!rules.api.php/function/hook_rules_action_info/7

このアクションにより、電子メールアドレスのリストが提供されます。次に、ルールでこのリストをループして、それぞれにメッセージを送信できます。

アクションは次のようになります。

function mymodule_rules_action_info() {
  return array(
    'mymodule_get_user_emails' => array(
      'label' => t('Get user emails'),
      'parameter' => array(
        'term' => array(
          'label' => t('Term'),
          'type' => 'taxonomy_term',
        ),
      ),
      'provides' => array(
        'emails' => array(
          'label' => t('List of Emails'),
          'type' => 'list<text>',
        )
      ),
      'group' => t('My Module'),
    ),
  );
}

function mymodule_get_user_emails($term) {
  // Do stuff here to get your list of emails based on the term.
  // $emails would be an array.
  return array('emails' => $emails);
}
0
jazzdrive3