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

Biz*_*oss 11 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 />";
}
Run Code Online (Sandbox Code Playgroud)

获取有关Cart中产品的信息.

我怎样才能获得给定产品的数量(productId)

非常感谢.

ben*_*rks 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());
}
Run Code Online (Sandbox Code Playgroud)

我建议使用带有样本数据的安装,并将每种产品类型的不同数量添加到购物车.基于此+上述代码的输出,您将看到在循环时有几种方法和陷阱.混淆的场景是你有以下内容:

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

码:

$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();
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 分组项目
    • 作为分组项目的一部分添加到报价中的简单产品与单独添加的简单项目和它们可能属于的其他组别分开.如果你想聚合这些,你可以像这样循环:

码:

$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();
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 捆绑物品
    • 捆绑产品报价项目由捆绑产品的一个项目和每个选项的单独的简单产品项目表示.简单的产品项目具有针对它们存储的数量信息.简单项目具有父项目ID,它引用回捆绑产品报价项目,就像可配置产品报价项目的子项目一样.

您可以看到处理所有方案非常麻烦.我希望我能告诉你,通过资源模型更容易实现这一点,但事实是,在数据库中,sales_flat_quote_item_option表将数量信息存储在一系列序列化数据中,因此您需要将内容输入PHP以获取任何位置它们(通过资源模型为您完成).

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

编辑: 虽然试图彻底,我没有提到你应该看看sales_flat_quote_item表.根据您的要求,您可以轻松地使用其中的数据快速,优雅,高效地建模您实现显示要求所需的数据.