我想创建一个删除产品的观察者。表示管理员删除产品时,在删除过程中我想在此过程中添加一些自定义功能。目前我正在使用
catalog_controller_product_delete
为此目的。但它对我没有任何作用。请帮我。如何在删除产品时做些额外的事情?
我想将已删除的产品ID发送到我的API,我有这个产品的副本,以便我也可以从那里删除它,但它不会触发事件。我知道这是因为我正在通过<method>sendProductDelReq</method>
触发sendProductDelReq()方法并且为了验证我在这个方法中放了一个骰子。
答案 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_before
和catalog_product_delete_after
事件。
答案 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;
}