ノードを表示しているユーザーから1ポイントを差し引くルールがありますが、問題は、残高がマイナスのユーザーでもノードを表示できることです。だから私はこれを防ぎたいと思います。
私はDrupal 7とモジュール ルール および ユーザーポイント を使用しています。
助言がありますか?
あなたの質問には実際には2つの課題が含まれています。
これらの課題のそれぞれに対処するための答えを読んでください。
Rules event node_view
を使用する場合は、ノードがすでに表示されているため、手遅れになります(これは、まさに防止したいことです)。代わりに、(システム)イベント「Drupalが初期化中です」(= init
)を使用する必要があります。これは、実際にはノードが表示される前です。
ただし、ユーザーポイントのバランスがマイナスのユーザーのノードの表示を禁止する必要もあります。それに関する課題は、そのバランスをチェックするためのすぐに使用できるルール条件がないことです。
このルールの例(ルールのエクスポート形式)をご覧ください。
{ "rules_stop_node_access_for_user_with_negative_points" : {
"LABEL" : "Disallow node/* access for a user with negative points",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "userpoints_rules", "rules", "rules_conditional" ],
"ON" : { "init" : [] },
"IF" : [
{ "text_matches" : {
"text" : [ "site:current-page:path" ],
"match" : "node\/\\d+$",
"operation" : "regex"
}
}
],
"DO" : [
{ "userpoints_rules_get_current_points" : {
"USING" : { "user" : [ "site:current-user" ], "tid" : "all" },
"PROVIDE" : { "loaded_points" : { "total_points" : "Number of points in all categories together" } }
}
},
{ "CONDITIONAL" : [
{
"IF" : { "data_is" : { "data" : [ "total-points" ], "op" : "\u003C", "value" : "0" } },
"DO" : [
{ "drupal_message" : { "message" : "You have insufficient points (you only have [total-points:value] points ...)." } },
{ "redirect" : { "url" : "no_access" } }
]
}
]
}
]
}
}
ここで追加されたルール条件は、node/*
のようなパスを参照しようとする試みに対してのみルールアクションを実行することです(あなたのケースに合うものに適応します)。
このルールは、最初のルールアクション(ルール条件ではありません!)として、ユーザーの現在のユーザーポイント数を取得します。負の場合は、「ポイントが不足しています...」で始まる適切なメッセージが表示され、no_access
のような相対パスにリダイレクトされます(それに適合するものに適合します)。
このルールは 条件付きルール モジュールを使用しますが、ルールアクションをやり直してルールコンポーネント(適切なルール条件を追加する)を実行することもできるため、この追加モジュールは必要ありません。
このルールを機能させるための手がかりは、最初のルールアクション "ユーザーのユーザーポイントをロードする "。詳細については、「 ルール条件で獲得したユーザーポイントの現在の量にアクセスする方法は? "」に対する私の回答を参照してください。