/**
  * Indirectly test CroogoEventManager::detachPluginSubscribers()
  * triggerred by calling CroogoPlugin::unload(null)
  */
 public function testDetachPluginSubscribers()
 {
     $eventManager = CroogoEventManager::instance();
     $loaded = CakePlugin::loaded('Shops');
     $this->assertNotEmpty($loaded);
     $eventName = 'Controller.Users.activationFailure';
     $event = Croogo::dispatchEvent($eventName, $this->Users);
     $this->assertTrue($event->result, sprintf('Event: %s', $eventName));
     CroogoPlugin::unload('Shops');
     $eventName = 'Controller.Users.activationFailure';
     $event = Croogo::dispatchEvent($eventName, $this->Users);
     $this->assertNull($event->result, sprintf('Event: %s', $eventName));
 }
 /**
  * Test Reuse the same Event Listener class
  */
 public function testAliasingEventListener()
 {
     $eventManager = CroogoEventManager::instance();
     $listeners = $eventManager->listeners('Controller.Nodes.afterAdd');
     foreach ($listeners as $listener) {
         $eventManager->detach($listener['callable']);
     }
     $handlers = array('Shops.ShopsNodesEventHandler', 'CustomShopsNodesEventHandler' => array('options' => array('className' => 'Shops.ShopsNodesEventHandler')));
     Configure::write('EventHandlers', $handlers);
     Cache::delete('EventHandlers', 'cached_settings');
     CroogoEventManager::loadListeners();
     $listeners = $eventManager->listeners('Controller.Nodes.afterAdd');
     foreach ($listeners as $listener) {
         $this->assertInstanceOf('ShopsNodesEventHandler', $listener['callable'][0]);
     }
 }
Beispiel #3
0
 /**
  * Load Event Handlers during bootstrap.
  *
  * Plugins can add their own custom EventHandler in Config/events.php
  * with the following format:
  *
  * $config = array(
  *     'EventHandlers' => array(
  *         'Example.ExampleEventHandler' => array(
  *             'eventKey' => null,
  *             'options' => array(
  *                 'priority' => 1,
  *                 'passParams' => false,
  *                 'className' => 'Plugin.ClassName',
  *      )));
  *
  * @return void
  */
 public static function loadListeners()
 {
     $eventManager = CroogoEventManager::instance();
     $cached = Cache::read('EventHandlers', 'cached_settings');
     if ($cached === false) {
         $eventHandlers = Configure::read('EventHandlers');
         $validKeys = array('eventKey' => null, 'options' => array());
         $cached = array();
         if (!empty($eventHandlers) && is_array($eventHandlers)) {
             foreach ($eventHandlers as $eventHandler => $eventOptions) {
                 $eventKey = null;
                 if (is_numeric($eventHandler)) {
                     $eventHandler = $eventOptions;
                     $eventOptions = array();
                 }
                 list($plugin, $class) = pluginSplit($eventHandler);
                 if (!empty($eventOptions)) {
                     extract(array_intersect_key($eventOptions, $validKeys));
                 }
                 if (isset($eventOptions['options']['className'])) {
                     list($plugin, $class) = pluginSplit($eventOptions['options']['className']);
                 }
                 App::uses($class, $plugin . '.Event');
                 if (class_exists($class)) {
                     $cached[] = compact('plugin', 'class', 'eventKey', 'eventOptions');
                 } else {
                     CakeLog::error(__d('croogo', 'EventHandler %s not found in plugin %s', $class, $plugin));
                 }
             }
             Cache::write('EventHandlers', $cached, 'cached_settings');
         }
     }
     foreach ($cached as $cache) {
         extract($cache);
         if (CakePlugin::loaded($plugin)) {
             App::uses($class, $plugin . '.Event');
             $settings = isset($eventOptions['options']) ? $eventOptions['options'] : array();
             $listener = new $class($settings);
             $eventManager->attach($listener, $eventKey, $eventOptions);
         }
     }
 }
if ($theme = Configure::read('Site.theme')) {
    App::build(array('View/Helper' => array(App::themePath($theme) . 'Helper' . DS)));
}
/**
 * List of core plugins
 */
Configure::write('Core.corePlugins', array('Settings', 'Acl', 'Blocks', 'Comments', 'Contacts', 'Menus', 'Meta', 'Nodes', 'Taxonomy', 'Users'));
/**
 * Plugins
 */
$aclPlugin = Configure::read('Site.acl_plugin');
$pluginBootstraps = Configure::read('Hook.bootstraps');
$plugins = array_filter(explode(',', $pluginBootstraps));
if (!in_array($aclPlugin, $plugins)) {
    $plugins = Hash::merge((array) $aclPlugin, $plugins);
}
foreach ($plugins as $plugin) {
    $pluginName = Inflector::camelize($plugin);
    if (!file_exists(APP . 'Plugin' . DS . $pluginName)) {
        CakeLog::write(LOG_ERR, 'Plugin not found during bootstrap: ' . $pluginName);
        continue;
    }
    $bootstrapFile = APP . 'Plugin' . DS . $pluginName . DS . 'Config' . DS . 'bootstrap.php';
    $bootstrap = file_exists($bootstrapFile);
    $routesFile = APP . 'Plugin' . DS . $pluginName . DS . 'Config' . DS . 'routes.php';
    $routes = file_exists($routesFile);
    $option = array($pluginName => array('bootstrap' => $bootstrap, 'routes' => $routes));
    CroogoPlugin::load($option);
}
CroogoEventManager::loadListeners();
Beispiel #5
0
 /**
  * Forgets a loaded plugin or all of them if first parameter is null
  *
  * This method is identical to CakePlugin::load() with extra functionality
  * that unregister event listeners when a plugin in unloaded.
  *
  * @see CakePlugin::unload()
  * @param string $plugin name of the plugin to forget
  * @return void
  */
 public static function unload($plugin)
 {
     $eventManager = CroogoEventManager::instance();
     if ($eventManager instanceof CroogoEventManager) {
         if ($plugin == null) {
             $activePlugins = CakePlugin::loaded();
             foreach ($activePlugins as $activePlugin) {
                 $eventManager->detachPluginSubscribers($activePlugin);
             }
         } else {
             $eventManager->detachPluginSubscribers($plugin);
         }
     }
     CakePlugin::unload($plugin);
     Cache::delete('EventHandlers', 'cached_settings');
 }
Beispiel #6
0
 /**
  * Forgets a loaded plugin or all of them if first parameter is null
  *
  * This method is identical to CakePlugin::load() with extra functionality
  * that unregister event listeners when a plugin in unloaded.
  *
  * @see CakePlugin::unload()
  * @param string $plugin name of the plugin to forget
  * @return void
  */
 public static function unload($plugin)
 {
     $eventManager = CroogoEventManager::instance();
     if ($eventManager instanceof CroogoEventManager) {
         if ($plugin == null) {
             $activePlugins = CakePlugin::loaded();
             foreach ($activePlugins as $activePlugin) {
                 $eventManager->detachPluginSubscribers($activePlugin);
             }
         } else {
             $eventManager->detachPluginSubscribers($plugin);
         }
     }
     CakePlugin::unload($plugin);
 }