商品販売後の商品代金 ユーザーポイント を商品オーナーに付与したい。
このために、私は以下のようにルールを定義しました:
イベント:チェックアウトプロセスの完了
アクション:ループ(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が無効です。
どうすればできますか?
最初は 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_line_item_load($ line_item_id)
カスタムコードを必要とする以前の回答の代わりに、以下で説明する代替策を試して、そのエラーメッセージを回避することもできます...
あなたの質問は、「 ユーザーのユーザーポイントを特定のフィールドの値/計算された値と同じにする方法 」の質問のバリエーション(重複ではない)のようです。その質問に対する受け入れられた回答と同様に、次のようにルールコンポーネントを適応させてください。
エラーの原因となるルールコンポーネントのルールアクションの前に、これらの追加のルールアクションを追加します。
commerce-line-item:commerce-product:commerce-price:amount
。その変数に名前を付けたとしましょうprice_amount
。price_amount
変数からintegerへ。その変換結果に名前を付けたとしましょうamount_of_points
。amount_of_points
。PS 1:このような「データ型の変換」は、単にルールがどのように機能するか(設計上)の問題であるため、バグとは見なされません...
PS 2:あなたの質問はD7についてだと思います。