diff --git a/core/Application/Environment.php b/core/Application/Environment.php index 6041dba01aa1d750b2d0f35546a0f4c978494b76..cabf9273a9721ffeac123593c80ed2054c6b9bdf 100644 --- a/core/Application/Environment.php +++ b/core/Application/Environment.php @@ -15,6 +15,7 @@ use Piwik\Application\Kernel\PluginList\IniPluginList; use Piwik\Application\Kernel\GlobalSettingsProvider\IniSettingsProvider; use Piwik\Container\ContainerFactory; use Piwik\Container\StaticContainer; +use Piwik\Piwik; /** * TODO @@ -48,6 +49,8 @@ class Environment $this->container = $this->createContainer(); StaticContainer::set($this->container); + + Piwik::postEvent('Environment.bootstrapped'); } public function getContainer() diff --git a/core/Application/Kernel/PluginList/IniPluginList.php b/core/Application/Kernel/PluginList/IniPluginList.php index e35554d688766a7f09996eb56fa25034ffbdec4f..f677836e36b98a634eaa73a1aea6de9668157240 100644 --- a/core/Application/Kernel/PluginList/IniPluginList.php +++ b/core/Application/Kernel/PluginList/IniPluginList.php @@ -31,7 +31,7 @@ class IniPluginList implements \Piwik\Application\Kernel\PluginList public function getActivatedPlugins() { $section = $this->settings->getSection('Plugins'); - return $section['Plugins']; + return @$section['Plugins'] ?: array(); } /** @@ -40,6 +40,6 @@ class IniPluginList implements \Piwik\Application\Kernel\PluginList public function getInstalledPlugins() { $section = $this->settings->getSection('PluginsInstalled'); - return $section['PluginsInstalled']; + return @$section['PluginsInstalled'] ?: array(); } } \ No newline at end of file diff --git a/core/Container/ContainerFactory.php b/core/Container/ContainerFactory.php index cd7eaf8140aaa4b8045409cd37e2dfdd143fc420..101a9c0aef5dde6e6d55b553b9f8e779c1b2c87a 100644 --- a/core/Container/ContainerFactory.php +++ b/core/Container/ContainerFactory.php @@ -80,7 +80,7 @@ class ContainerFactory $this->addPluginConfigs($builder); // Development config - if (Development::isEnabled()) { + if ($this->isDevelopmentModeEnabled()) { $builder->addDefinitions(PIWIK_USER_PATH . '/config/environment/dev.php'); } @@ -128,4 +128,10 @@ class ContainerFactory $builder->addDefinitions($file); } } + + private function isDevelopmentModeEnabled() + { + $section = $this->settings->getSection('Development'); + return (bool) @$section['enabled']; // TODO: code redundancy w/ Development. hopefully ok for now. + } } diff --git a/core/EventDispatcher.php b/core/EventDispatcher.php index bdec8c1c7c34b6de0fe40d1d13770cbd8a296504..87e8ca59c2f12837ae79ff8e5998b27948c8e348 100644 --- a/core/EventDispatcher.php +++ b/core/EventDispatcher.php @@ -213,8 +213,9 @@ class EventDispatcher extends Singleton private function getPluginManager() { if ($this->pluginManager === null) { - $this->pluginManager = Plugin\Manager::getInstance(); + return Plugin\Manager::getInstance(); // caching the var breaks DI for now since only Plugin\Manager is in the container. + } else { + return $this->pluginManager; } - return $this->pluginManager; } } \ No newline at end of file diff --git a/core/Plugin/Manager.php b/core/Plugin/Manager.php index 32999bb422ff2400a8004587daa3b5af600846b9..9053dda2f8312c9e4603c7380899f09d388bf839 100644 --- a/core/Plugin/Manager.php +++ b/core/Plugin/Manager.php @@ -9,6 +9,7 @@ namespace Piwik\Plugin; +use Piwik\Application\Kernel\PluginList; use Piwik\Cache; use Piwik\Columns\Dimension; use Piwik\Config as PiwikConfig; @@ -35,11 +36,17 @@ require_once PIWIK_INCLUDE_PATH . '/core/EventDispatcher.php'; /** * The singleton that manages plugin loading/unloading and installation/uninstallation. - * - * @method static Manager getInstance() */ -class Manager extends Singleton +class Manager { + /** + * @return self + */ + public static function getInstance() + { + return StaticContainer::get('Piwik\Plugin\Manager'); + } + protected $pluginsToLoad = array(); protected $doLoadPlugins = true; @@ -93,6 +100,16 @@ class Manager extends Singleton private $trackerPluginsNotToLoad = array(); + /** + * @var PluginList + */ + private $pluginList; + + public function __construct(PluginList $pluginList) + { + $this->pluginList = $pluginList; + } + /** * Loads plugin that are enabled */ @@ -107,7 +124,7 @@ class Manager extends Singleton */ public function loadCorePluginsDuringTracker() { - $pluginsToLoad = Config::getInstance()->Plugins['Plugins']; + $pluginsToLoad = $this->pluginList->getActivatedPlugins(); $pluginsToLoad = array_diff($pluginsToLoad, $this->getTrackerPluginsNotToLoad()); $this->loadPlugins($pluginsToLoad); } @@ -203,6 +220,8 @@ class Manager extends Singleton * Update Plugins config * * @param array $pluginsToLoad Plugins + * + * TODO: see uses of this + updatePluginsInstalledConfig (also clearPluginsInstalledConfig) */ private function updatePluginsConfig($pluginsToLoad) { @@ -459,10 +478,12 @@ class Manager extends Singleton * * @param string $pluginName Name of plugin * @throws \Exception + * + * TODO: pluginList needs to be updated in this case. some of these methods need to go into PluginList. */ public function activatePlugin($pluginName) { - $plugins = PiwikConfig::getInstance()->Plugins['Plugins']; + $plugins = $this->pluginList->getActivatedPlugins(); if (in_array($pluginName, $plugins)) { throw new \Exception("Plugin '$pluginName' already activated."); } @@ -588,7 +609,7 @@ class Manager extends Singleton $listPlugins = array_merge( $this->readPluginsDirectory(), - PiwikConfig::getInstance()->Plugins['Plugins'] + $this->pluginList->getActivatedPlugins() ); $listPlugins = array_unique($listPlugins); foreach ($listPlugins as $pluginName) { @@ -649,8 +670,8 @@ class Manager extends Singleton public function isPluginBundledWithCore($name) { return $this->isPluginEnabledByDefault($name) - || in_array($name, $this->getCorePluginsDisabledByDefault()) - || $name == self::DEFAULT_THEME; + || in_array($name, $this->getCorePluginsDisabledByDefault()) + || $name == self::DEFAULT_THEME; } protected function isPluginThirdPartyAndBogus($pluginName) @@ -671,7 +692,7 @@ class Manager extends Singleton /** * Load AND activates the specified plugins. It will also overwrite all previously loaded plugins, so it acts - * as a setter. + * as a setter. * * @param array $pluginsToLoad Array of plugins to load. */ @@ -792,7 +813,7 @@ class Manager extends Singleton public function getActivatedPluginsFromConfig() { - $plugins = @Config::getInstance()->Plugins['Plugins']; + $plugins = $this->pluginList->getActivatedPlugins(); return $this->makePluginsToLoad($plugins); } @@ -863,7 +884,6 @@ class Manager extends Singleton public static function getAllPluginsNames() { $pluginsToLoad = array_merge( - PiwikConfig::getInstance()->Plugins['Plugins'], self::getInstance()->readPluginsDirectory(), self::getInstance()->getCorePluginsDisabledByDefault() ); @@ -1002,7 +1022,7 @@ class Manager extends Singleton */ public function getInstalledPluginsName() { - $pluginNames = PiwikConfig::getInstance()->PluginsInstalled['PluginsInstalled']; + $pluginNames = $this->pluginList->getInstalledPlugins(); return $pluginNames; } @@ -1016,17 +1036,17 @@ class Manager extends Singleton public function getMissingPlugins() { $missingPlugins = array(); - if (isset(PiwikConfig::getInstance()->Plugins['Plugins'])) { - $plugins = PiwikConfig::getInstance()->Plugins['Plugins']; - foreach ($plugins as $pluginName) { - // if a plugin is listed in the config, but is not loaded, it does not exist in the folder - if (!self::getInstance()->isPluginLoaded($pluginName) - && !$this->isPluginBogus($pluginName) - ) { - $missingPlugins[] = $pluginName; - } + + $plugins = $this->pluginList->getActivatedPlugins(); + foreach ($plugins as $pluginName) { + // if a plugin is listed in the config, but is not loaded, it does not exist in the folder + if (!self::getInstance()->isPluginLoaded($pluginName) + && !$this->isPluginBogus($pluginName) + ) { + $missingPlugins[] = $pluginName; } } + return $missingPlugins; } @@ -1100,7 +1120,7 @@ class Manager extends Singleton */ private function removePluginFromPluginsInstalledConfig($pluginName) { - $pluginsInstalled = PiwikConfig::getInstance()->PluginsInstalled['PluginsInstalled']; + $pluginsInstalled = $this->pluginList->getInstalledPlugins(); $key = array_search($pluginName, $pluginsInstalled); if ($key !== false) { unset($pluginsInstalled[$key]); @@ -1114,7 +1134,7 @@ class Manager extends Singleton */ private function removePluginFromPluginsConfig($pluginName) { - $pluginsEnabled = PiwikConfig::getInstance()->Plugins['Plugins']; + $pluginsEnabled = $this->pluginList->getActivatedPlugins(); $key = array_search($pluginName, $pluginsEnabled); if ($key !== false) { unset($pluginsEnabled[$key]); @@ -1259,7 +1279,7 @@ class Manager extends Singleton * * @return array */ - protected function getPluginsFromGlobalIniConfigFile() + protected function getPluginsFromGlobalIniConfigFile() // TODO: if this is only used for sorting, move to PluginList { $pluginsBundledWithPiwik = PiwikConfig::getInstance()->getFromGlobalConfig('Plugins'); $pluginsBundledWithPiwik = $pluginsBundledWithPiwik['Plugins']; diff --git a/tests/PHPUnit/TestingEnvironment.php b/tests/PHPUnit/TestingEnvironment.php index 5841735b7e11be2609f908d22c3e2f4e29b515a0..afd398c01b879faf3861ef425b3b79f7fc2d662d 100644 --- a/tests/PHPUnit/TestingEnvironment.php +++ b/tests/PHPUnit/TestingEnvironment.php @@ -256,9 +256,10 @@ class Piwik_TestingEnvironment DbHelper::deleteArchiveTables(); } }); - - $testingEnvironment->logVariables(); - $testingEnvironment->executeSetupTestEnvHook(); + Piwik::addAction('Environment.bootstrapped', function () use ($testingEnvironment) { + $testingEnvironment->logVariables(); + $testingEnvironment->executeSetupTestEnvHook(); + }); } public static function addSendMailHook() diff --git a/tests/PHPUnit/proxy/piwik.php b/tests/PHPUnit/proxy/piwik.php index bc03155b25ba2a379ec69070d01712fec4d8f319..b5a984cd00e74fbe391e30fcd1cd2e26261f7e15 100755 --- a/tests/PHPUnit/proxy/piwik.php +++ b/tests/PHPUnit/proxy/piwik.php @@ -24,10 +24,12 @@ try { GeoIp::$geoIPDatabaseDir = 'tests/lib/geoip-files'; - Tracker::setTestEnvironment(); - Manager::getInstance()->deleteAll(); - Option::clearCache(); - Site::clearCache(); + \Piwik\Piwik::addAction('Environment.bootstrapped', function () { + Tracker::setTestEnvironment(); + Manager::getInstance()->deleteAll(); + Option::clearCache(); + Site::clearCache(); + }); include PIWIK_INCLUDE_PATH . '/piwik.php'; } catch (Exception $ex) {