web-dev-qa-db-ja.com

Commerceルールでダブルユーザーポイントが誤って付与されるのはなぜですか?

私は2つの製品を所有しており、ユーザーがそれを購入するときに、賞金のユーザーポイントが数量に応じて異なります。

このタスクでは、特定のモジュール(Rules配列の作成とコマースルールの追加)を使用して、数量に基づいて配列を作成します。ユーザーが私の製品を購入するとすべて正しく機能しますが、製品が混在している場合はすべて正しく機能しません。私のルールはユーザーポイントを2倍にします。

欲しいもの:「A」と「B」の商品があります。製品「A」は15ドル、製品「B」は25ドルです。ユーザーが「A」を購入すると、20ユーザーポイントを獲得します。「B」では、ユーザーが製品の数量を増やした場合にも、30ユーザーポイントを獲得します(例:Ax2 = 40ユーザーポイント;(Ax2 = 40 Bx1 = 30 )= 70ユーザーポイント)。

私のルールでは、条件を確認します。注文に含まれるSKUを確認します。

私が持っているもの:ユーザーが製品の1つを購入すると、私のルールは正しく機能します。しかし、ユーザーが両方の製品(AとB)を購入すると、私のルールはuserpointsを2倍にし、ユーザーは2倍の金額を獲得します(A = 20ポイント、B = 30ポイントの金額= 50ではなく100)

この問題を回避するにはどうすればよいですか?

これは最初の製品の私のルールです:

{ "rules_grantpointaftercheckout" : {
"LABEL" : "GrantPointAfterCheckOut",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [
  "commerce_rules_extra",
  "rules_array_create",
  "userpoints_rules",
  "commerce_checkout"
],
"ON" : { "commerce_checkout_complete" : [] },
"IF" : [
  { "commerce_rules_extra_product_sku_contains" : {
      "commerce_order" : [ "commerce_order" ],
      "product_id" : "15_min",
      "operator" : "\u003E=",
      "value" : "1"
    }
  }
],
"DO" : [
  { "array_create" : {
      "USING" : { "size" : [ "commerce-order:commerce-order-quantity" ] },
      "PROVIDE" : { "array_added" : { "array_added" : "Added array" } }
    }
  },
  { "LOOP" : {
      "USING" : { "list" : [ "array-added" ] },
      "ITEM" : { "list_item" : "Current list item" },
      "DO" : [
        { "userpoints_action_grant_points" : {
            "user" : [ "site:current-user" ],
            "points" : "20",
            "tid" : "0",
            "entity" : [ "" ],
            "operation" : "sdadsasad",
            "display" : "1",
            "moderate" : "approved"
          }
        }
      ]
    }
  }
]
 }
 }

これは私の2番目の製品のルールです。

{ "rules_grantpointaftercheckout_cloned_" : {
"LABEL" : "GrantPointAfterCheckOut (cloned)",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [
  "commerce_order",
  "rules_array_create",
  "userpoints_rules",
  "commerce_checkout"
],
"ON" : { "commerce_checkout_complete" : [] },
"IF" : [
  { "commerce_order_contains_product" : {
      "commerce_order" : [ "commerce_order" ],
      "product_id" : "30_min",
      "operator" : "\u003E=",
      "value" : "1"
    }
  }
],
"DO" : [
  { "array_create" : {
      "USING" : { "size" : [ "commerce-order:commerce-order-quantity" ] },
      "PROVIDE" : { "array_added" : { "array_added_2" : "Added array 2" } }
    }
  },
  { "LOOP" : {
      "USING" : { "list" : [ "array-added-2" ] },
      "ITEM" : { "list_item2" : "Current list item 2" },
      "DO" : [
        { "userpoints_action_grant_points" : {
            "user" : [ "site:current-user" ],
            "points" : "30",
            "tid" : "0",
            "entity" : [ "" ],
            "operation" : "sdadsasad",
            "display" : "1",
            "moderate" : "approved"
          }
        }
      ]
    }
  }
]
}
}

これは、条件付きルールモジュールのルールの更新です。

説明:

モジュール「条件付きルール」をインストールして、次のようなロジックでルールを作成します。If:注文に特定の商品が含まれている(commerce-order:commerce-line-items:0:order)->配列を作成する(commerce-order:commerce-line -items:0:quantity)-> Loop(Created array)-> Grant userpoint。次に、もう一度条件を追加してルールの2番目の部分を作成しますが、今度は1つの項目をチェックします。両方の製品に2つのルールを作成します。単独でテストした場合はすべてうまくいきますが、両方の製品をカートに追加すると、ユーザーポイントは位置回避量にのみ付与されます。

製品のルール

{ "rules_a_userpoints" : {
"LABEL" : "A_userpoints",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [
  "rules_conditional",
  "rules_array_create",
  "userpoints_rules",
  "commerce_order",
  "commerce_checkout"
],
"ON" : { "commerce_checkout_complete" : [] },
"DO" : [
  { "CONDITIONAL" : [
      {
        "IF" : { "commerce_order_contains_product" : {
            "commerce_order" : [ "commerce-order:commerce-line-items:0:order" ],
            "product_id" : "A_sku",
            "operator" : "\u003E=",
            "value" : "1"
          }
        },
        "DO" : [
          { "array_create" : {
              "USING" : { "size" : [ "commerce-order:commerce-line-items:0:quantity" ] },
              "PROVIDE" : { "array_added" : { "array_added_a_line_0" : "array_added_a_line_0" } }
            }
          },
          { "LOOP" : {
              "USING" : { "list" : [ "array_added_a_line_0" ] },
              "ITEM" : { "loop_a_line_0" : "loop_a_line_0" },
              "DO" : [
                { "userpoints_action_grant_points" : {
                    "user" : [ "site:current-user" ],
                    "points" : "20",
                    "tid" : "0",
                    "entity" : [ "" ],
                    "operation" : "2123",
                    "display" : "1",
                    "moderate" : "approved"
                  }
                }
              ]
            }
          }
        ]
      },
      { "ELSE" : [
          { "CONDITIONAL" : [
              {
                "IF" : { "commerce_order_contains_product" : {
                    "commerce_order" : [ "commerce-order:commerce-line-items:1:order" ],
                    "product_id" : "A_sku",
                    "operator" : "\u003E=",
                    "value" : "1"
                  }
                },
                "DO" : [
                  { "array_create" : {
                      "USING" : { "size" : [ "commerce-order:commerce-line-items:1:quantity" ] },
                      "PROVIDE" : { "array_added" : { "array_added_a_line_1" : "array_added_a_line_1" } }
                    }
                  },
                  { "LOOP" : {
                      "USING" : { "list" : [ "array-added-a-line-1" ] },
                      "ITEM" : { "loop_a_line_1" : "loop_a_line_1" },
                      "DO" : [
                        { "userpoints_action_grant_points" : {
                            "user" : [ "site:current-user" ],
                            "points" : "20",
                            "tid" : "0",
                            "entity" : [ "" ],
                            "operation" : "adw",
                            "display" : "1",
                            "moderate" : "approved"
                          }
                        }
                      ]
                    }
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]
}
}

B製品のルール

{ "rules_b_userpoints" : {
"LABEL" : "B_userpoints",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [
  "rules_conditional",
  "rules_array_create",
  "userpoints_rules",
  "commerce_order",
  "commerce_checkout"
],
"ON" : { "commerce_checkout_complete" : [] },
"DO" : [
  { "CONDITIONAL" : [
      {
        "IF" : { "commerce_order_contains_product" : {
            "commerce_order" : [ "commerce-order:commerce-line-items:0:order" ],
            "product_id" : "B_sku",
            "operator" : "\u003E=",
            "value" : "1"
          }
        },
        "DO" : [
          { "array_create" : {
              "USING" : { "size" : [ "commerce-order:commerce-line-items:0:quantity" ] },
              "PROVIDE" : { "array_added" : { "array_added_b_line_0" : "array_added_b_line_0" } }
            }
          },
          { "LOOP" : {
              "USING" : { "list" : [ "array-added-b-line-0" ] },
              "ITEM" : { "loop_b_line_0" : "loop_b_line_0" },
              "DO" : [
                { "userpoints_action_grant_points" : {
                    "user" : [ "site:current-user" ],
                    "points" : "30",
                    "tid" : "0",
                    "entity" : [ "" ],
                    "operation" : "sdf",
                    "display" : "1",
                    "moderate" : "approved"
                  }
                }
              ]
            }
          }
        ]
      },
      { "ELSE" : [
          { "CONDITIONAL" : [
              {
                "IF" : { "commerce_order_contains_product" : {
                    "commerce_order" : [ "commerce-order:commerce-line-items:1:order" ],
                    "product_id" : "B_sku",
                    "operator" : "\u003E=",
                    "value" : "1"
                  }
                },
                "DO" : [
                  { "array_create" : {
                      "USING" : { "size" : [ "commerce-order:commerce-line-items:1:quantity" ] },
                      "PROVIDE" : { "array_added" : { "array_added_b_line_1" : "array_added_b_line_1" } }
                    }
                  },
                  { "LOOP" : {
                      "USING" : { "list" : [ "array-added-b-line-1" ] },
                      "ITEM" : { "loop_b_line_1" : "loop_b_line_1" },
                      "DO" : [
                        { "userpoints_action_grant_points" : {
                            "user" : [ "site:current-user" ],
                            "points" : "30",
                            "tid" : "0",
                            "entity" : [ "" ],
                            "operation" : "sf",
                            "display" : "1",
                            "moderate" : "approved"
                          }
                        }
                      ]
                    }
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]
}
}

それは私のデバッグルールログです:

Rule Update the order status on checkout completion fires.
        0 ms Rule Update the order status on checkout completion fires.
        0.069 ms Evaluating the action commerce_order_update_state. [edit]
        15.016 ms Rule Update the order status on checkout completion has fired.
    20.585 ms Evaluating conditions of rule A_userpoints. [edit]
    20.598 ms AND evaluated to TRUE.

    Rule A_userpoints fires.
        0 ms Rule A_userpoints fires.
        3.964 ms The condition commerce_order_contains_product evaluated to TRUE [edit]
        4.071 ms Evaluating the action array_create. [edit]
        4.146 ms Added the provided variable array_added_a_line_0 of type list [edit]
        4.293 ms Looping over the list items of array_added_a_line_0 [edit]
        5.989 ms Evaluating the action userpoints_action_grant_points. [edit]
        15.5 ms Rule A_userpoints has fired.
    36.183 ms Evaluating conditions of rule B_userpoints. [edit]
    36.197 ms AND evaluated to TRUE.

    Rule B_userpoints fires.
        0 ms Rule B_userpoints fires.
        0.88 ms The condition commerce_order_contains_product evaluated to TRUE [edit]
        0.972 ms Evaluating the action array_create. [edit]
        1.046 ms Added the provided variable array_added_b_line_0 of type list [edit]
        1.202 ms Looping over the list items of array-added-b-line-0 [edit]
        1.376 ms Evaluating the action userpoints_action_grant_points. [edit]
        4.833 ms Rule B_userpoints has fired.

まあ、私は悪魔モジュールを有効にした後、私は新しい情報を持っています。

ユーザーポイントの最初の行の数量を増やすと、自動的に配列2の項目に追加され、2番目のルールが同じ配列を使用すると想定する方法がわかります。それが私のトラブルの理由だと思います。

アレイモジュールを削除した場合、OK 製品の品質を介してループを開始するにはどうすればよいですか? 誰かが私のタスクに別の方法を提案しますか?

1
NashGC

現在のルールの問題

100%確実にするためにいくつかのルールのデバッグを行う必要がありますが、私は "pretty"です。問題の核心はループです。あなたの2つのルールの。ルールが各製品(サンプルのAとB)を反復しているようであり、反復ごとにそれらのユーザーポイントを付与します。したがって、2つの反復(AやBなどの製品)がある場合、製品にを2回許可します(質問の「二重」部分を説明します)。さらに、3番目の製品Cのテストケースがある場合は、付与されるユーザーポイントが3倍になると思います。

可能な解決策

ルールを希望どおりに機能させるには、ルール条件(両方のルール)をRules Condition inside your Rules Loopに向けて「再調整」する必要があります。これにより、ユーザーは適切なルール条件が満たされている場合にのみ付与されます。

ただし、ルールアクション内でルール条件を使用することはできません。確かに... Conditional Rules モジュールも使用する場合を除いて(これがまさにこのモジュールの目的です)。別の方法として、付与されるユーザーポイントに相当するルールアクションと現在のルール条件に相当するルール条件を使用して、ルールコンポーネントを作成することもできます。次に、ルールループ内でそのルールコンポーネントを実行します。詳細については、「 条件付きルールモジュールを使用する代わりの方法は何ですか? 」の回答を参照してください。

ルールのデバッグ

上記のいずれも役に立たない場合は、「 条件内の変数の値を表示するにはどうすればよいですか 」に対する私の回答で説明されているように、ルールのデバッグに進みます。

そのタイプのデバッグの結果によっては、(一時的に) Devel モジュールを有効にして、「値を表示する」などのルールアクションを(一時的に)追加できるようにすることもできます。

必要に応じて、質問を更新して、ルールのデバッグログがどのように表示されるかについての詳細を追加します(ログの表示内容に応じて、後で回答を更新する場合があります)。

1
Pierre.Vriens