2011-11-10 121 views
2

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

catalog_controller_product_delete 

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

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

回答

5

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

的问题是,事件:catalog_controller_product_delete,只得到在massDeleteAction()ProductController的()调度。
不是里面的deleteAction()

我已经在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')))); 
} 
+0

我没有看到这方面的需求。此解决方案更好地工作,无需任何代码修改 - http://stackoverflow.com/a/14211286/515268 – Dayson

+0

@dayson,我不明白其他解决方案是如何**更好**?你正在实现同样的事情。 Magento的家伙承认这是一个错误,因为你可以在我的[pull request](https://github.com/magento/magento2/pull/9#issuecomment-5059665)的评论中读到,这也是答案中提到的由jmva。如果您觉得编辑核心代码是错误的,那么只需将productController扩展到您自己的模块中并在那里编辑即可。 – Chris

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 
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中

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