web-dev-qa-db-ja.com

Drupal 8、コマース2カスタム製品、バリエーションおよび注文アイテム

Commerce 2でカスタム製品を作成しようとしています。具体的には、購入可能な製品を構築するためのカスタムUIを顧客に提供しようとしています。

単一の製品とそのバリエーションを作成して、価格やその他のフィールドを調整できると思いました。プログラムでカスタムOrderItemを作成し、必要に応じてすべてのカスタムフィールドを設定して、アイテムをカートに追加できるようです。どうやらこれは期待どおりに動作します。

しかし、私はOrderItemのカスタム価格セットを取得する際に問題があります。すべての実用的な目的で同じであっても、注文したアイテムごとに個別のProductVariationを作成する必要があるようです。価格だけが異なるデータです。ここで説明を使用してみました( http://docs.drupalcommerce.org/v2/recipes/orders.html )。

$order_item = \Drupal\commerce_order\Entity\OrderItem::create([
  'type' => 'custom_order_item_type',
  'purchased_entity' => $variation_red_medium,
  'quantity' => 2,
  'unit_price' => $variation_red_medium->getPrice(),
]);
$order_item->save();

Unit_priceを空のままにしておくと、後で設定されるため、TypeErrorが発生します。Drupal\ commerce_order\Entity\OrderItem :: setUnitPrice()に渡される引数1は、Drupal\commerce_price\Priceのインスタンスでなければならず、/ var /でnullが呼び出されますwww/drupalvm/web/modules/contrib/commerce/modules/order/src/OrderRefresh.php(143行目)

私はこれをやろうとしています:

// You can also set the price with setUnitPrice.
$unit_price = new \Drupal\commerce_price\Price('9.99', 'USD');
$order_item->setUnitPrice($unit_price);
$order_item->save();

これを機能させる唯一の方法は、ProductVariationの価格を個別に設定することでしたが、これにより、製品ページの基本価格が更新されます。

ドキュメントでは、これは言う:

 * adjustments [OPTIONAL] - [Array(Drupal\commerce_order\Adjustment)]
 *   Array of any price adjustments.

しかし、不足している価格のためにOrderItemの作成が失敗するため、ここまでは取得できません。価格を設定すると、最初のProductVariationから上書きされます。

これらのProductVariationsをオンザフライで作成することでこれを回避できると思いますが、この単一の購入以外には何も必要ないので避けたいと思います。

だから私は動的な製品を実行する方法についてのいくつかの指示を探していると思います。 PurchasableEntityを最初に試しましたが、まったく機能せず、ProductBundleなどから自分のニーズをリバースエンジニアリングできませんでした。

または、ProductVariationとは別にOrderItem価格を設定する方法についての情報。

乾杯、

ジャンヌ

2
JanneS

単価を設定するときは、オーバーライドパラメータをtrueに設定する必要があります。

$unit_price = new \Drupal\commerce_price\Price('9.99', 'USD');
$order_item->setUnitPrice($unit_price, TRUE);
$order_item->save();
2
Gareth Dylan

私はこれを自分で調べ始めたところです。理想的には、管理ユーザーが任意の注文アイテムの単価フィールドと合計価格フィールドを直接編集できるようにしたいと考えています。 (一括注文の場合、10,000.01ドルのような奇妙な合計価格を避けたい場合は、単価を掛けて価格を適切に設定する方法がありません。)

製品のバリエーション価格とは別に価格を設定するのに役立つと思われることが1つわかったところです。カスタム価格のオーバーライドを引き起こすのは、「注文の更新」に関するものです。 (Drupal\commerce_order\OrderRefresh :: refresh())。また、注文の更新は注文がドラフト状態のときにのみ発生するため、注文を別の状態に移行する場合、上書きされることなく単価を手動で編集できます。

検証ワークフローを使用する場合、注文の状態を下書きから検証に変更するとすぐにカスタム価格を設定できます(または独自のカスタムワークフローを作成できます)。

0
user72086