Magento, пользовательские добавить в корзину, обрабатывают не работу

ПЕРЕСМОТРЕННЫЙ ВОПРОС: Мы разыскали это к пользовательскому добавить в корзину метод. Я полностью пересмотрел вопрос.

Я работаю над сайтом, который использует Magento ver. 1.3.2.4 как его платформа электронной коммерции. Мы создали пользовательское, "Добавить в корзину" обрабатывают, который добавляет несколько объектов в корзину через запрос Ajax. После этого запроса некоторая постобработка сделана viw JavaScript в браузере прежде, чем перенаправить к странице "View Cart". 99% времени этот процесс, кажется, функционируют правильно в Firefox и Safari, но в IE8, сбоях процесса. При добавлении объекта в корзину, будучи перенаправленным к странице "Your Cart", корзина пуста.

Не все объекты на сайте добавляются через этот процесс Ajax. Эта проблема только происходит только, когда корзина пуста прежде, чем добавить объекты через Ajax. То есть, если объект, который добавляется через нормальный процесс Magento, добавляется к кошке сначала, затем Ajax добавить в корзину, запросы всегда успешно выполняются. Blu, очищающий cookie и затем пытающийся добавить через Ajax, последовательно перестанет работать на IE8.

Сервер является сервером Apache/PHP с PHP 5.2.9, eAccelerator и Suhosin. Запросите любую дополнительную информацию, и я буду рад обеспечить ее. Мы храним сессии в MySQL Database.

Вот является код для нашего пользовательского добавить в корзину методом. Этот код расположен в /app/code/core/Mage/Checkout/controllers/CartController.php:

public function ajaxaddAction()
{
    $result = array('success' => true);

    try
    {
        $session = $this->_getSession();
        $cart = $this->_getCart();

        $products = json_decode($_POST['products'],true);

        if(!is_array($products))
        {
            throw new Exception("Products data not sent");
        }

        foreach ($products as $product_data)
        {
            $product = $this->_initProduct($product_data['id']);

            if(!$product)
                throw new Exception("Product id {$product_data['id']} not found");

            $info = array('qty' => $product_data['qty']);

            if($product_data['options'])
                $info['options'] = $product_data['options'];

            $cart->addProduct($product,$info);
        }

        $cart->save();

        $this->_getSession()->setCartWasUpdated(true);

        /**
         * @todo remove wishlist observer processAddToCart
         */
        Mage::dispatchEvent('checkout_cart_add_product_complete',
            array('product' => $products[0], 'request' => $this->getRequest(), 'response' => $this->getResponse())
        );

        $cartItems = $cart->getQuote()->getAllItems();

        $result['cart'] = array();

        foreach($cartItems as $item)
            $result['cart'][] = json_decode($item->toJson());
    }
    catch (Mage_Core_Exception $e)
    {
        if ($this->_getSession()->getUseNotice(true)) {
            $this->_getSession()->addNotice($e->getMessage());
        } else {
            $messages = array_unique(explode("\n", $e->getMessage()));
            foreach ($messages as $message) {
                $this->_getSession()->addError($message);
            }
        }
        $result['success'] = false;
        $result['exception'] = $e->getMessage();
    }

   catch (Exception $e) {
        $this->_getSession()->addException($e, $this->__('Can not add item to shopping cart'));
        $result['success'] = false;
        $result['exception'] = $e->getMessage();
    }

    header('Content-Type: application/json',true);

    ob_end_clean();

    echo json_encode($result);

    exit();
}

Не отвечайте с "Перемещением на код к /app/code/local/ каталог". Я понимаю, что это - лучшее место для него и переместит его туда в будущее, но если Ваш ответ не решит проблему, просто добавьте комментарий. Для получения более быстрого ответа, я запускаю щедрость и хочу хорошие ответы на этот конкретный вопрос, не только подсказки относительно лучших способов интегрировать этот код.

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

5
задан Josh 5 March 2010 в 19:07
поделиться

3 ответа

Я потратил на это более 10 часов. На данный момент я считаю, что у меня есть частичное решение . Но я не уверен, почему это решение работает ...

Кажется, Magento требует перенаправления для завершения процесса добавления в корзину. Поэтому вместо

header('Content-Type: application/json',true);
ob_end_clean();
echo json_encode($result);
exit();

я сохраняю свой JSON в сеансе и перенаправляю на новое действие корзины:

$this->_getSession()->setCartJsonResult(json_encode($result));
$this->_redirect('checkout/cart/postajaxadd');

Затем это действие сбрасывает данные JSON

public function postajaxaddAction()
{
    $session = $this->_getSession();

    header('Content-Type: application/json',true);
    ob_end_clean();
    echo $this->_getSession()->getCartJsonResult();
    exit();
}

Иногда это все равно не удается ; однако теперь мой код JavaScript не получает ожидаемые данные JSON и может повторить запрос. Второй запрос оказывается успешным чаще, чем первый ... Однако бывают случаи, когда запросы AJAX терпят неудачу, несмотря ни на что.

4
ответ дан 14 December 2019 в 04:36
поделиться

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

1
ответ дан 14 December 2019 в 04:36
поделиться

Не уверен, что это вызывает проблемы, с которыми вы столкнулись, но лучший способ сделать ответ JSON - это использовать существующий "способ Magento / Zend".

Вместо:

header('Content-Type: application/json',true);

ob_end_clean();

echo json_encode($result);

exit();

Используйте:

$this->getResponse()->setHeader('Content-Type', 'application/json', true)->setBody(json_encode($result));
3
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: