【发布时间】:2014-07-01 20:44:11
【问题描述】:
这是我的问题:以编程方式添加产品报价的正确事件是什么(条目 sales_flat_quote_item 表)。此外,我必须从用户/客户那里捕获添加到购物车的项目/产品,因为他们的数据信息将确定将以编程方式添加的产品。所以场景是:
- 用户/客户将产品添加到购物车
- 为挂钩找到正确的事件
- 获取有关添加到购物车的产品的信息
- 根据产品 ID 将其他产品添加到购物车并修改其数据
在我看来,最好在将产品写入数据库之前使用报价。
我知道如何通过 Mage_Sales_Model_Quote::_addCatalogProduct() 添加它。但我想通过事件观察者而不是覆盖核心类来做到这一点。
编辑
在帖子中进行了更多研究和建议后,我能够让它工作。对我来说,关键是理解观察者中的对象,它们的类和类方法
var_dump(get_class($quote)); // $item // $product
var_dump(get_class_methods($quote)); // $item // $product
现在知道方法可用,就更容易弄清楚了:
事件:
<events>
<checkout_cart_product_add_after>
<observers>
<unifiedarts_configurablebundleset>
<type>singleton</type>
<class>Namespace_ConfigurableBundleSet_Model_Observer</class>
<method>salesQuoteEditItems</method>
</unifiedarts_configurablebundleset>
</observers>
</checkout_cart_product_add_after>
</events>
以及观察者数据:
public function salesQuoteEditItems($observer)
{
$event = $observer->getEvent();
$item = $event->getQuoteItem();
$product = $item->getProduct();
$quote = $item->getQuote();
$parent = Mage::getModel('catalog/product')->load($product->getParentProductId());
if($parent->getTypeId() == 'bundle')
{
if($product->getTypeId() == 'configurable')
{
if ($simpleItem = $item->getOptionByCode('simple_product'))
{
// check if the simple product is in the table
if(!$quote->hasProductId($simpleItem->getProduct()->getId()))
{
echo '<br /><br /> no simple, add it';
echo ' simple id '.$simpleItem->getProduct()->getId();
$simple = Mage::getModel('catalog/product')->load($simpleItem->getProduct()->getId());
$quoteItem = Mage::getModel('sales/quote_item')->setProduct($simple);
$parentItem = ( $item->getParentItem() ? $item->getParentItem() : $item );
echo 'simple id '.$simpleItem->getProduct()->getId();
$item->setRowWeight($product->getWeight());
$quoteItem->setQuote($quote);
$quoteItem->setQty('1');
$quoteItem->setParentItem($parentItem);
$quoteItem->setStoreId(Mage::app()->getStore()->getId());
$quoteItem->setOriginalCustomPrice(0);
$quote->addItem($quoteItem);
$quote->save();
}
else
{
echo 'simple found change someting'; die;
}
}
}
}
}
问题是我的扩展必须在捆绑包中添加一个已配置的项目。产品视图正在运行。艰巨的任务是将它放入购物车。现在,一切正常,直到返回并使用不同的(配置的)选项再次添加产品。
您在上面看到我尝试检查简单产品(我手动添加)。代码在 sales_flat_quote_item 表中生成两个新行。
如何删除旧的两个条目,或者是否有其他更好的方法来设置新数据?谢谢:)
【问题讨论】:
-
您想在购物车的哪个阶段添加产品?
-
这就是重点,我不知道添加它的最佳时间是什么时候。我想与添加到购物车的其他产品一起,在我对报价项目进行检查后将其插入到报价对象中