我正在以编程方式将名义产品添加到购物车中。但它抛出一个异常 'The stock item for Product is not valid.'. 。我该如何解决这个问题?

笔记 : $product 正确地传递给这个函数。

我的代码如下。

    /**
     * Add air product to the cart.
     */
    public function addSubscriptionToCart($product)
    {
        try {
            // Create cart instance.
            $cart = Mage::getModel('checkout/cart');

            // Initialize the cart.
            $cart->init();
            $cart->addProduct($product, array('product_id' => $product->getId(), 'qty' => 1)); // This line causes the error.
            $cart->save();

            return true;

        } catch(Exception $e) {
            Mage::log($e->getMessage());
            return false;
        }
    }
有帮助吗?

解决方案

解决了!,而不是将产品对象传递给产品 ID addProduct() 方法奏效了。请参阅下面更正后的代码。

    /**
     * Add air product to the cart.
     */
    public function addSubscriptionToCart($product)
    {
        try {
            // Create cart instance.
            $cart = Mage::getModel('checkout/cart');

            // Initialize the cart.
            $cart->init();
            $cart->addProduct($product->getId()); // pass product ID
            $cart->save();

            return true;

        } catch(Exception $e) {
            Mage::log($e->getMessage());
            return false;
        }
    }

其他提示

我遇到过同样的问题。但我使用另一个代码添加到购物车:

$quote = Mage::getSingleton('checkout/session')->getQuote();
$quote->addProduct($_product, 1);
$quote->collectTotals()->save();

我的问题出在错误的产品对象上。我通过属性“sku”加载它:

Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);

当我将其更改为简单加载时

Mage::getModel('catalog/product')->load($id);

然后错误就解决了。

所以问题出在 loadByAttribute 函数的“错误”产品对象中。

我知道这已经很老了,但是当我遇到这个问题时,我注意到在使用集合方法加载产品时:

$productCollection = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('some_attribute', array('eq' => $someValue)->load();

从上述集合加载产品时,该产品将具有仿制的stock_item (Varien_Object),而不是真实的stock_item (Mage_CatalogInventory_Model_Stock_item)。不幸的是,我见过从这里获取真实库存商品的唯一方法是从库存商品集合中加载它并将其设置在产品上:

$stockItem = Mage::getModel('cataloginventory/stock')->getItemCollection()->addFieldToFilter('product_id', array('eq' => $productId)); $product->setStockItem($stockItem);

或以老式方式重新加载产品:

$product = Mage::getModel('catalog/product')->load($productId);

许可以下: CC-BY-SA归因
scroll top