定期的に全ユーザーの内容をスキャンしアクションを起こす方法

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
redboxhosting's picture

現在、特定のロールを持っているユーザーを条件に対象のユーザー全てに「メールを送る」もしくは「アカウントロブロックする」などのアクションを行いたいと考えています。

現在検討している方法は以下のようにRulesモジュールを利用する方法です。

・イベント
ユーザーがログインした

・条件
ユーザーがロールを保持している
Aロール

・アクション
アカウントをブロックなど

この場合ログインされないとアクションが起こらないためシステム的に定期的に全ユーザーをチェックしてアクションを実行するためイベントに「Cronタスクが実行された」を追加しました。

しかし、どうやらCron実行したというイベントはシステム的なイベントのため、条件の部分のユーザー名などはみてくれないらしくアクションが起こりません。

いくつか調べた所、こちらの記事が該当するようなのですが、rules_invoke_event('rule_name', $arg1, $arg2, $argN);というArgには何をいれるべきなのでしょうか。

http://stackoverflow.com/questions/12317393/drupal-7-run-rule-on-every-u...

よろしくお願い致します。

Comments

hgoto's picture

いくつか調べた所、こちらの記事が該当するようなのですが、rules_invoke_event('rule_name', $arg1, $arg2, $argN);というArgには何をいれるべきなのでしょうか。

rules_invoke_event() の第 2 引数以降にはルールイベント rule_name のコールバック関数に渡したい引数を指定すべきです。

http://drupalcontrib.org/api/drupal/contributions!rules!rules.module/function/rules_invoke_event/7

ルールイベント rule_name がどのような引数を受け取るかは hook_rules_event_info() で定義されているアイテムの variables の中身を確認するとおわかりになるかと思います。

http://drupalcontrib.org/api/drupal/contributions!rules!rules.api.php/function/hook_rules_event_info/7

元々の課題にも言及しておきますね。

特定のロールを持っているユーザーを条件に対象のユーザー全てに「メールを送る」

「特定のロールのユーザ全員にメールを送る」というのは確か Rules だけで可能です。イベントはお選びになった「 Cron タスクが実行された」というのを選んで、アクションとして「 Send mail to all users of a role 」というものを選択するとできるかと思います。お探しになってみてください。

一方、「特定のロールのユーザ全員のアカウントをブロックする」というのをするには Rules が提供するイベントやアクションだけでは厳しかったはずです。何らかのカスタムコードを書かないと厳しいのではないでしょうか( Views や Views Bulk Operations などを駆使するとできなくもないようですが、コードを書いた方が早いと思います)。ご参考まで。

redboxhosting's picture

早速のアドバスありがとうございます!

なるほど、Rulesで引数を渡すことができるのであればユーザー名を渡してあげることも容易かもしれません。こちらは少し掘り下げて勉強してみたいとおもいます。

また、特定のロールユーザーをブロックするという設定ですが、確かに標準のRulesでは難しいようですので、先ほどのようにカスタムモジュールを書いて実装するしかなさそうです。

しかし、別の方法として一応RulesとRole Expire+パッチにより実現ができました。

role expire
https://www.drupal.org/project/role_expire

パッチ
https://www.drupal.org/node/1820306

イベント
ロールの期限が切れたとき(パッチを当てることにより利用可能になる)

条件
●●ロールが含まれる場合

アクション
アカウントをブロック

ロールに期限をもたせ、Cronにより期限切れか否かを判断

期限切れと判断した場合は権限が外れると同時に、アクションをおこすことが出来る。

ちょっと無理矢理ですがCronを実行したタイミングで、特定のロール期限をExpireさせそのときに実行するアクションを指定することによりなんとかなりました。。。

ただし、やはり自分でモジュール化してシンプルに実行すべきかと思っています。

ご紹介くださっている Role expire

hgoto's picture

ご紹介くださっている Role expire とパッチとで実現できたのですね。無事実現できたとのことで何よりです!

実現方法までご丁寧にご紹介くださいありがとうございます。他の方のよい参考になると思います。

ただし、やはり自分でモジュール化してシンプルに実行すべきかと思っています。

ご想像のとおり、モジュール化される際に必要なコードの量はそれほど多くないかと思いますので、もし機会とお時間がございましたらぜひぜひ。ちなみに Rules のアクションを追加するために実装すべきフック関数は hook_rules_action_info() です。

hook_rules_action_info()
http://drupalcontrib.org/api/drupal/contributions!rules!rules.api.php/function/hook_rules_action_info/7

日本 コミュニティ: Drupal Japan User Group

Group organizers

Group categories

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week