Изменить параметры товара в корзине: последний товар не сохранен


Я хотел бы изменить некоторые параметры товаров, присутствующих в корзине.

На checkout_cart_add_product_complete.

Я запускаю следующую функцию:

 public function TreatShipConflicts($observer)
 {
    //Analyse du nouveau produit ajouté au panier

    $_cart = Mage::getModel('checkout/cart')->getQuote();
    $_items = $_cart->getAllItems(); 

    foreach ($_items as $_item) {

        $_options = $_item->getProduct()->getTypeInstance(true)->getOrderOptions($_item->getProduct());
        $Flag = 0;
        $optionid = 0;
        Mage::log("CART to be changed");
        foreach($_options["options"] as $_option) 
        {
            if ($_option['label'] == 'ShipMth')
            {
                $Flag = 1;
                $optionid = $_option['option_id'];
            }       
        }    
        Mage::log($optionid);
        if ($Flag == 1) {

        $optionnb = "option_".$optionid;

        $item22 = Mage::getSingleton('checkout/session')->getQuote()->getItemById($_item->getId());
        $options = $item22->getOptions();       

        foreach ($options as $option) {
            switch (true) {
                case ($option->getCode() == 'info_buyrequest') :
                    $unserialized = unserialize($option->getValue());
                    $unserialized['options'][$optionid] = 'TNT';
                    $option->setValue(serialize($unserialized));
                    break;
                case ($option->getCode() == $optionnb) :
                    $option->setValue('TNT');
                    break;
                }
        }
        $item22->setOptions($options)->save(); 
        Mage::getSingleton('checkout/cart')->save();
    }
 }  

}

Все мои товары изменены, КРОМЕ последнего (последнего добавленного в корзину, т.е. того, который вызвал событие)...

(Я был до запуска события checkout_cart_product_add_after, но прочитал в сообщении so, что элемент еще не был сохранен, а затем на этом шаге было невозможно настроить его параметры. Я затем изменен на checkout_cart_add_product_complete, (где на данный момент было сказано, что это действительно товар и действительно в корзине, но получил тот же результат..)

Спасибо вам за вашу помощь,

РЕДАКТИРОВАТЬ: Информация, которая, возможно, может помочь. Когда я добавляю свой первый товар в корзину (корзина пуста) (товар, который затем будет несохраненным), у меня появляется ошибка $options = $item22->getOptions();, что означает, что он явно не того же типа, что и другие...

ПРАВКА 2: все еще ищу... и нашел новую странную вещь: когда моя тележка в нем есть товары, и я удаляю последний добавленный товар (с несохраненными опциями), когда я добавляю новый товар в корзину, у меня та же ошибка, что и при первом редактировании! Если я удалю другой элемент (не последний), я могу добавить время без ошибки $options = $item22->getOptions();, но изменение параметра все еще не сохранено...

ПРАВКА3: Я проверил базу данных с помощью phpmyadmin, и в таблице "sales_flat_quote_item_option" все еще есть неизмененные значения параметров для последнего добавленного элемента

Author: Alexglvr, 2015-04-21

4 answers

Я не уверен, но я думаю, что вы должны получить последний элемент добавления таким образом:

$item = $observer->getQuoteItem();
 2
Author: SeStro, 2015-04-26 08:29:12

Как уже упоминал Себастьян, вам нужно будет использовать параметр $observer события, чтобы получить корзину и ее содержимое в текущем состоянии события. Поскольку использование синглтона Mage::getModel('checkout/cart')->getQuote(); вернет только сохраненное содержимое кавычек до того, как произойдет событие, в результате чего последний элемент (элемент, вызывающий наблюдателя) не будет иметь надлежащих параметров, как это происходит раньше collectTotals.

$quote = $observer->getEvent()->getQuote();
foreach ($quote->getAllItems() as $item) {
    $product = $item->getProduct();
}

Вы также можете попробовать наблюдать sales_quote_save_before ИЛИ позвонить, чтобы повторно собрать итоги.

$quote->setTotalsCollectedFlag(false)->collectTotals();
session_write_close();

Кроме того, избегайте вызов session и cart Mage::getModel поскольку $observer будет содержать необходимые вам данные без каких-либо непредвиденных проблем с повторной инициализацией.

Связанный:

 2
Author: B00MER, 2015-04-27 07:13:11

Я нашел решение для изменения последнего добавленного элемента (в событии checkout_cart_product_add_after):

Это глобально похоже на код, который я опубликовал, т.Е. Получение товаров в корзине с помощью

$_cart = Mage::getModel('checkout/cart')->getQuote();
$_items = $_cart->getAllItems(); 

Но если последний добавленный элемент необходимо изменить, вот способ:

$_quoteitem = $observer->getEvent()->getQuoteItem();
$buyRequest = $_quoteitem->getOptionByCode('info_buyRequest');
$buyRequestArr = unserialize($buyRequest->getValue());
$buyRequestArr['options'][$shipoptid] = 'TNT';
$buyRequest->setValue(serialize($buyRequestArr));

$optionship = $_quoteitem->getOptionByCode($shipoptcode);
$optionship['value']='TNT';

И пусть magento сохранит его!

Для других товаров (уже в корзине):

$item22 = Mage::getSingleton('checkout/session')->getQuote()->getItemById($_item->getId());
$options = $item22->getOptions();       

foreach ($options as $option) {
    switch (true) {
        case ($option->getCode() == 'info_buyrequest') :
            $unserialized = unserialize($option->getValue());
            $unserialized['options'][$optionid] = 'TNT';
            $option->setValue(serialize($unserialized));
            break;
        case ($option->getCode() == $optionnb) :
            $option->setValue('TNT');
            break;
        }
}
$item22->setOptions($options)->save(); 
Mage::getSingleton('checkout/cart')->save();

Если это может помочь...

 1
Author: Alexglvr, 2015-05-04 17:25:16

Я помню, как сидел над подобной проблемой раньше, однако моя была немного другой:

  1. добавить продукт 1 - параметры не обновлялись.
  2. добавить продукт 2 - обновлены параметры продукта 1.
  3. добавить продукт 3 - обновлены параметры продукта 2.
  4. и т.д.

Это всегда был последний элемент, который не обновлялся.

Мое решение было таким в конце перед сохранением корзины:

Mage::getSingleton('customer/session')->setCartWasUpdated(true);
$cart->save();

Где $cart - объект корзины Mage::getModel("checkout/cart");

Кроме того, для отладки в вашем случае я всегда рекомендую обернуть вашу логику в блоки try/catch в качестве хорошей практики. Любые возникшие исключения могут быть записаны в журнал, и их будет легче отлаживать.

А также отойдите от утверждений switch / case, вам лучше использовать if elseif and else. В вашем случае переключения есть только 2 варианта и нет значения по умолчанию, поэтому, если бы случайно произошел случай, когда код опции не соответствовал одному из ваших вариантов, значение опции никогда не было бы установлено, что также может быть проблемой. Чтобы убедиться на 100%, добавьте значение по умолчанию регистрируйте и регистрируйте выходные данные.

 0
Author: Shaughn, 2015-04-29 21:35:46