web-dev-qa-db-ja.com

ユーザーポイントのバランスが悪いユーザーがノードを表示しないようにするにはどうすればよいですか?

ノードを表示しているユーザーから1ポイントを差し引くルールがありますが、問題は、残高がマイナスのユーザーでもノードを表示できることです。だから私はこれを防ぎたいと思います。

私はDrupal 7とモジュール ルール および ユーザーポイント を使用しています。

助言がありますか?

2
Aaron

あなたの質問には実際には2つの課題が含まれています。

  1. どのルールイベントを使用しますか?
  2. ユーザーのユーザーポイントの現在のバランスを確認しますか?

これらの課題のそれぞれに対処するための答えを読んでください。

1.使用するルールイベント

Rules event node_viewを使用する場合は、ノードがすでに表示されているため、手遅れになります(これは、まさに防止したいことです)。代わりに、(システム)イベント「Drupalが初期化中です」(= init)を使用する必要があります。これは、実際にはノードが表示される前です。

2.ユーザーポイントの現在の残高を確認します

ただし、ユーザーポイントのバランスがマイナスのユーザーのノードの表示を禁止する必要もあります。それに関する課題は、そのバランスをチェックするためのすぐに使用できるルール条件がないことです。

このルールの例(ルールのエクスポート形式)をご覧ください。

{ "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のような相対パスにリダイレクトされます(それに適合するものに適合します)。

このルールは 条件付きルール モジュールを使用しますが、ルールアクションをやり直してルールコンポーネント(適切なルール条件を追加する)を実行することもできるため、この追加モジュールは必要ありません。

このルールを機能させるための手がかりは、最初のルールアクション "ユーザーのユーザーポイントをロードする "。詳細については、「 ルール条件で獲得したユーザーポイントの現在の量にアクセスする方法は? "」に対する私の回答を参照してください。

1
Pierre.Vriens