Magento 2: Aktualizacja elementu oferty

10

Próbuję zaktualizować wycenę przedmiotu w Magento2. Ale za każdym razem, gdy zapisuję element, tworzę nowy element z tym samym identyfikatorem cytatu, zamiast go aktualizować. Oto mój kod

    public function __construct(
            \Magento\Quote\Model\QuoteRepository $quoteRepo
        ){
            $this->_quoteRepo = $quoteRepo;
        }

public function updateItem(){
    $quote = $this->_quoteRepo->get('id here');
    foreach($quote->getAllVisibleItems() as $itemq){
    $itemq->setQty(5);
    $itemq->setPrice(20);
    $itemq->save();
    }
 }

Ale za każdym razem, gdy zapisujesz element ... generowany jest nowy element. Nie wiem dlaczego. Również I couldn't find any class which explicitly load qoute item in magento2. Pomoc będzie mile widziana.

W tym pytaniu /magento/139298/how-to-save-quote-items-in-magento-2ustawiają cały produkt ... nie próbując go aktualizować. Po ustawieniu produktu z pewnością wygeneruje się nowy element oferty. Ale dlaczego robi to samo w przypadku aktualizacji.

Kingshuk Deb
źródło
2
Możliwy duplikat zapisywania przedmiotów w Magento 2
Ankit Shah
1
Nie tak samo Zredagowałem swoje pytanie. @AnkitShah sprawdź.
Kingshuk Deb
Dla Magento 2.2+ patrz to - magento.stackexchange.com/a/182152/4492
Rohan Patil

Odpowiedzi:

16

Nie jestem pewien co do mojego poniższego rozwiązania:

  • Może być konieczne załadowanie obiektu cytatu według identyfikatora produktu
  • Jeśli chcesz ustawić cenę, a następnie używając setPrice () , nie możesz ustawić żądanej ceny dla tego elementu koszyka
$item = $quote->getItemById($item->getId());
if (!$item) {
  continue;
}
$item->setQty((double) $qty);
$item->setCustomPrice($price);
$item->setOriginalCustomPrice($price);
$item->getProduct()->setIsSuperMode(true);
$item->save(); 
Amit Bera
źródło
1
jak zaktualizować dodatkowe opcje
sivakumar
cześć @Amit, Jak zaktualizować wartość podatku dla przedmiotu? Czy możemy ustawić niestandardową kwotę podatku dla pojedynczej pozycji wyceny?
jafar pinjar
2

Funkcjonalność, o którą pytasz, jest już gotowa, w Magento\Checkout\Controller\Cart\UpdatePost trakcie której aktualizujemy koszyk na stronie koszyka w Magento. Działa updateItems()funkcja Magento\Checkout\Model\Cartaktualizacji pozycji w quote_itemtabeli. Przyjmuje parametr w postaci tablicy $data ['item id of product']['attribute you want to update'].

Możesz więc wywołać updateItems()obiekt modelu wózka i odpowiednio przekazać dane, aby zaktualizować przedmioty. Jeśli nie otrzymujesz identyfikatora przedmiotu, możesz go uzyskać, $this->cart->getQuote()->getAllItems()a następnie wywołać getItemId()każdy przedmiot.

Vivek Kumar
źródło