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

时间:2014-05-14 00:25:05

标签: magento events observers

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

  1. 用户/客户将产品添加到购物车
  2. 中找到正确的挂钩事件
  3. 获取有关添加到购物车的产品的信息
  4. 根据产品ID将其他产品添加到购物车并修改其数据
  5. 在我看来,在将产品写入数据库之前,最好使用引用。

    我弄清楚如何通过 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 表中生成两个新行。

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

    enter image description here

2 个答案:

答案 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);


    }
}

希望这有帮助!