以下は、既存のオブザーバーを切り替える概念実証ヘルパーメソッドです。イベントをデフォルトで無効にする場合は、<type>disabled</type>
オブザーバーのconfig.xml定義に追加します。
public function toggleObserver($area, $event, $name, $enable)
{
$app = Mage::app();
// reflection on the property Mage_Core_Model_App::_events
$class = new ReflectionClass(get_class($app));
$property = $class->getProperty('_events');
$property->setAccessible(true);
// get the events
$events = $property->getValue($app);
// make sure the event config is loaded
if (!isset($events[$area][$event]))
{
// load observers from config
/** @see Mage_Core_Model_App::dispatchEvent() */
$config = $app->getConfig()->getEventConfig($area, $event);
if (!$config)
{
// event is not configured
return;
}
// create observers array
$observers = array();
foreach ($config->observers->children() as $name => $values)
{
$observers[$name] = array(
'type' => (string) $values->type,
'model' => $values->class ? (string) $values->class : $values->getClassName(),
'method'=> (string) $values->method,
'args' => (array) $values->args,
);
}
$events[$area][$event]['observers'] = $observers;
}
if ($events[$area][$event] && isset($events[$area][$event]['observers'][$name]))
{
// enable/disable the observer by changing its type
$events[$area][$event]['observers'][$name]['type'] = $enable ? '' : 'disabled';
// update the object
$property->setValue($app, $events);
}
}
この関数はリフレクションを利用して、の保護された$_events
プロパティにアクセスしますMage_Mage_Core_Model_App
。同じトリックを使用して、以前に未定義のオブザーバーを挿入することもできます。