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


9

商品販売後の商品代金をユーザーに付与したい。

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

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

  • アクション:ループ(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 for parameter points is invalid。

どうすればできますか?


なぜこの状態が必要なのですか?
subhojit777 2013年

おそらくその理由は、チェックアウトが完了したときにcommerce-productがすでに範囲外であるためです(私にはわかりません)。値を印刷して、一度確認してください。
Gokul NK 2013

@Danieleは、製品を作成したユーザーにポイントを付与してもよろしいですか?
subhojit777 2013年

@ subhojit777はい。たとえば、ユーザークレジットとしてユーザーポイントを管理する場合。私は仮想製品を作成します。購入すると、実際の製品を購入するために必要なユーザーポイントが得られます。悲しいことに、commerce_creditsには、commerce_userpointsのような柔軟性と通貨の置き換えがありません。
Daniele Napolitano 2013年

@DanieleNapolitanoなぜその条件が必要なのですか?質問のルールコンポーネントに条件があります。
subhojit777 2013年

回答:


5

最初はrulesuserpointsモジュールを使用して質問に答えようとしましたが、アクションとして付与ポイントをユーザーに追加するときに、製品を作成したユーザーを選択するためのそのようなデータセレクターがないことがわかりました。注文の所有者であるユーザーを選択するためのデータセレクターを見つけましたが、それは要件ではありません。(それが私がコメントでこれを明確にした理由です)。

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

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

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

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

YOURMODULE.infoファイル:

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

更新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);
    }
  }
}

参照リンク:

userpoints_userpointsapi($ params)

commerce_checkout API

commerce_line_item_load($ line_item_id)

commerce_product_load($ product_id)

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

commerce_currency_amount_to_decimal()


素晴らしい解決策、それは重宝するでしょう。1つの小さな変更を提案できますか?field_get_items()を取得するにはを使用した方がよいでしょう。これにより$order->commerce_line_items、多言語サイトでも動作します
Clive

@Cliveの提案に感謝します。しかし、これまでfield_get_item()を使用したことがありません。この使用法を学び、この回答に適用する必要があります。少し時間が必要です:)
subhojit777 2013年

0

カスタムコードを必要とする以前の回答の代わりに、そのエラーメッセージを回避するために、以下で説明する別の方法を試してみてください...

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

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

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

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

PS 2:あなたの質問はD7に関するものだと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.