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());
}
我建议使用带有示例数据的安装,并将不同数量的每种产品类型添加到购物车。基于此+上面代码的输出,您将在循环时看到多种方法和陷阱。当您遇到以下情况时,会出现令人困惑的情况:
-
Configurable items
- 对于每个选项,您都会将可配置产品作为一个项目and选项作为项目派生的简单产品。如果要显示可配置父级的总计数,则需要计算循环中的总可配置数量:
Code:
$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 Items
- 作为分组项目的一部分添加到报价中的简单产品与单独添加的简单项目以及它们可能所属的其他组是分开的。如果你想聚合这些,你可以像这样循环:
Code:
$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();
}
}
-
Bundle Items
- 捆绑产品报价项目由捆绑产品的一项和每个选项的单独简单产品项目表示。简单的产品项目具有针对它们存储的数量信息。简单项目有一个父项目 ID,它引用捆绑产品报价项目,就像可配置产品报价项目的子项目一样。
可以看到,处理所有场景是很麻烦的。我希望我能告诉你,通过资源模型来做到这一点更容易,但事实是在数据库中sales_flat_quote_item_option
表将数量信息存储在序列化数据列中,因此您需要将内容提取到 PHP 中才能使用它们(这是通过资源模型为您完成的)。
抱歉,这是一个很长的答案,但您可以看到,根据您的目录设置,您需要进行一些仔细的考虑和测试,以确保您已经涵盖了您的基础。
EDIT: 虽然我试图做到彻底,但我没有提到你应该调查sales_flat_quote_item
桌子。根据您的要求,您可以轻松地使用其中的数据来快速、优雅且高效地对实现显示要求所需的数据进行建模。