Событие Magento "Обновление статуса продукта" не вызвано

Я работаю над расширением, которое будет получать информацию о продукте от Magento при сохранении и выполнять пользовательскую обработку продукта.

До сих пор я потратил 2 дня, пытаясь понять, почему Magento не вызывает событие "catalog_product_status_update".

Просто я меняю статус продукта, перейдя в Каталог-> Управление продуктами, затем выбираю один или несколько продуктов и использую поле "Действия" над сеткой продуктов, чтобы изменить статус продукта (ов) на "отключено".

Когда я это делаю, статус продукта (ов) меняется просто отлично, но проблема в том, что я не получаю событие для него. Вот код, который я использую:

<?xml version="1.0"?>
<config>
  <global>
    <models>
        <mage4ucustomredirect>
             <class>Mage4u_Customredirect</class>
        </mage4ucustomredirect>
    </models>
    <events>
       <catalog_product_save_after>
            <observers>
                <abc>
                    <type>singleton</type>
                    <class>Mage4u_Customredirect_Model_Observer</class>
                    <method>on_catalog_product_save_after</method>
                </abc>
            </observers>
       </catalog_product_save_after>
       <catalog_product_status_update>
            <observers>
                <abc>
                    <type>singleton</type>
                    <class>Mage4u_Customredirect_Model_Observer</class>
                    <method>on_catalog_product_status_update</method>
                </abc>
            </observers>
       </catalog_product_status_update>
    </events>
  </global>
</config>

И это наблюдатель

class Mage4u_Customredirect_Model_Observer
{
    public function on_catalog_product_status_update(Varien_Event_Observer $observer)
    {  
        Mage::log( "on_catalog_product_status_update" );
    }

    public function on_catalog_product_save_after(Varien_Event_Observer $observer)
    {  
        Mage::log( "on_catalog_product_save_after"  );
    }
}
?>

Как ни странно, когда я пытаюсь сохранить продукт вручную, я получаю событие "on_catalog_product_save_after", которое говорит мне, что мой код работает нормально, но не работает для этого события "on_catalog_product_status_update".

Любая помощь приветствуется!

ПРИМЕЧАНИЕ: я использую Magento v1.6.2.0

3 ответа

Решение

Я полагаю, что ваша проблема в том, что опция состояния обновления в верхней части таблицы не использует никаких моделей для достижения этой цели, она напрямую обращается к базе данных. Если вы посмотрите на updateAttributes метод в Mage_Catalog_Model_Product_Action а также Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Action соответственно вы увидите, что ни одна модель продукта или продукта не загружена.

К сожалению для вас, на первый взгляд, я не вижу событий, которые вы могли бы подключить, чтобы захватить это. Это может потребовать переписывания модели.

Этот вопрос был задан где-то в 2012 году, но в более поздних версиях Magento обновление массовых действий для сетки продуктов обрабатывается catalog/product_action моделировать его updateAttributes метод:

Mage_Catalog_Model_Product_Action::updateAttributes() 

Событие отправляется туда:

Mage::dispatchEvent('catalog_product_attribute_update_before', array(
    'attributes_data' => &$attrData,
    'product_ids'   => &$productIds,
    'store_id'      => &$storeId
));

attributes_data список значений ключа с данными для хранения product_ids в store_id объем. В вашем наблюдателе для catalog_product_attribute_update_before Вы можете проверить, обновляется ли атрибут статуса:

$event = $observer->getEvent();

$attributesData = $event->getData('attributes_data');

if (! isset($attributesData['status'])) {
    // we are not updating the status
    return;
}

// do something, for example - if the product will be disabled
if ($attributesData['status'] != Mage_Catalog_Model_Product_Status::STATUS_ENABLED) {
   // api call
}

Надеюсь, это поможет всем, кто пытается перехватить массовое обновление статуса.

Ваши два наблюдателя имеют одно и то же имя "abc". Это должно быть уникальным в списке наблюдателей Magento.

Попробуйте изменить один из них на "abc1", обновите кеш, и он должен работать.

Другие вопросы по тегам