以下是我的问题:用于添加产品以编程方式引用的正确事件是什么(条目sales_flat_quote_item表)。此外,我必须从用户/客户处捕获添加到购物车的商品/产品,因为他们的数据信息将决定将以编程方式添加的产品。所以场景将是:
在我看来,在将产品写入数据库之前,最好使用引用。
我弄清楚如何通过 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 表中生成两个新行。
如何删除旧的两个条目,还是有更好的方法来设置新数据?谢谢:))
答案 0 :(得分:5)
在config.xml中声明事件观察者
<events>
<checkout_cart_product_add_after>
<observers>
<custommodule>
<class>custommodule/observer</class>
<method>cartProductAddAfter</method>
</custommodule>
</observers>
</checkout_cart_product_add_after>
<checkout_cart_product_update_after>
<observers>
<custommodule>
<class>custommodule/observer</class>
<method>cartProductUpdateAfter</method>
</custommodule>
</observers>
</checkout_cart_product_update_after>
</events>
开发Observers处理程序
class Vendor_Custommodule_Model_Observer
{
/* If you'd like to do the same while updating the shopping cart*/
public function cartProductUpdateAfter($observer)
{
$this->cartProductAddAfter($observer);
}
public function cartProductAddAfter($observer)
{
$product = $observer->getEvent()->getProduct();
$currentItem = $observer->getEvent()->getQuoteItem();
$quote = $currentItem->getQuote();
$quoteItems = $quote->getItems();
/* Detect Product ID and Qty programmatically */
$idToAdd = "ANY PRODUCT ID";
$qty = 1;
$productToAdd = Mage::getModel('catalog/product');
/* @var $productToAdd Mage_Catalog_Model_Product */
$productToAdd->load($idToAdd);
$this->_addProductToCart($productToAdd, $qty);
}
protected function _addProductToCart($product, $qty)
{
$cart = Mage::getSingleton('checkout/cart');
/* @var $cart Mage_Checkout_Model_Cart */
if ($product->getId()) {
$cart->addProduct($product, $qty);
return true;
}
return false;
}
}
答案 1 :(得分:0)
试试这段代码:
<events>
<checkout_cart_product_add_after>
<observers>
<additionalproduct>
<type>singleton</type>
<class>YourPackage_YourModule_Model_Observer</class>
<method>additionalProduct</method>
</additionalproduct>
</observers>
</checkout_cart_product_add_after>
</events>
观察员类代码:
class YourPackage_YourModule_Model_Observer
{
public function additionalProduct(Varien_Event_Observer $observer)
{
$item = $observer->getQuoteItem(); // current Quote object
$product = $observer->getProduct(); // current Product object
// apply your logice here
// for example
$id = '100'; // Replace id with your product id
$qty = '2'; // Replace qty with your qty
$_product = Mage::getModel('catalog/product')->load($id);
$cart = Mage::getModel('checkout/cart');
$cart->init();
$cart->addProduct($_product, array('qty' => $qty));
$cart->save();
Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
}
}
希望这有帮助!