web-dev-qa-db-ja.com

ルールモジュールはどのユーザーとして実行しますか?

「新しいユーザーアカウントを保存した後」によってトリガーされるルールを設定しました。このルールは、単に電子メールを送信します。電子メールにはさまざまなトークンが含まれており、その1つがフィールド[account:field_country]です。

このフィールドの「カスタム権限」を有効にし、フィールド権限モジュールを通じて次の権限を構成しました。

すべてのユーザー(選択した権限):

  • Create own value for field Country
  • View own value for field country

モデレーター(すべての権限):

  • Create own value for field Country
  • Edit own value for field Country
  • Edit anyone's value for field country
  • View own value for field Country
  • View anyone's value for field Country

問題は、ルールが電子メールを送信するときに[account:field_country]が空の文字列に置き換えられることです。すべてのユーザーにView anyone's value for field Countryを許可した場合にのみ、ルールはトークンを実際に選択された国の値に適切に置き換えます。

なぜこれを行う必要があるのですか?ルールがそのフィールドの値を取得できるようにするには、明らかにView anyone's value for field Countryが必要なため、ルールモジュールはどのユーザーとして実行されますか。

6
sbrattla

そしてここに役立つモジュールがあります:

ルール切り替えユーザー

このモジュールは、2つの新しいルールアクションを追加します。

  • 別のユーザーに切り替える
  • 別のユーザーから切り替える

これらのアクションは、権限のないユーザーに使用させたい操作がある場合に役立ちますが、ユーザーに十分な権限がないために失敗します。

十分な権限を持つ架空のユーザーを作成し、ルールアクションの実行時にこのユーザーに切り替え、完了したら再び切り替えます。

[〜#〜] edit [〜#〜]この回答は単なる回避策であり、直接質問することはできません。ルールが正常に実行されることを許可していません。

1
J. Reynolds

IMOあなたの "問題"(フィールドの値が空白である)は、イベント(= "after after a new user account")が原因です使用していますが、これは単に正しいイベントではない可能性があります。このユーザーがまだ「ブロック」されている場合(=登録手順で管理者の承認が必要な場合)、ルールモジュールがこのフィールドの内容をまだ表示しないようにするのは理にかなっています。

さらに、ここであなたのイベントのバリエーションであるイベントについて issue#430274 を見て、「何かを保存した後」が実際に発生する...「何かを保存する前に」(これはバグではなく、単にルールの仕組み...).

この種の問題を回避するための考えられる妥協策は、電子メールの送信をルールコンポーネントに変換することです。これにより、元のルールがそのルールコンポーネントの「実行をスケジュール」します(ルールスケジューラサブモジュールを使用)。新しいユーザーアカウントを保存します」... cronジョブが十分に頻繁に実行される場合、そうでない場合は、次回cronが実行されるときです)。この妥協により、ルールコンポーネントが実行されたときに、新しいユーザーアカウントが確実に保存されます...(そのため、そのフィールドが空白のままになる理由はもうありません...)。

このルールコンポーネントアプローチを使用すると、ユーザーアカウントが「ブロックされなくなった」場合にのみこの電子メールを送信することを検討することもできます(まだブロックされている場合は、同じコンポーネントを再スケジュールするためのルールロジックを追加します。 -後で実行する)。

ちなみに、Rules Schedulerを使用するルールに関するものはすべて、「匿名」権限で確実に実行されます。もちろん、その認証では不十分なケース(ルールアクション)があります(例:新しいノードの作成は匿名では許可されていません)。これらの場合でも、それを解決する方法もあります(その方法を知りたい場合:それについてのフォローアップの質問を投稿してください)。

1
Pierre.Vriens