Magento - 通过观察者以编程方式将产品添加到购物车

Flo*_* P. 1 events observers magento

以下是我的问题:以编程方式添加产品以引用的正确事件是什么(条目sales_flat_quote_item表).此外,我必须从用户/客户处捕获添加到购物车的商品/产品,因为他们的数据信息将决定将以编程方式添加的产品.所以场景将是:

  1. 用户/客户将产品添加到购物车
  2. 找到适合挂钩的事件
  3. 获取有关添加到购物车的产品的信息
  4. 根据产品ID将其他产品添加到购物车并修改其数据

在我看来,在将产品写入数据库之前,最好使用引号.

我弄清楚如何通过Mage_Sales_Model_Quote :: _ addCatalogProduct()添加它.但我想通过事件观察者而不是覆盖核心类来实现.

编辑

经过这篇文章的更多研究和建议,我能够让它运作起来.对我来说关键的是理解观察者中的对象,他们的类和类方法

var_dump(get_class($quote)); // $item // $product
var_dump(get_class_methods($quote)); // $item // $product
Run Code Online (Sandbox Code Playgroud)

现在知道方法可用,更容易弄清楚:

事件:

        <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>
Run Code Online (Sandbox Code Playgroud)

和观察者数据:

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;
                }
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

最重要的是我的扩展程序必须添加一个已配置的项目与包.产品视图正常运行.艰巨的任务是将它放入购物车.现在,一切正常,直到返回并使用不同(已配置)选项再次添加产品.

你看上面我试图检查简单的产品(我手动添加).该代码在sales_flat_quote_item表中生成两个新行.

如何删除旧的两个条目,或者是否有更好的方法来设置新数据?谢谢 :)

在此输入图像描述

小智 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>
Run Code Online (Sandbox Code Playgroud)

开发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;
    }
}
Run Code Online (Sandbox Code Playgroud)