产品删除观察者

时间:2011-11-10 12:37:15

标签: magento observer-pattern

我想创建一个删除产品的观察者。表示管理员删除产品时,在删除过程中我想在此过程中添加一些自定义功能。目前我正在使用

catalog_controller_product_delete

为此目的。但它对我没有任何作用。请帮我。如何在删除产品时做些额外的事情?

我想将已删除的产品ID发送到我的API,我有这个产品的副本,以便我也可以从那里删除它,但它不会触发事件。我知道这是因为我正在通过<method>sendProductDelReq</method>触发sendProductDelReq()方法并且为了验证我在这个方法中放了一个骰子。

5 个答案:

答案 0 :(得分:5)

对于遇到同样问题且希望在这里找到答案的人们。
我发现了问题。
首先,您如何删除产品?
如果要从产品编辑页面中删除产品,则您的观察者可能无法正常工作。
如果要从“产品网格”页面中删除产品,您的观察者可能会正常工作。

问题是事件: catalog_controller_product_delete ,只能在 productController() massDeleteAction()中调度。
deleteAction()中的 NOT

我已经在magentocommerce.com/bug-tracking上将此问题作为错误提交。

要解决此问题,请粘贴:

Mage::dispatchEvent('catalog_controller_product_delete', array('product' => $product));

在您的deleteAction()内,就在$product->delete();之前
如此:

public function deleteAction()
{
    if ($id = $this->getRequest()->getParam('id')) {
        $product = Mage::getModel('catalog/product')
            ->load($id);
        $sku = $product->getSku();
        try {
            Mage::dispatchEvent('catalog_controller_product_delete', array('product' => $product));
            $product->delete();
            $this->_getSession()->addSuccess($this->__('The product has been deleted.'));
        } catch (Exception $e) {
            $this->_getSession()->addError($e->getMessage());
        }
    }
    $this->getResponse()
        ->setRedirect($this->getUrl('*/*/', array('store'=>$this->getRequest()->getParam('store'))));
}

答案 1 :(得分:1)

您实际应该使用catalog_product_delete_beforecatalog_product_delete_after事件。

此处更多信息https://stackoverflow.com/a/14211286/515268

答案 2 :(得分:0)

今天在搜索了类似的问题之后,我发现了另一个要删除的事件,感谢this pull request

您可以使用 catalog_product_delete_before 事件,该事件在Mage_Core_Model_Abstract :: _ beforeDelete()中调度。适用于网格和编辑页面中的单个删除。

此事件未显示在使用

创建的Magento event list
grep -rin -B2 -A2 "Mage::dispatchEvent" app/* > events.txt

答案 3 :(得分:0)

我猜 catalog_product_delete_after_done 是正确的事件

Mage_Catalog_Model_Product具有以下dispatchEvent:

    public function delete()
{
    parent::delete();
    Mage::dispatchEvent($this->_eventPrefix.'_delete_after_done', array($this->_eventObject=>$this));
    return $this;
}

否则,你可以得到产品在Magento中被删除但在你的API

中被删除的情况

答案 4 :(得分:0)

您也可以使用

  

model_delete_after

不修改任何核心文件。

以下是调度model_delete_after事件后删除函数的简要说明。

protected function _afterDelete()
{
    Mage::dispatchEvent('model_delete_after', array('object'=>$this));

    Mage::dispatchEvent($this->_eventPrefix.'_delete_after', $this->_getEventData());
    return $this;
}