Друпал 9, Друпал Коммерс 2.26
У меня есть подписчик событий, слушающий CartEvents.. в частности, CartEvents::CART_ORDER_ITEM_UPDATE
У меня есть продукты одного типа, которые ссылаются на продукты другого типа.
Цель состоит в том, чтобы когда пользователь обновляет элемент заказа для продукта типа «класс» в корзине, элемент заказа для соответствующего количества material_kit обновляется, чтобы соответствовать.
У меня есть подписчики на похожие события, которые позволяют мне создавать соответствующий элемент заказа, когда продукт добавляется в корзину, или когда элемент заказа удаляется, соответствующий элемент заказа также удаляется. Не работает только обновление количества для соответствия обновлений другому.
Событие срабатывает, как и ожидалось.Поток выполнения проходит через условные выражения, обновляет количество 2-го элемента строки, но обновленное количество никогда не отражается. Как будто этого никогда не было.
Я мог бы удалить и воссоздать новую позицию заказа для продукта, но предпочел бы этого не делать и хочу понять, что происходит.
Итак, как обновить количество другой позиции заказа, когда количество позиции заказа обновляется в корзине?
/**
* Управление указанным количеством комплекта материалов при изменении количества продукта класса
*
* @param \Drupal\commerce_cart\Event\CartOrderItemUpdateEvent $event
* Корзина событий.
*/
публичная функция onCartOrderItemUpdate (CartOrderItemUpdateEvent $event) {
$order_item = $event->getOrderItem();
$product_variation = $order_item->getPurchasedEntity();
$productType = $product_variation->get('type')[0]->get('target_id')->getValue();
если ($ productType == 'класс') {
$class_quantity = $order_item->getQuantity();
$корзина = $event->getCart();
$product = $product_variation->getProduct();
$material_kit_field_value = $product->get('field_material_fees')->getValue();
if (!empty($material_kit_field_value[0]['target_id']) && пусто($payable_to_instructor[0]['value'])) {
$material_kit_product = Product::load($material_kit_field_value[0]['target_id']);
если (!пусто($material_kit_product)) {
$material_kit_variations = $material_kit_product->getVariations();
$material_kit_variation_id = $material_kit_variations[0]->id();
foreach ($cart->getItems() as $key => $oi) {
$pv = $oi->getPurchasedEntity();
$pt = $pv->get('type')[0]->get('target_id')->getValue();
если ($pt == 'material_kit') {
если ($pv->id() == $material_kit_variation_id) {
// поток выполнения попадает сюда, но обновленное количество не "прилипает"
$oi->setQuantity($class_quantity);
$this->cartManager->updateOrderItem($cart, $oi);
// почему не работает обновление позиции заказа? ^^
}
}
}
}
}
}
}