私のDrupal Webサイトの認証済みユーザーは、プロファイルに「エントリー日」があります(=ユーザーが登録した日付)。ユーザーが登録されたときに私(管理者)に通知を送信したい私のWebサイトでは、5年、10年、または15年以上経過しているため、たとえばユーザーが登録期間の5年を超えるたびに、1か月前に電子メール通知が届きます。
どうすればこれを達成できますか?
以下の手順で説明するように、_ Rules モジュールをRules Scheduler
(そのサブモジュール)とともに使用します。これらの手順は、ユーザープロファイルに追加された日付フィールドに基づいているため、ユーザーごとに適切な日付を指定できます。
すでに持っている「エントリー日」フィールドと同様に、マシン名(たとえば)field_next_reminder
を使用して、「ユーザー」エンティティに別のフィールドを追加します。 (「次の」リマインダーの日付を保存するために)1つの日付のみを許可します。これを必須にしたい理由はありません(この回答の文脈では関係ありません)。そして、初期値を「エントリー日から5年」に設定します。その「エントリー日」に対してすでに行っているのと同じ手順を使用します。
作成するルール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。
作成するRuleを Rules エクスポート形式で示します(コピーして貼り付けて、独自の環境にインポートするだけで、これは、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つだけトリガーされ、最新の日付でトリガーされます)。
上記のもので、あなたは5年後にそのようなリマインダー電子メールを受け取るべきです。しかし、5年後(または10年後)(10年後または15年後)にそれを実行することも必要です。
おそらくそれを行う最も簡単な方法は、何らかのメカニズムを用意して、実際に何らかのアクションを実行したときに(リマインダーを処理するために)、field_next_reminder
にさらに5年を追加することです。そうすることで、上記の魔法は(同じルールで)再びトリガーされます。
このような更新は手動で適用できます(ただし、忘れないでください)。または(私の好み) Flag モジュールを使用して、指定された(グローバル)フラグを実装してユーザーにフラグを付けることができます。そして、これをこれらの仕様を持つ追加のカスタムルールと組み合わせます。
ルールアクション:
field_next_reminder
を更新して(「データ値の設定」を使用)、次のリマインダー用にさらに5年追加します。確かに、これはそれを実装するためのマイナーな追加作業になります(最大で5分、たとえば最大で15分かかる場合があります...)。しかし、そうすることのROIは、許可されたユーザーがそれらの1歳のタイプのユーザーにフラグを立てるだけでよいということです(彼らが魔法を起こさせるために関連するハイパーリンクを含めることさえできる...さらに良い:このフラグ機能を使用して、ナギングyourselfを開始して、そのユーザーにフラグを付けることを忘れないでください...(ロジック:リマインダーの日付が30日未満である、ユーザーにはまだフラグが付けられていません)。
上記のルールのdate_offset(= 2592000)は「30日前」に対応し、レビュー/チューニングが必要な場合があります(約1か月ですよね?)。
Field Permissions モジュールを使用して、エンティティのフィールドを編集、表示、作成するためのフィールドレベルの権限を設定することもできます。あなたの場合、多分あなたは管理者にそのリマインダーフィールドを編集してもらいたいだけかもしれません。
5年は長い時間です...残りの宿題:ユーザーアカウントが削除された場合はどうなりますか?.
(Rulesコンポーネントのように)単に電子メールを送信する代わりに、 Message モジュール(Rulesモジュールとの統合も優れています)を使用するより高度なオプションに置き換えることができます。以下は、そのモジュールに関する引用です(そのプロジェクトページから)。
...さまざまなユースケースでシステムイベントのログ記録と表示を有効にします。時間の経過とともに記録されるイベントは、コールアクティビティストリームになる場合があります。カスタムフィールドと表示(ビュー)モードを使用して、さまざまなユースケース用にエクスポート可能なメッセージサブタイプを作成できます。
上記のソリューションを導入すると、(a)作成される将来のすべての新しいユーザーアカウント、および(b)そのfield_next_reminder
フィールドに日付が(手動で)入力されたすべての既存のアカウントのソリューションが得られます。ただし、前述の既存の「入力日」を利用して、適切な一括更新(一括)操作を(一度だけ)実行することにより、既存のユーザーアカウントに同様のプロセスを導入することもできます。それをどのように機能させるかについて疑問がある場合は、 このリンク を使用してください。
注: ユーザー登録のX日後にルールを使用して電子メールを送信する には、役立ついくつかの詳細も含まれています。
Rules と Scheduler モジュールの両方を使用して目標を達成できます。
チェック ルールを使用して、ユーザーが登録してからx日後にメールを送信します 。
カスタムコーディングを探している場合は、「 cron時に実行するタスクを作成してメールを送信する方法に関する質問への回答で説明されているように、hook_cron
を実装できます。ユーザー? 」。
あなたを助けるかもしれない他のいくつかのリンク: