3か月ごとに関数を実行する適切な方法は何ですか?ウォッチドッグ変数は、一定の時間が経過すると利用できないようです。別のテーブルを作成して、実行関数の日付を挿入して比較することもできますが、それが最善の方法ではないようです。
このような関数の機能は次のとおりです。
watchdog()
はストレージに適切な場所ではありません。 _$variables
_パラメータは、変数データの表示をフォーマットするためのものです(例:[〜#〜] username [〜#〜]in "User [〜#〜]ユーザー名[〜#〜]がログインしました ")、アプリケーションデータの長期保存用ではありません。
代わりに、 hook_cron()
と永続変数関数( variable_get()
と variable_set()
)最後に実行された日時を記憶するcronタスクを実行します。
_/**
* Implements hook_cron().
*/
function MYMODULE_cron() {
// Look up last time MYMODULE_function() was run compared to 3 months ago.
if (variable_get('MYMODULE_function_last_run', 0) <= strtotime('-3 month')) {
// Run my function
MYMODULE_function();
//Store the time when MYMODULE_function() was last run.
variable_set('MYMODULE_function_last_run', time());
}
}
_
Rules モジュールとRules Scheduler
(そのサブモジュール)は、sending eMails(質問の下のコメントのように)、以下の手順で説明します。
マシン名(たとえば)field_next_renewal
を使用して、「user」エンティティにフィールドを追加します。 1つの日付のみを許可します(一部のユーザーにメールを送信するための「次の」日付を格納するために、たとえば一部の更新について)。
作成されるルールComponentは次のとおりです(ルールのエクスポート形式で、コピーと貼り付けを介して独自の環境にインポートするだけです):
{ "rules_send_email_notification" : {
"LABEL" : "Send eMail notification",
"PLUGIN" : "action set",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"USES VARIABLES" : { "user_to_notify" : { "label" : "User to be notified", "type" : "user" } },
"ACTION SET" : [
{ "mail" : {
"to" : [ "user-to-notify:mail" ],
"subject" : "Reminder about your next renewal",
"message" : "This is a reminder about your next renewal on [user-to-notify:field_next_renewal] ...",
"from" : "[site:mail]",
"language" : [ "" ]
}
}
]
}
}
明らかに、メールのSubjectおよびContentのレビューが必要な場合があります/チューニング。ただし、他のFrom電子メールIDを使用することもできます。
作成するRuleを Rules エクスポート形式で示します(コピーして貼り付けて独自の環境にインポートするだけです)。
{ "rules_email_user_every_3_months" : {
"LABEL" : "eMail user every 3 months",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules", "rules_scheduler" ],
"ON" : { "user_insert" : [] },
"IF" : [
{ "entity_has_field" : { "entity" : [ "account" ], "field" : "field_next_renewal" } }
],
"DO" : [
{ "data_set" : { "data" : [ "account:field-next-renewal" ], "value" : "+6 month" } },
{ "schedule" : {
"component" : "rules_send_email_notification",
"date" : {
"select" : "account:field-next-renewal",
"date_offset" : { "value" : 7776000 }
},
"identifier" : "[account:name]",
"param_user_to_notify" : [ "account" ]
}
}
]
}
}
上記のルールは、前のステップのRules Componentを参照しています。
7776000
は3か月の秒数に相当することに注意してください。あなたはそれを少し減らしたいかもしれません、例えば。秒数は数日(または1週間程度)に相当します。これにより、実際の更新の数日前にメールが送信されます。
手順3のルールと同様の追加のルールを作成することにより、 Flag モジュールと Rules の統合を使用して、非アクティブなユーザーに「フラグを立てる」こともできます。 このようなユーザーにタグを付ける(質問の下のコメントにあるように)の解決策でもあります。それについて残っている唯一の課題は、「inactive」ユーザーを識別するルール条件を見つけることです。