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

Мои вопросы:

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

1

Решение

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

Другие решения

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

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

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

0

По вопросам рекламы [email protected]