2011-07-14 12 views

答えて

8

ここでは、MagentoのMage_Core_Model_App :: dispatchEvent()呼び出し(イベントをトリガするために使用される)の内訳を示します。私のコメントは、私が記述しているコードのインセットの前に置かれます。明白なものは除外します。これは、Magento Enterprise 1.10.1.1の観点からのものであることに言及することは重要です。私たちは宣言で始まり

public function dispatchEvent($eventName, $args) 
{ 
    foreach ($this->_events as $area=>$events) { 
     if (!isset($events[$eventName])) { 
      $eventConfig = $this->getConfig()->getEventConfig($area, $eventName); 
      if (!$eventConfig) { 
       $this->_events[$area][$eventName] = false; 
       continue; 
      } 
      $observers = array(); 
      foreach ($eventConfig->observers->children() as $obsName=>$obsConfig) { 
       $observers[$obsName] = array(
        'type' => (string)$obsConfig->type, 
        'model' => $obsConfig->class ? (string)$obsConfig->class : $obsConfig->getClassName(), 
        'method'=> (string)$obsConfig->method, 
        'args' => (array)$obsConfig->args, 
       ); 
      } 
      $events[$eventName]['observers'] = $observers; 
      $this->_events[$area][$eventName]['observers'] = $observers; 
     } 
     if (false===$events[$eventName]) { 
      continue; 
     } else { 
      $event = new Varien_Event($args); 
      $event->setName($eventName); 
      $observer = new Varien_Event_Observer(); 
     } 

     foreach ($events[$eventName]['observers'] as $obsName=>$obs) { 
      $observer->setData(array('event'=>$event)); 
      Varien_Profiler::start('OBSERVER: '.$obsName); 
      switch ($obs['type']) { 
       case 'disabled': 
        break; 
       case 'object': case 'model': 
        $method = $obs['method']; 
        $observer->addData($args); 
        $object = Mage::getModel($obs['model']); 
        $this->_callObserverMethod($object, $method, $observer); 
        break; 
       default: 
        $method = $obs['method']; 
        $observer->addData($args); 
        $object = Mage::getSingleton($obs['model']); 
        $this->_callObserverMethod($object, $method, $observer); 
        break; 
      } 
      Varien_Profiler::stop('OBSERVER: '.$obsName); 
     } 
    } 
    return $this; 
} 

:で開始する

が、これは全体のメソッド定義です。特定の名前のイベントが発生し、それに加えていくつかのオプションのサポートデータが含まれます。

public function dispatchEvent($eventName, $args) 
{ 

いくつかのイベントは、単純名を持っているのに対し、コントローラ関連をpreDispatchとpostdispatchイベントだけでなく、のようなイベントは、コントローラに特有の一般的なイベントだけでなく、イベントを発します。現時点では、Mage_Core_Controller_Varien_Action内をpreDispatch方法を見てみましょう。

Mage::dispatchEvent('controller_action_predispatch', array('controller_action'=>$this)); 
    Mage::dispatchEvent(
     'controller_action_predispatch_'.$this->getRequest()->getRouteName(), 
     array('controller_action'=>$this) 
    ); 
    Mage::dispatchEvent(
     'controller_action_predispatch_'.$this->getFullActionName(), 
     array('controller_action'=>$this) 

三つの異なるイベントを同時に放出され、あなたはそれらのいずれかにオブザーバーを設定することができます。

次に、オブザーバーが登録されているイベントエリアとイベントを順番に調べます。イベントエリアは「フロントエンド」でも「グローバル」でも構いませんが、これはあなたが気にするべきではない内部概念です。

foreach ($this->_events as $area=>$events) { 
     if (!isset($events[$eventName])) { 

このイベントの派生構成を取得します。これは本質的に、設定を通じてこのイベント用に定義されたすべてのオブザーバを含むXMLノードです。このイベントに対して少なくとも1人のオブザーバーが定義されていない限り、構成は検出されません。その場合、$ this - > _ events [$ area] [$ eventName]をFALSEに設定し、上記の条件付きでこのチェックを将来バイパスします。

  $eventConfig = $this->getConfig()->getEventConfig($area, $eventName); 
      if (!$eventConfig) { 
       $this->_events[$area][$eventName] = false; 
       continue; 
      } 

登録されたオブザーバーの配列を作成します。

このパスまたは前のパスでオブザーバーが見つからなかった場合は、ループします。

 if (false===$events[$eventName]) { 
      continue; 

それ以外の場合は、オブザーバーをトリガーする準備をします。 Varien_Eventはイベント用の非常にシンプルなコンテナとして構築し、Varien_Event_Observerはさらにそれをラップします。これはオブザーバーとして引数として送られます。

 } else { 
      $event = new Varien_Event($args); 
      $event->setName($eventName); 
      $observer = new Varien_Event_Observer(); 
     } 

ここで、オブザーバーを繰り返してください。各オブザーバに対して、定義された型( "model"、singleton "など)に基づいてオブザーバのオブジェクトをインスタンス化し、_callObserverMethodを呼び出して、呼び出す前にそのオブジェクトのメソッドが存在することを確認します。 「シングルトン」は以下の「デフォルト」のケースに該当します。

 foreach ($events[$eventName]['observers'] as $obsName=>$obs) { 
      $observer->setData(array('event'=>$event)); 
      Varien_Profiler::start('OBSERVER: '.$obsName); 
      switch ($obs['type']) { 
       case 'disabled': 
        break; 
       case 'object': case 'model': 
        $method = $obs['method']; 
        $observer->addData($args); 
        $object = Mage::getModel($obs['model']); 
        $this->_callObserverMethod($object, $method, $observer); 
        break; 
       default: 
        $method = $obs['method']; 
        $observer->addData($args); 
        $object = Mage::getSingleton($obs['model']); 
        $this->_callObserverMethod($object, $method, $observer); 
        break; 
      } 
      Varien_Profiler::stop('OBSERVER: '.$obsName); 
     } 
    } 
    return $this; 
} 

ダスティンOprea

3

すべてのイベントは、Mage::dispatchEvent()を通過します。 「dispatchEvent」または興味のあるイベント名をgrepまたはackとすると、どこに呼び出されたのかがわかります。その行にブレークポイントを設定します。

関連する問題