web-dev-qa-db-ja.com

イベントサブスクライバーを使用して、製品の最初のチェックアウト後に製品のカスタムフィールド値を変更する

' Event Subscriber 'を使用すると、チェックアウトの完了後に、注文から$orderおよび$itemsを取得できます。

$itemsから製品IDを取得し、製品のカスタムフィールド値を変更するにはどうすればよいですか?

シナリオ:製品の最初のチェックアウトを完了した後、製品のステータスを変更したい。

1
shanidkv

製品のステータスまたは製品バリエーションを本当に変更しますか?

_$items_はOrderItemの配列です。アイテムをループする場合、$purchasedEntity = $item->getPurchasedEntity();を使用して、単一アイテムの参照された購入済みエンティティを取得できます。最初のアイテムだけが必要な場合は、$purchasedEntity = $items[0]->getPurchasedEntity();のようにアクセスできます。 PurchasedEntityがProductVariationの場合、$product = $purchasedEntity->getProduct();を使用して製品を取得できます

製品のステータスを変更したい場合:

_$product->setUnpublished();
_

またはバリエーションの場合:

_$variation->setActive(false);
_

製品バリエーションにカスタムフィールドを設定する場合:

_$variation->set('your_custom_field_name', $value);
_

docs これは、デフォルトのcommerce2製品アーキテクチャーを使用することを前提としています。絶対に、ProductVariations以外の購入可能なエンティティをOrderItemから取得することは可能です。

1
Olaf Karsten