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をもう一度起動するメソッドToCall()が再度呼び出されます。そのため、システムは一連の発火と同じイベントのリッスンでスタックしました。

私の質問:

  1. この状況を回避するには?
  2. 一時的な目的で Magento イベント ディスパッチ機能を無効にする方法はありますか (可能であれば、 Mage_Core_Model_AppのdispatchEventメソッドを書き換えずに )。
  3. オブザーバーが、オブザーバーをインスタンス化したのと同じイベントを発生させた場合に、無限ループを防ぐ方法。上記の場合のように。
4

2 に答える 2

0

基本的に、これはおそらくあなたのユースケースにとって間違ったアプローチだと思います.おそらくsave_before. ただし、過去にこれに Mage::registry を使用している人を見てきました。

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

さて、この例では、「somekey」は特定のものであり、おそらくこの製品にも固有のものである必要があるため、複数の製品を保存している場合にそれらに影響を与えません.

于 2016-04-18T14:51:56.777 に答える
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 に答える