web-dev-qa-db-ja.com

コマース製品の価格に等しいユーザーポイントを付与するにはどうすればよいですか?

商品販売後の商品代金 ユーザーポイント を商品オーナーに付与したい。

このために、私は以下のようにルールを定義しました:

  • イベント:チェックアウトプロセスの完了

  • アクション:ループ(commerce-order:commerce-line-items

また、ルールコンポーネントを次のように定義しました。

  • 条件:エンティティにフィールドがあります(エンティティ:commerce-line-item、フィールド:commerce_product

  • アクション:ユーザーへのポイントの付与:(ユーザー:commerce-line-item:commerce-product:creator、ポイント:commerce-line-item:commerce-product:commerce-price:amount

しかし、コンポーネントを保存すると、次のエラーメッセージが生成されます。

パラメータポイントのデータセレクタcommerce-line-item:commerce-product:commerce-price:amountが無効です。

どうすればできますか?

9
user1468966

最初は rules および serpoints モジュールを使用して質問に回答しようとしましたが、Grant points to a userアクションとして、製品を作成したユーザーを選択するためのそのようなデータセレクターはありません。注文の所有者であるユーザーを選択するためのデータセレクターを見つけましたが、それは要件ではありません。 (それが私がコメントでこれを明確にした理由です)。

あなたの質問に対するモジュールソリューションを見つけました。モジュールは hook_commerce_checkout_complete() を使用します。フックページから:

注文のチェックアウトが完了したときに、モジュールがビジネスロジックを実行できるようにします。

このフックは、「顧客がチェックアウトを完了する」イベントと同時に発生します。注文ステータスの更新、注文のユーザーアカウントへの割り当て、通知メールの送信など、ビジネスロジックのみを実行する必要があります。代わりに、ユーザーとの対話は、チェックアウト完了ページのチェックアウトペインを介して行われる必要があります。

これは私が設計したモジュールのコーディングです:

YOURMODULE.infoファイル:

name = YOURMODULE
description = Module description
dependencies[] = commerce
dependencies[] = commerce_cart
dependencies[] = commerce_checkout
dependencies[] = userpoints
core = 7.x

[〜#〜] update [〜#〜]Clive で示唆されているように、モジュールファイルを変更して、カスタムモジュールは、多言語サイトでも機能します。

YOURMODULE.moduleファイル:

/**                                                                             
 * Implements hook_commerce_checkout_complete().                                
 */                                                                             
function YOURMODULE_commerce_checkout_complete($order) {
  // Iterate through every commerce line item added in product.
  foreach (field_get_items('commerce_order', $order, 'commerce_line_items') as $line_item_id) {

    // Load commerce line item by line item id.
    $line_item = commerce_line_item_load($line_item_id['line_item_id']);

    // We do not want to include shipping cost in userpoints.
    if ($line_item->type != 'shipping') {
      // Load commerce product by product id.
      $product = commerce_product_load(field_get_items('commerce_line_item', $line_item, 'commerce_product')[0]['product_id']);

      // Create parameters.
      $params = array(
        'uid' => $product->uid,
        'points' => commerce_currency_amount_to_decimal(field_get_items('commerce_line_item', $line_item, 'commerce_total')[0]['amount'], field_get_items('commerce_line_item', $line_item, 'commerce_total')[0]['currency_code']),
      );

      // Grant userpoints programmatically.
      userpoints_userpointsapi($params);
    }
  }
}

参照リンク:

serpoints_userpointsapi($ params)

commerce_checkout API

commerce_line_item_load($ line_item_id)

commerce_product_load($ product_id)

serpoints:プログラムでポイントを差し引く

commerce_currency_amount_to_decimal()

5
subhojit777

カスタムコードを必要とする以前の回答の代わりに、以下で説明する代替策を試して、そのエラーメッセージを回避することもできます...

あなたの質問は、「 ユーザーのユーザーポイントを特定のフィールドの値/計算された値と同じにする方法 」の質問のバリエーション(重複ではない)のようです。その質問に対する受け入れられた回答と同様に、次のようにルールコンポーネントを適応させてください。

  1. エラーの原因となるルールコンポーネントのルールアクションの前に、これらの追加のルールアクションを追加します。

    • Set a variable製品価格の金額」に対応します(質問のとおり)commerce-line-item:commerce-product:commerce-price:amount。その変数に名前を付けたとしましょうprice_amount
    • Convert data type そのprice_amount変数からintegerへ。その変換結果に名前を付けたとしましょうamount_of_points
  2. 付与されるユーザーポイントの数がこれを使用するように(そのルールコンポーネント内の)既存のルールアクションを調整します(計算+変換)amount_of_points

PS 1:このような「データ型の変換」は、単にルールがどのように機能するか(設計上)の問題であるため、バグとは見なされません...

PS 2:あなたの質問はD7についてだと思います。

0
Pierre.Vriens