Magento - Добавление товаров в корзину с помощью цикла - PullRequest
1 голос
/ 19 мая 2011

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

    public function indexAction() {
    $ids = explode(',', $this->getRequest()->getParam('products'));

    Mage::log('ADDING PRODUCTS');

    $cart = Mage::getModel('checkout/cart');
    $cart->init();

    $pModel = Mage::getSingleton('catalog/product');

    //$cart->addProductsByIDs($ids);

    foreach ($ids as $id) {

        Mage::log('Loading: ' . $id);

        $product = $pModel->load($id);

        Mage::log('Loaded: ' . $product->getId());

        try {
            $cart->addProduct($product, array('qty' => '1'));
        } catch (Exception $e) { 
            Mage::log($e);
            continue; 
        }
    }

    $cart->save();

    if ($this->getRequest()->isXmlHttpRequest()) {
        exit('1');
    }

    $this->_redirect('checkout/cart');
}

Я вижу в system.log, что он правильно загружает продукты. Но после перенаправления у меня есть второй продукт в моей корзине дважды. Первый отсутствует. Использование $ cart-> addProductsByIDs ($ ids) прекрасно работает, но тогда я больше не могу влиять на количество продуктов.

Кто-то знает, что я делаю неправильно, и дает мне подсказку?

Thx

Ответы [ 2 ]

3 голосов
/ 22 мая 2011

У меня была такая же проблема, и я исправил ее, загрузив модель продукта в каждом цикле:

public function AddMultipleItemsAction() {
    $products = explode(',', $this->getRequest()->getParam('products'));
    $quantities = explode(',', $this->getRequest()->getParam('quantities'));
    $numProducts = count($products);
    $cart = $this->_getCart();
    for($i=0;$i<$numProducts;$i++) {
        $product_id = $products[$i];
        $quantity = $quantities[$i];
        if ($product_id == '') continue;
        if(!is_numeric($quantity) || $quantity <= 0) continue;
        $pModel = Mage::getModel('catalog/product')->load($product_id);
        if($pModel->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_SIMPLE) {
            try {
                $eventArgs = array(
                    'product' => $pModel,
                    'qty' => $quantity,
                    'additional_ids' => array(),
                    'request' => $this->getRequest(),
                    'response' => $this->getResponse(),
                );
                Mage::dispatchEvent('checkout_cart_before_add', $eventArgs);
                $cart->addProduct($pModel, array('product'=>$product_id,'qty' => $quantity));
                Mage::dispatchEvent('checkout_cart_after_add', $eventArgs);
                Mage::dispatchEvent('checkout_cart_add_product', array('product'=>$pModel));
                $message = $this->__('%s was successfully added to your shopping cart.', $pModel->getName());
                Mage::getSingleton('checkout/session')->addSuccess($message);
            } catch (Mage_Core_Exception $e) {
                if (Mage::getSingleton('checkout/session')->getUseNotice(true)) {
                    Mage::getSingleton('checkout/session')->addNotice($pModel->getName() . ': ' . $e->getMessage());
                }
                else {
                    Mage::getSingleton('checkout/session')->addError($pModel->getName() . ': ' . $e->getMessage());
                }
            } catch (Exception $e) {
                Mage::getSingleton('checkout/session')->addException($e, $this->__('Can not add item to shopping cart'));
            }
        }
    }
    $cart->save();
    $this->_getSession()->setCartWasUpdated(true);
    $this->_redirect('checkout/cart');
}

Затем у меня есть кнопка «Добавить все товары в корзину», которая выполняет следующий Javascriptкод:

<script type="text/javascript">
function addAllItemsToCart() {
    productsArr = new Array();
    quantitiesArr = new Array();
    $$('#product-listing-table .qty').each(
        function (input, index) {
            productsArr[index] = encodeURIComponent(input.readAttribute('product_id'));
            quantitiesArr[index] = encodeURIComponent(input.value);
        }
    );
    var url = '/MyModule/Cart/AddMultipleItems/products/'+productsArr.join(',')+'/quantities/'+quantitiesArr.join(',')+'/';
    setLocation(url);
}


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

<input type="text" size="2" product_id="<?php echo $_product->getId();?>" name="productqty_<?php echo $_product->getId();?>" class="qty" />

и весь список продуктов находится внутри div с идентификатором product-list-table

1 голос
/ 19 мая 2011

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

$cart->addProduct($product, array(
    'qty'     => 1,
    'product' => $product->getId(),
    'uenc'    => Mage::helper('core')->urlEncode(Mage::helper('core/url')->getCurrentUrl())
));

// Also make sure we know that the cart was updated
Mage::getSingleton('checkout/session')->setCartWasUpdated(true);

Тем не менее, ваша ошибка не выглядит так, как будто у вас действительно возникают проблемы в этой области. Я не могу себе представить, что это так, но возможно ли, что модель корзины должна быть save() d каждый раз, когда вы добавляете товар в корзину? Это стоит денег.

...