1

我正在尝试挂钩catalog_product_save_after事件。这是config.xml

<events>
   <catalog_product_save_after>
     <observers>
       <observer_name_here>
         <class>My_Class_Model_Observer</class>
         <method>methodToCall</method>
         <type>singleton</type>
       </observer_name_here>
     </observers>
   </catalog_product_save_after>
</events>

下面是在methodToCall()中运行的代码:

$product = Mage::getModel('catalog/product')->load(1);
$product->setName('TESTING 123');
$product->save();


问题是:触发
事件catalog_product_save_after时。用methodToCall()编写的代码再次触发catalog_product_save_after。并且根据 Magento EDA 系统methodToCall()再次调用它再次触发catalog_product_save_after。因此系统陷入了一系列触发和侦听同一事件的状态。

我的问题:

  1. 如何避免这种情况?
  2. 是否有任何方法可以出于临时目的禁用 Magento 事件调度功能(如果可能,无需重写Mage_Core_Model_App的dispatchEvent方法 )。
  3. 如果观察者触发实例化观察者的相同事件,如何防止无限循环。就像上面的情况一样。
4

2 回答 2

0

如果您必须使用新值并且使用这些值必须更新另一个产品,您可以观察catalog_product_save_before事件。您的配置看起来不错,这是一个示例methodToCall函数:

public function methodToCall(Varien_Event_Observer $observer)
{
    $event    = $observer->getEvent();
    $product  = $event->getProduct();

    if($product->hasDataChanges()) { //somethings changed

        $newName = $product->getName();
        $oldName = $product->getOrigData('name');

        //do stuff here
        //don't call $product->save() It WILL be saved. If you call save() you will create a loop
    }
}
于 2016-04-18T13:00:13.617 回答
0

我相信从根本上说,这可能是您的用例的错误方法,我认为您可能应该查看save_before. 但是,我过去曾看到人们为此使用 Mage::registry。

if(!Mage::Registry("somekey")) {
    Mage::Register("somekey", true);
    //LOGIC
}

现在,在这种情况下,“somekey”应该是特定的,并且可能也特定于该产品,这样如果您保存多个产品,它不会影响它们。

于 2016-04-18T14:51:56.777 回答