web-dev-qa-db-ja.com

ルールを使用して製品ごとのカスタム送料を追加するにはどうすればよいですか?

私は Drupal Commerce を使用していますDrupal 7サイトで、製品のディスプレイと製品を使用しています。

各商品には送料フィールドがあります。

チェックアウト時に、注文に含まれるすべての製品の送料を収集して表示する必要があります。

私のアプローチはこれです:私は Commerce Flat Rate モジュールを使用して、定額配送方法を作成します。次に、定額配送サービス「カスタム送料」を作成します。次に、注文の各製品のフィールド「カスタム送料」のフィールド値を取得する必要があるループを持つ「カスタム送料を適用」という新しい配送ルールを作成します。

質問:ルールは、ラインアイテムに関連付けられた製品のフィールド値を取得し、それを送料に追加する場合にどのように見えるべきですか?.

次のルール(ネストされている)は機能しません。ルールログを使用して、3番目のルールでは、エンティティにフィールドが渡されないことがわかりました。合計送料に追加する必要がある商品フィールド値を取得しようとします。

0.528 ms Evaluating the action component_rules_get_shipping_price_field_value. [edit]
" Evaluating rule get local shipping price field value. [edit]
0 ms Evaluating rule get local shipping price field value.
0.049 ms Evaluating conditions of rule get local shipping price field value. [edit]
0.11 ms The condition entity_has_field evaluated to FALSE [edit]
0.113 ms AND evaluated to FALSE.
0.123 ms Finished evaluation of rule get local shipping price field value.

================================================

rule 1

rule2

rule 3

{ "rules_apply_custom_product_shipping_costs" : {
    "LABEL" : "Apply custom product shipping costs",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "commerce_shipping" ],
    "ON" : { "commerce_shipping_calculate_rate" : [] },
    "DO" : [
      { "drupal_message" : { "message" : "Calculating shipping rates." } },
      { "variable_add" : {
          "USING" : {
            "type" : "commerce_price",
            "value" : { "value" : { "amount" : 0, "currency_code" : "USD" } }
          },
          "PROVIDE" : { "variable_added" : { "custom_shipping_cost" : "Custom shipping cost" } }
        }
      },
      { "component_rules_get_local_shipping_rate" : {
          "price" : [ "custom-shipping-cost" ],
          "line_item" : [ "commerce-line-item" ]
        }
      },
      { "component_rules_get_international_shipping_rate" : {
          "price" : [ "custom-shipping-cost" ],
          "line_item" : [ "commerce-line-item" ]
        }
      }
    ]
  }
}

==================

{ "rules_get_local_shipping_rate" : {
    "LABEL" : "Set local shipping rate",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "commerce_line_item" ],
    "USES VARIABLES" : {
      "price" : { "label" : "price", "type" : "commerce_price" },
      "line_item" : { "label" : "line item", "type" : "commerce_line_item" }
    },
    "IF" : [
      { "data_is" : { "data" : [ "line-item:type" ], "value" : "shipping" } },
      { "data_is" : {
          "data" : [ "line-item:commerce-shipping-service" ],
          "value" : "local_shipping_rate"
        }
      }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "Start loop: collect line item local shipping price field values" } },
      { "LOOP" : {
          "USING" : { "list" : [ "line-item:order:commerce-line-items" ] },
          "ITEM" : { "lineitem" : "lineitem" },
          "DO" : [
            { "variable_add" : {
                "USING" : {
                  "type" : "commerce_price",
                  "value" : { "value" : { "amount" : 0, "currency_code" : "USD" } }
                },
                "PROVIDE" : { "variable_added" : { "custom_shipping_cost" : "custom shipping cost" } }
              }
            },
            { "component_rules_get_shipping_price_field_value" : {
                "custom_shipping_cost" : [ "custom_shipping_cost" ],
                "line_item" : [ "line_item" ]
              }
            },
            { "commerce_line_item_unit_price_add" : {
                "commerce_line_item" : [ "line-item" ],
                "amount" : [ "price:amount" ],
                "component_name" : "flat_rate_local_shipping_rate",
                "round_mode" : "1"
              }
            },
            { "drupal_message" : { "message" : "Single product shipping cost is" } },
            { "drupal_message" : { "message" : [ "custom-shipping-cost:amount" ] } }
          ]
        }
      }
    ]
  }
}

==============

{ "rules_get_shipping_price_field_value" : {
    "LABEL" : "get local shipping price field value",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : {
      "custom_shipping_cost" : { "label" : "custom shipping cost", "type" : "commerce_price" },
      "line_item" : { "label" : "line item", "type" : "commerce_line_item" }
    },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "line-item" ], "field" : "commerce_product" } },
      { "entity_has_field" : {
          "entity" : [ "line-item:commerce-product" ],
          "field" : "field_shipping_rate_local_countr"
        }
      }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "line item has field commerce_product" } },
      { "data_set" : {
          "data" : [ "custom-shipping-cost" ],
          "value" : [ "line-item:commerce-product:field-shipping-rate-local-countr" ]
        }
      }
    ]
  }
}

===========================編集次の問題が原因で問題が発生しました:このルール設定全体で、複数の変数をラインアイテムとして使用しました。ループ内のlineitem変数の代わりに、ループ外のlineitem変数を誤って使用しました。ある時点で、私はlineitemとline-itemを持っていて、それらを混同して機能しなくなりました。また、ループ内で変数として製品を追加する必要がありました。

1
Yuri

以下はあなたの質問のこの(最も重要な?)部分に答える試みです:

次のルール(ネストされている)は機能しません。ルールログを使用して、3番目のルールでは、エンティティにフィールドが渡されないことがわかりました。合計送料に追加する必要がある商品フィールド値を取得しようとします。

  • 3番目のルールで、別のパラメーターを追加して、ラインアイテムが関連付けられている「Commerce Product」も渡します。 「product_related_to_item」という名前を付けます。
  • 2番目のルールで、追加のパラメーターの値(= product_related_to_item)を渡して、製品に関連するラインアイテムトークンを使用して3番目のルールを呼び出します(2番目のルールにそれがあることを確認してください)。
  • 3番目のルールで、2番目の「Entity hasフィールド」を同様のルール条件に置き換えますが、エンティティproduct_related_to_itemの(同じ)フィールドを参照します(最初のルール条件がまだ必要かどうかわからないので、君は ...)。

これらの修正を行うことにより、一般的なルールマジック(そのようなルール条件を追加した後)が再び適用されます。たとえば、後続のルールアクションでそれらの値を使用できます。そして、はい、私は知っています/実現します。これは、「これは意味がありません」または「基本的に同じことをしている」のようになります。少なくとも数日前、私が同じような問題に遭遇したとき、私は最初に自分自身について考えました。しかし、確かにこれが解決策でした(そして、ルールで「参照されたエンティティ(つまり、ラインアイテムで参照された製品)」を処理するときに、いくつかの制限と関係があることがわかりました。

1
Pierre.Vriens

以下のアプローチは、ピエールヴリアンのヒントのおかげでうまくいきましたが、私の特定のユースケースは、国内配送と国際配送に2つの製品フィールドを使用するため、少し複雑です。また、システムメッセージでトークンを使用できるようにするために、あちこちで追加の変数を使用しました。

enter image description hereenter image description hereenter image description hereenter image description hereenter image description here

1
Yuri