Magento:获取特定产品的购物车数量

时间:2011-11-28 13:47:31

标签: magento

我使用此代码:

// $items = Mage::getModel('checkout/cart')->getQuote()->getAllItems();
$items = Mage::getSingleton('checkout/session')->getQuote()->getAllItems();
 
foreach($items as $item) {
    echo 'ID: '.$item->getProductId().'<br />';
    echo 'Name: '.$item->getName().'<br />';
    echo 'Sku: '.$item->getSku().'<br />';
    echo 'Quantity: '.$item->getQty().'<br />';
    echo 'Price: '.$item->getPrice().'<br />';
    echo "<br />";
}

获取有关购物车中产品的信息。

如何只获得给定产品的数量(productId)

非常感谢。

4 个答案:

答案 0 :(得分:40)

tl; dr:这个问题的答案根据产品类型(可配置,简单等)的复杂程度而有所不同。 这可能会推动您设置目录的方式并设置简单的产品能见度。如果目录中的所有内容都是简单的项目,则此任务非常简单。另外:请参阅编辑结束。

有很多场景需要考虑。例如,如果您将可配置项添加到购物车,则报价将为每个选项提供两个报价项:可配置父产品的一个报价项,其中包含选项数量信息,一个报​​价项将提供选项的简单产品数据。捆绑项目将具有父捆绑项目以及每个捆绑选项的简单项目。

归结为您需要决定如何向用户表示每种产品类型的数量;例如,您是否希望将相同型号的衬衫表示为具有所有尺寸数量的一个订单项,或者您是否希望将这些尺寸分开(后者是Magento如何在购物车/评论区域中呈现它们)。

我建议您将产品添加到购物车,然后在前端使用此产品查看报价项数据:

<?php

include 'app/Mage.php';
Mage::setIsDeveloperMode(true);

Mage::app(); // Mage_Core_Model_App

Mage::getSingleton('core/session', array('name'=>'frontend'));

$quote = Mage::helper('checkout/cart')->getCart()->getQuote();

echo count($quote->getItemsCollection());
foreach ($quote->getItemsCollection() as $item){
    Zend_Debug::dump($item->debug());
}

我建议使用带有示例数据的安装,并将每种产品类型的不同数量添加到购物车。基于此+上述代码的输出,您将看到在循环时有几种方法和陷阱。混杂的情况是你有以下几点:

  • 可配置项
    • 对于每个选项,您都可以将可配置产品作为项目从中导出选项作为项目的简单产品。如果要显示可配置父级的总计数,则需要计算循环中的总可配置数量:

代码:

$configurables = array();

// ...then, inside your foreach
if($item->getProductType() === 'configurable'){
    if(isset($configurables[$item->getProductId()])){
        //add to the other options' quantity
        $configurables[$item->getProductId()] += $item->getQty();
    }
    else {
        $configurables[$item->getProductId()] = $item->getQty();
    }
}
  • 分组项目
    • 作为分组项目的一部分添加到报价中的简单产品与单独添加的简单项目以及它们可能属于的其他组别分开。如果你想聚合这些,你可以这样循环:

代码:

$grouped = array();

// ...then, inside your foreach
if($item->getProductType() === 'grouped' || $item->getProductType() === 'simple'){
    if(isset($grouped[$item->getProductId()])){
        //add to the other options' quantity
        $grouped[$item->getProductId()] += $item->getQty();
    }
    else {
        $grouped[$item->getProductId()] = $item->getQty();
    }
}
  • 捆绑商品
    • 捆绑产品报价项目由捆绑产品的一个项目表示,并为每个选项分别显示简单的产品项目。简单的产品项目具有针对它们存储的数量信息。简单项目具有父项目ID,它引用回捆绑产品报价项目,就像可配置产品报价项目的子项目一样。

您可以看到处理所有方案非常麻烦。我希望我能告诉你,通过资源模型更容易做到这一点,但事实是在数据库中sales_flat_quote_item_option表将数量信息存储在一系列序列化数据中,所以你需要把东西放进去PHP可以随身携带(通过资源模型为您完成)。

对不起,这是一个很长的答案,但你可以看到,根据你的目录设置,你需要仔细考虑和测试,以确保你已经覆盖你的基地。

编辑: 在尝试彻底时,我没有提及您应该查看sales_flat_quote_item表。根据您的要求,您可以轻松地使用其中的数据快速,优雅,高效地建模您满足显示要求所需的数据。

答案 1 :(得分:3)

试试这个:

// if you don't have the product object already...
$_product = Mage::getModel('catalog/product')->load($productid);

$_quote = Mage::getSingleton('checkout/session')->getQuote();
$_item = $_quote ? $_quote->getItemByProduct($_product) : false;
$qty = $_item ? $_item->getQty() : 0;

答案 2 :(得分:0)

你可以尝试:

$quote = Mage::getSingleton('checkout/session')->getQuote();
$item = Mage::getModel('sales/quote_item')->getCollection()
                ->addFieldToFilter('quote_id', $quote->getId())
                ->addFieldToFilter('product_id', $productId)
                ->getFirstItem();
//to get the quantity: $item->getQty();

答案 3 :(得分:0)

你应该使用

setQUote
调用集合时的

方法。应该是这样的

$quote = Mage::getModel('sales/quote')->load($quote_id);
$salesQuoteItem = Mage::getModel('sales/quote_item')->getCollection()
            ->setQuote($quote)
            ->addFieldToFilter('quote_id', $quote_id)
            ->addFieldToFilter('product_id', $data['product_id'])
            ->getFirstItem();