【问题标题】:Magento "Product Status Update" event is not triggeredMagento“产品状态更新”事件未触发
【发布时间】:2012-01-24 11:19:26
【问题描述】:

我正在开发一个扩展程序,该扩展程序将在保存时从 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

【问题讨论】:

    标签: events magento status product


    【解决方案1】:

    我相信你的问题是网格顶部的更新状态选项不使用任何模型来完成任务,它直接访问数据库。如果您分别查看Mage_Catalog_Model_Product_ActionMage_Catalog_Model_Resource_Eav_Mysql4_Product_Action 中的updateAttributes 方法,您将看到没有加载任何产品或product_status 模型。

    对您来说很不幸,一眼看去,我没有看到任何您可以捕捉到的事件。它可能需要重写模型。

    【讨论】:

    • 谢谢 Cags ... 我觉得这个活动有些奇怪,因为我的其他活动已经好几个月了。但如果这是真的,那么如果它没有被触发,这个事件的目的是什么?
    • 该活动的目的是让您完全按照自己的意愿去做。不幸的是,为数据网格编写更新状态功能的人,忽略了模型,这意味着可以在不触发事件的情况下更改状态。 Magento 中有很多这样的例子。
    【解决方案2】:

    您的两个观察者具有相同的名称“abc”。这在 Magento 观察者列表中应该是唯一的。

    尝试将其中一个更改为“abc1”,刷新缓存,它应该可以工作。

    【讨论】:

    • 我可能是错的,但由于他们是不同事件的观察者,我不相信他们有相同的节点名称。
    • 无论如何我都会试一试,这是一个非常简单的改变:)
    • 我用“abc1”而不是“abc”替换了一个......没有任何改变
    【解决方案3】:

    这个问题是在 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 是一个键值列表,其中包含要在store_id 范围内为product_ids 存储的数据。在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
    }
    

    希望这对任何试图拦截大规模状态更新的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 2022-01-08
      • 2022-01-21
      • 1970-01-01
      • 2021-09-29
      相关资源
      最近更新 更多