Drupal 9, Drupal Commerce 2.26
Am un abonat la eveniment, care ascult CartEvents .. în special CartEvents::CART_ORDER_ITEM_UPDATE
Am produse de un tip care fac referire la produse de alt tip.
Scopul este când utilizatorul actualizează articolul de comandă pentru produsul de tip „clasă” din coș, articolul de comandă pentru cantitatea material_kit potrivită este actualizat pentru a se potrivi.
Am abonați la evenimente similare, care îmi permit să creez un articol de comandă potrivit atunci când un produs este adăugat în coș sau când un articol de comandă este eliminat, articolul de comandă potrivit este, de asemenea, șters. Nu funcționează doar actualizarea cantității pentru a potrivi actualizările cu alta.
Evenimentul se declanșează conform așteptărilor.Fluxul de execuție trece prin condiționale, actualizează cantitatea celui de-al doilea articol rând, dar cantitatea actualizată nu este niciodată reflectată. E ca și cum nu s-ar fi întâmplat niciodată.
Aș putea elimina și recrea un nou articol de comandă pentru produs, dar aș prefera să nu o fac și vreau să înțeleg ce se întâmplă.
Deci, cum să actualizezi cantitatea unui alt articol de comandă, atunci când cantitatea unui articol de comandă este actualizată în coș?
/**
* Gestionați cantitatea de kit de materiale de referință la schimbarea cantității de produs de clasă
*
* @param \Drupal\commerce_cart\Event\CartOrderItemUpdateEvent $event
* Evenimentul cărucior.
*/
funcția publică onCartOrderItemUpdate(CartOrderItemUpdateEvent $event) {
$order_item = $event->getOrderItem();
$variatie_produs = $articol_comanda->getPurchasedEntity();
$productType = $product_variation->get('tip')[0]->get('target_id')->getValue();
if ($productType == 'clasa') {
$class_cantity = $comanda_articol->getQuantity();
$cart = $event->getCart();
$produs = $variație_produs->getProduct();
$material_kit_field_value = $produs->get('field_material_fees')->getValue();
dacă (!empty($material_kit_field_value[0]['target_id']) && empty($payable_to_instructor[0]['value'])) {
$material_kit_product = Product::load($material_kit_field_value[0]['target_id']);
dacă (!gol ($material_kit_product)) {
$material_kit_variations = $material_kit_product->getVariations();
$material_kit_variation_id = $material_kit_variations[0]->id();
foreach ($cart->getItems() ca $key => $oi) {
$pv = $oi->getPurchasedEntity();
$pt = $pv->get('type')[0]->get('target_id')->getValue();
dacă ($pt == 'kit_material') {
if ($pv->id() == $material_kit_variation_id) {
// fluxul de execuție ajunge aici, dar cantitatea actualizată nu se „lipește”
$oi->setQuantity($clasa_cantitate);
$this->cartManager->updateOrderItem($cart, $oi);
// de ce nu funcționează actualizarea articolului de comandă? ^^
}
}
}
}
}
}
}