Событие 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", обновите кеш, и он должен работать.