web-dev-qa-db-ja.com

ルールモジュールで現在のユーザーポイントがマイナスかどうかを確認するにはどうすればよいですか?

私の質問は非常に簡単です:ユーザーの現在の量 ユーザーポイントルール モジュールで負かどうかを確認するにはどうすればよいですか?ユーザーにユーザーポイントが付与されたときにアクティブになるアクションを作成します。イベントが設定されましたが、条件を設定する方法がわかりません。

編集:PHPフィルターモジュールを有効にして 'Execute custom PHPコード 'ルールの条件のオプション(私は this 以前に実行する必要があることを知りませんでした...)このコードを使用して、ユーザーのユーザーポイントが負かどうかを確認しました:

global $user;
$num_pts = userpoints_get_current_points($user->uid, 'all');
$neg_pts = $num_pts < 0;

残念ながら、ユーザーポイントがマイナスの場合でも、常に「false」と評価されます。私もこれを試しました:

$num_pts = userpoints_get_current_points([userpoints-transaction:user]->uid, 'all');
$neg_pts = $num_pts < 0;

しかし、それも機能しませんでした(同じ理由)。どちらの場合もエラーメッセージは表示されません。

これらのコードスニペットは間違っていますか?正しいものはどのように見えますか?

2
Jeroen

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

{ "rules_display_userpoints_after_updating_content" : {
    "LABEL" : "Display userpoints after updating content",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "userpoints_rules", "rules", "rules_conditional" ],
    "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" } },
      { "CONDITIONAL" : [
          {
            "IF" : { "NOT data_is" : { "data" : [ "total-points" ], "op" : "\u003C", "value" : "20" } },
            "DO" : [
              { "drupal_message" : { "message" : "You have sufficient points (you still have [total-points:value] ...)." } }
            ]
          },
          { "ELSE" : [
              { "drupal_message" : { "message" : "You DO NOT have sufficient points (you only have [total-points:value] ...)." } }
            ]
          }
        ]
      }
    ]
  }
}

最初のルールアクション(ルール条件ではありません!)として、ユーザーのユーザーポイントの現在の量を取得します。金額が20以上の場合、「十分なポイントがあります...」で始まるメッセージが表示されます。それ以外の場合、「十分なポイントがありません...」で始まるメッセージが表示されます。

したがって、これを機能させるためにカスタムPHPコード(ルール条件内))は必要ありません。また、PHPフィルタを有効にする必要はありません。 this ...)PHPフィルターを有効にすることを避けることができるときはいつでもそれをとるべきです( " PHPブロック、ノード、views-argsなどのコードをフィルターしますか? 理由を理解します)。

この例では Conditional Rules モジュールを使用していますが、Rulesアクションを変更して(適切なルール条件を追加する)ルールコンポーネントを実行して、これが不要になるようにすることもできます。追加モジュール。詳細については、「 条件付きルールモジュールを使用する代わりの方法は何ですか? 」の回答を参照してください。

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

2
Pierre.Vriens
global $user;
$num_pts = userpoints_get_current_points($user->uid, 'all');
$neg_pts = $num_pts < 0;
2
tigertrussell

@tigerrussellの答えに基づいて、正しいコードを見つけました。

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

このスニペットをExecute custom PHP code条件で使用するだけです。それはそれと同じくらい簡単です!しかし、推奨されていますPHPルールのコード。したがって、 Pierreの回答 で説明されているように、条件付きルールモジュールをインストールすることをお勧めします。

0
Jeroen