カートに商品を追加すると、「商品の在庫アイテムが無効です」というエラーが発生しますか?


7

名目上の商品をプログラムでショッピングカートに追加しています。しかし、それは例外をスローします'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;
        }
    }

回答:


13

解決しました!、製品オブジェクトの代わりに、製品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;
        }
    }

Fatal error: Uncaught TypeError: Argument 1 passed to Mage_Sales_Model_Quote::addProduct() must be an instance of Mage_Catalog_Model_Product, string given, called in
OZZIE 2018

1

同じ問題がありました。しかし、私はカートに追加するために別のコードを使用していました:

$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関数による「間違った」製品オブジェクトに問題がありました。


ああ、これも私の問題でした!説明をありがとう:3
Keenora Fluffball

0

私はこれがかなり古いことを知っていますが、この問題に遭遇したとき、コレクションメソッドを使用して製品をロードしているときに気づきました。

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

上記のコレクションから製品をロードしている間、製品には実際のstock_item(Mage_CatalogInventory_Model_Stock_item)ではなく、模倣のstock_item(Varien_Object)が含まれます。残念ながら、ここから実際の在庫アイテムを取得する唯一の方法は、在庫アイテムコレクションからロードして、商品に設定することです。

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

または、昔ながらの方法で製品をリロードします。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.