web-dev-qa-db-ja.com

コマースプロダクトにフラグを付けるルールを使用して、ラインアイテムのcommerce_productフィールドにアクセスする方法

この質問に関連して: 現在のユーザーがすでに購入している製品にマークを付ける方法は?

Drupal Commerce ショップがあります。ここでは Flag モジュールを使用して製品にマークを付け、ユーザーが特定の製品をすでに購入しているかどうかをユーザーに通知します。

現在、「チェックアウトプロセスの完了」でトリガーされるルール( Rules を使用)を作成して、購入されたすべての製品にフラグを立てようとしています。問題は、私が何をしても、ラインアイテムのcommerce_productフィールド(製品参照フィールド)にアクセスできないことです。そのため、製品にフラグを付けるために必要な情報を見つけることができません。

誰かがこれを詳細に、できれば例を挙げて教えてくれませんか?

1
Nenotek

以下は、質問を解決するために使用できる可能なアプローチです。これは、チェックアウト時に一連のDrupalメッセージが表示された方法に関する詳細を提供します。これは、私が使用したこのテストケースに似ています(3つのラインアイテムが入ったカートの場合):

Current line item has label 'USB-BLU-08' and id '17'
Some details about this product: Product ID = 28, Product SKU = USB-BLU-08, Product Title = Storage 1, Product Creator = Hillary.Trump

Current line item has label 'TSH4-BLK-MD' and id '18'
Some details about this product: Product ID = 53, Product SKU = TSH4-BLK-MD, Product Title = Tshirt 4, Product Creator = Donald.Clinton

Current line item has label 'MES1-BLU-OS' and id '19'
Some details about this product: Product ID = 2, Product SKU = MES1-BLU-OS, Product Title = Messenger Bag 1, Product Creator = Pierre.Vriens

これを機能させるために、カスタムルールコンポーネントを実行するカスタムルールを作成しました。それらについての詳細を読んでください...

ステップ1:ルールコンポーネントを作成する

次のようなルールコンポーネントを作成します(ルールUIを使用して自分のサイトにインポートします)。

{ "rules_perform_an_action_on_a_selected_line_item" : {
    "LABEL" : "Perform an action on a selected line item",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : { "selected_line_item" : { "label" : "Selected Line Item", "type" : "commerce_line_item" } },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "selected-line-item" ], "field" : "commerce_product" } }
    ],
    "DO" : [
      { "entity_fetch" : {
          "USING" : {
            "type" : "commerce_product",
            "id" : [ "selected-line-item:commerce-product:product-id" ]
          },
          "PROVIDE" : { "entity_fetched" : { "product_fetched" : "Fetched Product" } }
        }
      },
      { "drupal_message" : { "message" : "Some details about this product: Product ID = [product-fetched:product-id], Product SKU = [product-fetched:sku], Product Title = [product-fetched:title], Product Creator = [product-fetched:creator]" } }
    ]
  }
}

それについていくつかの詳細:

  • パラメーター: selected_line_item(=処理中のラインアイテム)。
  • ルール条件:エンティティ(= selected-line-item)にフィールド(= commerce_product)。
  • ルールアクション:
    • エンティティを取得(= commerce_product)ID(= selected-line-item:commerce-product:product-id)。
    • Drupalメッセージで始まり、「この製品の詳細...」で始まります(QAテストの終了後、このルールアクションを削除してください)。

ステップ2:ステップ1のルールコンポーネントを呼び出すルールを作成する

次のようなルールを作成します(Rules UIを使用して自分のサイトにインポートします)。

{ "rules_access_product_fields_at_checkout" : {
    "LABEL" : "Access product fields at checkout",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "commerce_checkout" ],
    "ON" : { "commerce_checkout_complete" : [] },
    "DO" : [
      { "LOOP" : {
          "USING" : { "list" : [ "commerce-order:commerce-line-items" ] },
          "ITEM" : { "line_item" : "Current line item" },
          "DO" : [
            { "drupal_message" : { "message" : "Current line item has label \u0027[line-item:line-item-label]\u0027 and id \u0027[line-item:line-item-id]\u0027" } },
            { "component_rules_perform_an_action_on_a_selected_line_item" : { "selected_line_item" : [ "line-item" ] } }
          ]
        }
      }
    ]
  }
}

それについていくつかの詳細:

  • ルールイベント:チェックアウトプロセスの完了後。
  • ルール条件:なし。
  • ルールアクション:ループを作成して、各ラインアイテムを反復します。そして、各広告申込情報について、次のルールアクションを実行します:
    • Drupalメッセージで始まり、「現在のラインアイテムは...」で始まります(QAテストが終了したら、このルールアクションを自由に削除してください)。
    • 処理中の現在のラインアイテムに対して、手順1のルールコンポーネントを実行します。

ステップ3:宿題(=あなたの番)

実際に質問に答えるには、つまり、各ラインアイテムの製品にフラグを付けるには、onlyステップ1のルールコンポーネント。その時点で各ラインアイテムのすべてのデータを使用できるため、ルールコンポーネントをニーズに合わせて調整する(つまり、現在のユーザーが製品にフラグを立てる)ことは簡単です。

2
Pierre.Vriens