Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'core/Plugin/Manager.php')
-rw-r--r--core/Plugin/Manager.php70
1 files changed, 43 insertions, 27 deletions
diff --git a/core/Plugin/Manager.php b/core/Plugin/Manager.php
index 72b9b9052a..ee4f658b88 100644
--- a/core/Plugin/Manager.php
+++ b/core/Plugin/Manager.php
@@ -15,7 +15,6 @@ use Piwik\Columns\Dimension;
use Piwik\Config;
use Piwik\Config as PiwikConfig;
use Piwik\Container\StaticContainer;
-use Piwik\Db;
use Piwik\EventDispatcher;
use Piwik\Exception\PluginDeactivatedException;
use Piwik\Filesystem;
@@ -26,10 +25,8 @@ use Piwik\Plugin;
use Piwik\Plugin\Dimension\ActionDimension;
use Piwik\Plugin\Dimension\ConversionDimension;
use Piwik\Plugin\Dimension\VisitDimension;
-use Piwik\Session;
use Piwik\Settings\Storage as SettingsStorage;
use Piwik\Theme;
-use Piwik\Tracker;
use Piwik\Translation\Translator;
use Piwik\Updater;
@@ -206,7 +203,7 @@ class Manager
*/
private function updatePluginsConfig($pluginsToLoad)
{
- $pluginsToLoad = $this->pluginList->sortPlugins($pluginsToLoad);
+ $pluginsToLoad = $this->pluginList->sortPluginsAndRespectDependencies($pluginsToLoad);
$section = PiwikConfig::getInstance()->Plugins;
$section['Plugins'] = $pluginsToLoad;
PiwikConfig::getInstance()->Plugins = $section;
@@ -838,37 +835,56 @@ class Manager
{
$pluginsToPostPendingEventsTo = array();
foreach ($this->pluginsToLoad as $pluginName) {
- if (!$this->isPluginLoaded($pluginName)
- && !$this->isPluginThirdPartyAndBogus($pluginName)
- ) {
- $newPlugin = $this->loadPlugin($pluginName);
- if ($newPlugin === null) {
- continue;
- }
+ $pluginsToPostPendingEventsTo = $this->reloadActivatedPlugin($pluginName, $pluginsToPostPendingEventsTo);
+ }
- if ($newPlugin->hasMissingDependencies()) {
- $this->deactivatePlugin($pluginName);
+ // post pending events after all plugins are successfully loaded
+ foreach ($pluginsToPostPendingEventsTo as $plugin) {
+ EventDispatcher::getInstance()->postPendingEventsTo($plugin);
+ }
+ }
- // at this state we do not know yet whether current user has super user access. We do not even know
- // if someone is actually logged in.
- $message = Piwik::translate('CorePluginsAdmin_WeDeactivatedThePluginAsItHasMissingDependencies', array($pluginName, $newPlugin->getMissingDependenciesAsString()));
- $message .= ' ';
- $message .= Piwik::translate('General_PleaseContactYourPiwikAdministrator');
+ private function reloadActivatedPlugin($pluginName, $pluginsToPostPendingEventsTo)
+ {
+ if ($this->isPluginLoaded($pluginName) || $this->isPluginThirdPartyAndBogus($pluginName)) {
+ return $pluginsToPostPendingEventsTo;
+ }
- $notification = new Notification($message);
- $notification->context = Notification::CONTEXT_ERROR;
- Notification\Manager::notify('PluginManager_PluginDeactivated', $notification);
- continue;
- }
+ $newPlugin = $this->loadPlugin($pluginName);
- $pluginsToPostPendingEventsTo[] = $newPlugin;
+ if ($newPlugin === null) {
+ return $pluginsToPostPendingEventsTo;
+ }
+
+ $requirements = $newPlugin->getMissingDependencies();
+
+ if (!empty($requirements)) {
+ foreach ($requirements as $requirement) {
+ $possiblePluginName = $requirement['requirement'];
+ if (in_array($possiblePluginName, $this->pluginsToLoad, $strict = true)) {
+ $pluginsToPostPendingEventsTo = $this->reloadActivatedPlugin($possiblePluginName, $pluginsToPostPendingEventsTo);
+ }
}
}
- // post pending events after all plugins are successfully loaded
- foreach ($pluginsToPostPendingEventsTo as $plugin) {
- EventDispatcher::getInstance()->postPendingEventsTo($plugin);
+ if ($newPlugin->hasMissingDependencies()) {
+ $this->unloadPluginFromMemory($pluginName);
+
+ // at this state we do not know yet whether current user has super user access. We do not even know
+ // if someone is actually logged in.
+ $message = Piwik::translate('CorePluginsAdmin_WeCouldNotLoadThePluginAsItHasMissingDependencies', array($pluginName, $newPlugin->getMissingDependenciesAsString()));
+ $message .= ' ';
+ $message .= Piwik::translate('General_PleaseContactYourPiwikAdministrator');
+
+ $notification = new Notification($message);
+ $notification->context = Notification::CONTEXT_ERROR;
+ Notification\Manager::notify('PluginManager_PluginUnloaded', $notification);
+ return $pluginsToPostPendingEventsTo;
}
+
+ $pluginsToPostPendingEventsTo[] = $newPlugin;
+
+ return $pluginsToPostPendingEventsTo;
}
public function getIgnoredBogusPlugins()