Magento 2: Обновление цитаты

10

Я пытаюсь обновить пункт цитаты в magento2. Но каждый раз, когда я сохраняю элемент, он создает новый элемент с тем же идентификатором цитаты, а не обновляет его. Вот мой код

    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();
    }
 }

Но каждый раз при сохранении элемента ... создается новый элемент. Не знаю почему. Также I couldn't find any class which explicitly load qoute item in magento2. Помощь будет оценена.

В этом вопросе /magento/139298/how-to-save-quote-items-in-magento-2они задают весь продукт ... не пытаясь обновить его. Когда вы устанавливаете продукт, обязательно сгенерируется новый элемент цитаты. Но почему он делает то же самое в случае обновления.

Кингшук Деб
источник
2
Возможный дубликат Как сохранить элементы цитаты в magento 2
Анкит Шах
1
Не то же самое. Я отредактировал свой вопрос. @ AnkitShah, пожалуйста, проверьте.
Кингшук Деб
Для Magento 2.2+ см. Это - magento.stackexchange.com/a/182152/4492
Рохан Патил

Ответы:

16

Я не уверен насчет моего решения ниже:

  • Может быть, вам нужно загрузить объект цитаты по номеру товара
  • Поскольку вы хотите установить цену, то с помощью setPrice () вы не можете установить желаемую цену для этого элемента корзины.
$item = $quote->getItemById($item->getId());
if (!$item) {
  continue;
}
$item->setQty((double) $qty);
$item->setCustomPrice($price);
$item->setOriginalCustomPrice($price);
$item->getProduct()->setIsSuperMode(true);
$item->save(); 
Амит Бера
источник
1
как обновить дополнительные опции
sivakumar
Привет @Amit, Как обновить taxAmount для элемента? Можем ли мы установить индивидуальную сумму налога для отдельного элемента цитаты?
Джафар Пинджар
2

Функциональность, о которой вы спрашиваете, уже выполнена, Magento\Checkout\Controller\Cart\UpdatePost которая выполняется, когда мы обновляем корзину на странице корзины magento. Он запускает updateItems()функцию Magento\Checkout\Model\Cartобновления элементов в quote_itemтаблице. Он принимает параметр в виде массива $data ['item id of product']['attribute you want to update'].

Таким образом, вы можете вызвать updateItems()объект модели корзины и передать данные соответствующим образом для обновления элементов. Также, если вы не получаете идентификатор элемента, вы можете получить его как, $this->cart->getQuote()->getAllItems()а затем вызвать getItemId()каждый элемент.

Вивек Кумар
источник