我使用此代码:
// $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)
非常感谢。
答案 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();
}
}
您可以看到处理所有方案非常麻烦。我希望我能告诉你,通过资源模型更容易做到这一点,但事实是在数据库中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();