Обозреватель удаления продукта - PullRequest
3 голосов
/ 10 ноября 2011

Я хочу создать наблюдателя для удаления Продукта.Имеется в виду, когда администратор удаляет продукт, во время удаления я хочу добавить некоторые пользовательские функции в этом процессе.В настоящее время я использую

catalog_controller_product_delete

для этой цели.Но это ничего не делает для меня.Пожалуйста, помогите мне.Как я могу сделать что-то дополнительное во время удаления продукта?

Я хочу отправить идентификатор удаленного продукта в мой API, где у меня есть копия этого продукта, чтобы я тоже мог удалить его оттуда, но это не вызывает событие,Я знаю это, потому что я запускаю метод sendProductDelReq () с помощью <method>sendProductDelReq</method> и для проверки я поставил кубик в этом методе.

Ответы [ 5 ]

5 голосов
/ 30 марта 2012

Для людей, которые столкнулись с той же проблемой и которые надеялись найти ответ здесь.Я нашел проблему.Прежде всего, как вы удаляете продукт?Если вы удаляете продукт со страницы редактирования продукта, скорее всего, ваш наблюдатель не будет работать.Если вы удаляете продукт изнутри страницы 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'))));
}
1 голос
/ 20 августа 2013

Вы должны использовать события catalog_product_delete_before и catalog_product_delete_after.

Подробнее об этом здесь https://stackoverflow.com/a/14211286/515268

0 голосов
/ 29 марта 2017

Вы также можете использовать

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;
}
0 голосов
/ 08 июня 2016

Полагаю, catalog_product_delete_after_done - правильное событие

Mage_Catalog_Model_Product имеет следующую отправку события:

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

В противном случае вы можете получить информацию о том, что продукт удален в Magento, но не в вашем API

0 голосов
/ 09 января 2013

После небольшого поиска аналогичной проблемы сегодня я обнаружил еще одно событие для удаления благодаря этому запросу .

Вы можете использовать catalog_product_delete_before событие, которое отправляется в Mage_Core_Model_Abstract :: _ beforeDelete (). Работает для отдельных удалений как в сетке, так и на странице редактирования.

Это событие не отображается в списке событий Magento , созданном с использованием

grep -rin -B2 -A2 "Mage::dispatchEvent" app/* > events.txt
...