web-dev-qa-db-ja.com

ユーザーの入力フィールドの日付に基づいて電子メール通知リマインダーを送信する方法は?

私のDrupal Webサイトの認証済みユーザーは、プロファイルに「エントリー日」があります(=ユーザーが登録した日付)。ユーザーが登録されたときに私(管理者)に通知を送信したい私のWebサイトでは、5年、10年、または15年以上経過しているため、たとえばユーザーが登録期間の5年を超えるたびに、1か月前に電子メール通知が届きます。

どうすればこれを達成できますか?

1
Vasmir

以下の手順で説明するように、_ Rules モジュールをRules Scheduler(そのサブモジュール)とともに使用します。これらの手順は、ユーザープロファイルに追加された日付フィールドに基づいているため、ユーザーごとに適切な日付を指定できます。

ステップ1:リマインダーの日付を保存するフィールドを作成する

すでに持っている「エントリー日」フィールドと同様に、マシン名(たとえば)field_next_reminderを使用して、「ユーザー」エンティティに別のフィールドを追加します。 (「次の」リマインダーの日付を保存するために)1つの日付のみを許可します。これを必須にしたい理由はありません(この回答の文脈では関係ありません)。そして、初期値を「エントリー日から5年」に設定します。その「エントリー日」に対してすでに行っているのと同じ手順を使用します。

ステップ2:ルール「コンポーネント」を作成する

作成するルールComponentは次のとおりです(ルールエクスポート形式で、コピーと貼り付けを使用して独自の環境にインポートするだけです。これは、 「admin/config/workflow/rules」にある「ルールのインポート」リンク:

{ "rules_send_email_notification" : {
    "LABEL" : "Send eMail notification",
    "PLUGIN" : "action set",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : { "user_to_be_reminded" : { "label" : "User to be reminded", "type" : "user" } },
    "ACTION SET" : [
      { "mail" : {
          "to" : "[site:mail]" ,
          "subject" : "Time flies ...",
          "message" : "This is a reminder about another 5th anniversary for user with eMail id [user-to-be-reminded:mail] on [user-to-be-reminded:field_next_reminder] ...",
          "language" : [ "" ]
        }
      }
    ]
  }
}

明らかに、Subjectおよびメールの内容はレビュー/チューニングが必要な場合がありますが、他のを使用することもできますTo電子メールID。

ステップ3:ルールコンポーネントを使用して「ルール」を作成する

作成するRuleRules エクスポート形式で示します(コピーして貼り付けて、独自の環境にインポートするだけで、これは、admin/config/workflow/rules)にある[ルールのインポート]リンクを使用して実行できます。

{ "rules_on_new_user_registration" : {
    "LABEL" : "On new user registration",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "rules_scheduler" ],
    "ON" : { "user_insert" : [], "user_update" : [] },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "account" ], "field" : "field_next_reminder" } }
    ],
    "DO" : [
      { "schedule_delete" : {
          "component" : "rules_send_email_notification",
          "task" : "[account:name]"
        }
      },
      { "schedule" : {
          "component" : "rules_send_email_notification",
          "date" : {
            "select" : "account:field-next-reminder",
            "date_offset" : { "value" : 2592000 }
          },
          "identifier" : "[account:name]",
          "param_user_to_be_reminded" : [ "account" ]
        }
      }
    ]
  }
}

上記のルールは、前のステップのRules Componentを参照していることに注意してください。

このルールのマシン名field_next_reminderにも注意してください。これは、ステップ1で作成したフィールドのマシン名です(ステップ1で別のマシン名を使用した場合は、このルールのマシン名field_next_reminderも置き換えてください)手順1で作成したフィールドのマシン名を使用します(そのようなフィールドがない場合、またはフィールド名が一致しない場合、このルールのインポートは機能しない可能性があります)。

このルールのschedule_deleteの部分により、データフィールドを更新するときに、以前に「スケジュールされた」リマインダーが確実に削除されます(これにより、リマインダーが1つだけトリガーされ、最新の日付でトリガーされます)。

手順4:リマインダーの日付にさらに5年追加する

上記のもので、あなたは5年後にそのようなリマインダー電子メールを受け取るべきです。しかし、5年後(または10年後)(10年後または15年後)にそれを実行することも必要です。

おそらくそれを行う最も簡単な方法は、何らかのメカニズムを用意して、実際に何らかのアクションを実行したときに(リマインダーを処理するために)、field_next_reminderにさらに5年を追加することです。そうすることで、上記の魔法は(同じルールで)再びトリガーされます。

このような更新は手動で適用できます(ただし、忘れないでください)。または(私の好み) Flag モジュールを使用して、指定された(グローバル)フラグを実装してユーザーにフラグを付けることができます。そして、これをこれらの仕様を持つ追加のカスタムルールと組み合わせます。

  • ルールイベント:ユーザーは(指定されたフラグで)フラグを立てられます。
  • ルールアクション:

    • 実際にお祝いしたいこと(またはそのようなことは何ですか?)を実行して、そのユーザーに送信します。たとえば、適切な電子メールの送信、ユーザーポイントの付与、特別なユーザーバッジの付与(yearling?)。
    • field_next_reminderを更新して(「データ値の設定」を使用)、次のリマインダー用にさらに5年追加します。

確かに、これはそれを実装するためのマイナーな追加作業になります(最大で5分、たとえば最大で15分かかる場合があります...)。しかし、そうすることのROIは、許可されたユーザーがそれらの1歳のタイプのユーザーにフラグを立てるだけでよいということです(彼らが魔法を起こさせるために関連するハイパーリンクを含めることさえできる...さらに良い:このフラグ機能を使用して、ナギングyourselfを開始して、そのユーザーにフラグを付けることを忘れないでください...(ロジック:リマインダーの日付が30日未満である、ユーザーにはまだフラグが付けられていません)。

ステップ5:さらなるチューニングと拡張

  • 上記のルールのdate_offset(= 2592000)は「30日前」に対応し、レビュー/チューニングが必要な場合があります(約1か月ですよね?)。

  • Field Permissions モジュールを使用して、エンティティのフィールドを編集、表示、作成するためのフィールドレベルの権限を設定することもできます。あなたの場合、多分あなたは管理者にそのリマインダーフィールドを編集してもらいたいだけかもしれません。

  • 5年は長い時間です...残りの宿題:ユーザーアカウントが削除された場合はどうなりますか?.

  • (Rulesコンポーネントのように)単に電子メールを送信する代わりに、 Message モジュール(Rulesモジュールとの統合も優れています)を使用するより高度なオプションに置き換えることができます。以下は、そのモジュールに関する引用です(そのプロジェクトページから)。

    ...さまざまなユースケースでシステムイベントのログ記録と表示を有効にします。時間の経過とともに記録されるイベントは、コールアクティビティストリームになる場合があります。カスタムフィールドと表示(ビュー)モードを使用して、さまざまなユースケース用にエクスポート可能なメッセージサブタイプを作成できます。

ステップ6:ユーザーの搭乗

上記のソリューションを導入すると、(a)作成される将来のすべての新しいユーザーアカウント、および(b)そのfield_next_reminderフィールドに日付が(手動で)入力されたすべての既存のアカウントのソリューションが得られます。ただし、前述の既存の「入力日」を利用して、適切な一括更新(一括)操作を(一度だけ)実行することにより、既存のユーザーアカウントに同様のプロセスを導入することもできます。それをどのように機能させるかについて疑問がある場合は、 このリンク を使用してください。

ユーザー登録のX日後にルールを使用して電子メールを送信する には、役立ついくつかの詳細も含まれています。

4
Pierre.Vriens
3
DRUPWAY