Система EDA Magento, как избежать цикла событий?

Я пытаюсь перехватить событие 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 системный метод ToCall () вызвал снова, который запускает catalog_product_save_after еще раз. Таким образом, система застряла в серии стрельбы и прослушивания одного и того же события.

Мои вопросы:

  1. Как избежать этой ситуации?
  2. Есть ли способ отключить в Magento функцию отправки событий для временных целей (без переписывания метода dispatchEvent Mage_Core_Model_App, если это возможно).
  3. Как предотвратить бесконечное зацикливание, если наблюдатель запускает то же событие, что и экземпляр наблюдателя. Как в случае выше.

2 ответа

Я считаю, что в принципе, это, вероятно, неправильный подход для вашего случая использования, я думаю, что вы, вероятно, должны смотреть на save_before, Однако в прошлом я видел, как люди используют реестр Mage:: для этого.

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

Теперь, в данном случае, "somekey" должно быть чем-то конкретным и, вероятно, специфичным для этого продукта, чтобы при сохранении нескольких продуктов это не влияло на них.

Если вам нужно использовать новые значения и использовать эти значения, вы должны обновить другой продукт, вы можете наблюдать событие 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
    }
}
Другие вопросы по тегам