web-dev-qa-db-ja.com

ユーザーポイントの合計が特定のユーザーのしきい値を下回らないようにするにはどうすればよいですか?

個々のユーザーポイントの絶対的な下限を設定したい( ユーザーポイント モジュールを使用)。具体的には、ユーザーポイントの総数を1未満にすることを不可能にするため。

Drupal 6では、userpoints_no_negative Userpoints_contribのモジュールですが、 Rules 7.xの統合により削除されました( https://drupal.org/project/userpoints_contrib )。

ドキュメントでは、ルールを使用して「ユーザーポイント-現在のユーザーポイントを比較」( https://drupal.org/node/87439 )の条件でポイント合計を評価する例を提供していますが、私はこの条件が利用できるとは思いません

ルールを使用しても、カスタムモジュールを使用しても、すべてのソリューションを受け入れます。


EDIT 2/4/2014 9:17 PM UTC-ramesh babuの承認された回答に基づくサンプルコード:

/*
 * Implements hook_userpoints().
 * Checks if points at minimum threshold, corrects to 1 if pushed below limit.
 * Based on comments in Userpoints API documentation on D.O. a separate transaction
 * is made to correct for the threshold rather than modifying the points for 
 * the existing transaction.  See https://drupal.org/node/206558
 */
function mymodule_userpoints($ops, $params) {
  if ($ops == 'points before' && !isset($params['threshold'])) {
    $future_total = userpoints_get_current_points($params['uid'], 'all') + $params['points'];
    if ($future_total < 1) {
      $params['description'] = 'Minimum point correction.';
      $params['points'] = abs($future_total) + 1;
      $params['threshold'] = true;
      userpoints_userpointsapi($params);
    }
  }
}

Drupal.orgのUserpoints APIのドキュメントも参考になります https://drupal.org/node/206558

5
Brent

ここでは、カスタムモジュールの実装によるソリューション:

カスタムモジュールにhook_userpoints($ op、$ params)関数を実装して、points beforeとpoints afterという2つのオプションを持つすべてのトランザクションでユーザーポイントをチェックします。

ポイントはあなたのしきい値よりも小さいかどうかを確認するために、トランザクション後にしきい値を設定します。

詳細については http://api.worldempire.ch/api/userpoints/functions?page=1 これを確認してください。

3
Ramesh Babu T B

私は次のルールでこれを達成しました:

{ "rules_prevent_negative_points" : {
    "LABEL" : "Prevent negative points",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "TAGS" : [ "Points" ],
    "REQUIRES" : [ "php", "rules", "userpoints_rules" ],
    "ON" : { "userpoints_event_points_awarded_after" : [] },
    "IF" : [
      { "php_eval" : { "code" : "$num_pts = userpoints_get_current_points($userpoints_transaction->uid, \u0027all\u0027);\r\nif ($num_pts \u003C 0) {return TRUE;}" } }
    ],
    "DO" : [
      { "userpoints_rules_get_current_points" : {
          "USING" : { "user" : [ "userpoints-transaction:user" ], "tid" : "all" },
          "PROVIDE" : { "loaded_points" : { "negative_amount" : "Negative amount of points." } }
        }
      },
      { "data_calc" : {
          "USING" : { "input_1" : [ "negative-amount" ], "op" : "*", "input_2" : "-1" },
          "PROVIDE" : { "result" : { "pos_value" : "Positive value." } }
        }
      },
      { "data_calc" : {
          "USING" : { "input_1" : [ "pos-value" ], "op" : "+", "input_2" : "1" },
          "PROVIDE" : { "result" : { "result" : "result" } }
        }
      },
      { "data_convert" : {
          "USING" : {
            "type" : "integer",
            "value" : [ "result" ],
            "rounding_behavior" : "down"
          },
          "PROVIDE" : { "conversion_result" : { "points" : "Points needed to become 1" } }
        }
      },
      { "userpoints_action_grant_points" : {
          "user" : [ "userpoints-transaction:user" ],
          "points" : [ "points" ],
          "tid" : "0",
          "entity" : [ "" ],
          "description" : "Prevent negative amount of points.",
          "operation" : "Add",
          "display" : 0,
          "moderate" : "approved"
        }
      }
    ]
  }
}

Configuration > Workflow > Rulesにインポートするだけです。

2
Jeroen

Drupal 7の場合、ユーザーの現在の合計ユーザーポイントに関連するルール条件はありません。この例のようにカスタムPHPコードを使用することを除いて、 Jeroenの回答のルール条件に似ており、ルール条件で使用できます。カスタムPHPコードを実行します。比較):

global $user;
$current_points = userpoints_get_current_points($user->uid, 'all');
if ($current_points < 0) {return TRUE;}

ただし、「ユーザーのユーザーポイントを読み込む」というルールアクションがありますが、特定のカテゴリ、またはすべてのカテゴリをまとめて。このルールアクションは、リクエストされたカテゴリのユーザーポイントの量を含むルール変数(名前と説明を指定できます)を提供します。その後、この変数を後続のルールアクションで使用できます。

その後、ルール条件内でその変数を使用する場合、次の2つの方法があります。

  • ルールコンポーネントに条件を含めますが、「ユーザーのユーザーポイントの読み込み」に続くルールアクションを介してそのルールコンポーネントの実行をトリガーします(ユーザーコンポーネントの量を含む変数をルールコンポーネントの変数として渡します) 。
  • ルールアクション内でルール条件を指定できるように、 条件付きルール モジュールを使用します。

これは、ユーザーがノード(=ルールイベント)の更新を実行した後、ユーザーの現在の合計ユーザーポイントに関するメッセージを表示する基本的な例です。必要なルールイベントに変更できます...例: 「Drupal is initializing」に置き換えて、サイトのすべてのパスにメッセージを表示します):

{ "rules_display_userpoints_after_updating_content" : {
    "LABEL" : "Display userpoints after updating content",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "userpoints_rules", "rules" ],
    "ON" : { "node_update" : [] },
    "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" } }
        }
      },
      { "drupal_message" : { "message" : "You now have [total-points:value] points" } }
    ]
  }
}

必要に応じて、ルールUIを使用して上記のルールを自分のサイトにインポートします。

実際にユーザーポイントの量がしきい値を下回らないようにするには、Jeroenの回答に示されているルールアクションと同様のルールアクションを実行します(上記で説明したように、ルールコンポーネントまたは条件付きルールを使用)。

これで、カスタムを必要としない別の Rules ベースのソリューションがありますPHP code (ルール条件内)。

1
Pierre.Vriens