diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/API/Proxy.php | 2 | ||||
-rw-r--r-- | core/AssetManager/UIAsset/OnDiskUIAsset.php | 19 | ||||
-rw-r--r-- | core/AssetManager/UIAssetFetcher.php | 33 | ||||
-rw-r--r-- | core/AssetManager/UIAssetMerger/StylesheetUIAssetMerger.php | 36 | ||||
-rw-r--r-- | core/Columns/Updater.php | 10 | ||||
-rw-r--r-- | core/Container/ContainerFactory.php | 4 | ||||
-rw-r--r-- | core/Plugin.php | 9 | ||||
-rw-r--r-- | core/Plugin/ArchivedMetric.php | 5 | ||||
-rw-r--r-- | core/Plugin/Manager.php | 180 | ||||
-rw-r--r-- | core/Plugin/MetadataLoader.php | 2 | ||||
-rw-r--r-- | core/Theme.php | 12 | ||||
-rw-r--r-- | core/Twig.php | 28 | ||||
-rw-r--r-- | core/Updater.php | 14 | ||||
-rw-r--r-- | core/bootstrap.php | 2 |
14 files changed, 305 insertions, 51 deletions
diff --git a/core/API/Proxy.php b/core/API/Proxy.php index 1f2ca5a59d..833e905372 100644 --- a/core/API/Proxy.php +++ b/core/API/Proxy.php @@ -442,7 +442,7 @@ class Proxy private function includeApiFile($fileName) { $module = self::getModuleNameFromClassName($fileName); - $path = Manager::getPluginsDirectory() . $module . '/API.php'; + $path = Manager::getPluginDirectory($module) . '/API.php'; if (is_readable($path)) { require_once $path; // prefixed by PIWIK_INCLUDE_PATH diff --git a/core/AssetManager/UIAsset/OnDiskUIAsset.php b/core/AssetManager/UIAsset/OnDiskUIAsset.php index cbd702a691..48557480e0 100644 --- a/core/AssetManager/UIAsset/OnDiskUIAsset.php +++ b/core/AssetManager/UIAsset/OnDiskUIAsset.php @@ -10,6 +10,7 @@ namespace Piwik\AssetManager\UIAsset; use Exception; use Piwik\AssetManager\UIAsset; +use Piwik\Common; use Piwik\Filesystem; class OnDiskUIAsset extends UIAsset @@ -25,13 +26,26 @@ class OnDiskUIAsset extends UIAsset private $relativeLocation; /** + * @var string + */ + private $relativeRootDir; + + /** * @param string $baseDirectory * @param string $fileLocation */ - public function __construct($baseDirectory, $fileLocation) + public function __construct($baseDirectory, $fileLocation, $relativeRootDir = '') { $this->baseDirectory = $baseDirectory; $this->relativeLocation = $fileLocation; + + if (!empty($relativeRootDir) + && is_string($relativeRootDir) + && !Common::stringEndsWith($relativeRootDir, '/')) { + $relativeRootDir .= '/'; + } + + $this->relativeRootDir = $relativeRootDir; } public function getAbsoluteLocation() @@ -41,6 +55,9 @@ class OnDiskUIAsset extends UIAsset public function getRelativeLocation() { + if (isset($this->relativeRootDir)) { + return $this->relativeRootDir . $this->relativeLocation; + } return $this->relativeLocation; } diff --git a/core/AssetManager/UIAssetFetcher.php b/core/AssetManager/UIAssetFetcher.php index 0b8e9b3a55..c9086b0e71 100644 --- a/core/AssetManager/UIAssetFetcher.php +++ b/core/AssetManager/UIAssetFetcher.php @@ -9,6 +9,7 @@ namespace Piwik\AssetManager; use Piwik\AssetManager\UIAsset\OnDiskUIAsset; +use Piwik\Plugin\Manager; use Piwik\Theme; abstract class UIAssetFetcher @@ -89,9 +90,39 @@ abstract class UIAssetFetcher private function populateCatalog() { + $pluginBaseDir = Manager::getPluginsDirectory(); + $pluginWebDirectories = Manager::getAlternativeWebRootDirectories(); + $matomoRootDir = $this->getBaseDirectory(); + foreach ($this->fileLocations as $fileLocation) { + $fileAbsolute = $matomoRootDir . '/' . $fileLocation; + $newUIAsset = new OnDiskUIAsset($this->getBaseDirectory(), $fileLocation); - $this->catalog->addUIAsset($newUIAsset); + if ($newUIAsset->exists()) { + $this->catalog->addUIAsset($newUIAsset); + continue; + } + + $found = false; + + if (strpos($fileAbsolute, $pluginBaseDir) === 0) { + // we iterate over all custom plugin directories only for plugin files, not libs files (not needed there) + foreach ($pluginWebDirectories as $pluginDirectory => $relative) { + $fileTest = str_replace($pluginBaseDir, $pluginDirectory, $fileAbsolute); + $newFileRelative = str_replace($pluginDirectory, '', $fileTest); + $testAsset = new OnDiskUIAsset($pluginDirectory, $newFileRelative, $relative); + if ($testAsset->exists()) { + $this->catalog->addUIAsset($testAsset); + $found = true; + break; + } + } + } + + if (!$found) { + // we add it anyway so it'll trigger an error about the missing file + $this->catalog->addUIAsset($newUIAsset); + } } } diff --git a/core/AssetManager/UIAssetMerger/StylesheetUIAssetMerger.php b/core/AssetManager/UIAssetMerger/StylesheetUIAssetMerger.php index a485a513c9..b3cebc8841 100644 --- a/core/AssetManager/UIAssetMerger/StylesheetUIAssetMerger.php +++ b/core/AssetManager/UIAssetMerger/StylesheetUIAssetMerger.php @@ -15,6 +15,7 @@ use Piwik\AssetManager\UIAssetMerger; use Piwik\Common; use Piwik\Exception\StylesheetLessCompileException; use Piwik\Piwik; +use Piwik\Plugin\Manager; class StylesheetUIAssetMerger extends UIAssetMerger { @@ -191,8 +192,9 @@ class StylesheetUIAssetMerger extends UIAssetMerger private function getCssPathsRewriter($uiAsset) { $baseDirectory = dirname($uiAsset->getRelativeLocation()); + $webDirs = Manager::getAlternativeWebRootDirectories(); - return function ($matches) use ($baseDirectory) { + return function ($matches) use ($baseDirectory, $webDirs) { $absolutePath = PIWIK_DOCUMENT_ROOT . "/$baseDirectory/" . $matches[2]; // Allow to import extension less file @@ -201,13 +203,39 @@ class StylesheetUIAssetMerger extends UIAssetMerger } // Prevent from rewriting full path - $absolutePath = realpath($absolutePath); - if ($absolutePath) { + $absolutePathReal = realpath($absolutePath); + if ($absolutePathReal) { $relativePath = $baseDirectory . "/" . $matches[2]; $relativePath = str_replace('\\', '/', $relativePath); $publicPath = $matches[1] . $relativePath; } else { - $publicPath = $matches[1] . $matches[2]; + foreach ($webDirs as $absPath => $relativePath) { + if (strpos($baseDirectory, $relativePath) === 0) { + if (strpos($matches[2], '.') === 0) { + // eg ../images/ok.png + $fileRelative = $baseDirectory . '/' . $matches[2]; + $fileAbsolute = $absPath . str_replace($relativePath, '', $fileRelative); + if (file_exists($fileAbsolute)) { + return $matches[1] . $fileRelative; + } + } elseif (strpos($matches[2], 'plugins/') === 0) { + // eg plugins/Foo/images/ok.png + $fileRelative = substr($matches[2], strlen('plugins/')); + $fileAbsolute = $absPath . $fileRelative; + if (file_exists($fileAbsolute)) { + return $matches[1] . $relativePath . $fileRelative; + } + } elseif ($matches[1] === '@import "') { + $fileRelative = $baseDirectory . '/' . $matches[2]; + $fileAbsolute = $absPath . str_replace($relativePath, '', $fileRelative); + if (file_exists($fileAbsolute)) { + return $matches[1] . $baseDirectory . '/' . $matches[2]; + } + } + } + } + + $publicPath = $matches[1] . $matches[2]; } return $publicPath; diff --git a/core/Columns/Updater.php b/core/Columns/Updater.php index 1c750753cc..fa41a19d9e 100644 --- a/core/Columns/Updater.php +++ b/core/Columns/Updater.php @@ -342,11 +342,13 @@ class Updater extends \Piwik\Updates private static function getCurrentDimensionFileChanges() { - $files = Filesystem::globr(Manager::getPluginsDirectory() . '*/Columns', '*.php'); - $times = array(); - foreach ($files as $file) { - $times[$file] = filemtime($file); + foreach (Manager::getPluginsDirectories() as $pluginsDir) { + $files = Filesystem::globr($pluginsDir . '*/Columns', '*.php'); + + foreach ($files as $file) { + $times[$file] = filemtime($file); + } } return $times; diff --git a/core/Container/ContainerFactory.php b/core/Container/ContainerFactory.php index e1696db194..39d398782d 100644 --- a/core/Container/ContainerFactory.php +++ b/core/Container/ContainerFactory.php @@ -121,7 +121,7 @@ class ContainerFactory // add plugin environment configs $plugins = $this->pluginList->getActivatedPlugins(); foreach ($plugins as $plugin) { - $baseDir = Manager::getPluginsDirectory() . $plugin; + $baseDir = Manager::getPluginDirectory($plugin); $environmentFile = $baseDir . '/config/' . $environment . '.php'; if (file_exists($environmentFile)) { @@ -135,7 +135,7 @@ class ContainerFactory $plugins = $this->pluginList->getActivatedPlugins(); foreach ($plugins as $plugin) { - $baseDir = Manager::getPluginsDirectory() . $plugin; + $baseDir = Manager::getPluginDirectory($plugin); $file = $baseDir . '/config/config.php'; if (file_exists($file)) { diff --git a/core/Plugin.php b/core/Plugin.php index fcfdc612a7..c0ac9ecb0a 100644 --- a/core/Plugin.php +++ b/core/Plugin.php @@ -355,9 +355,9 @@ class Plugin $cacheId = 'Plugin' . $this->pluginName . $componentName . $expectedSubclass; - $pluginsDir = Manager::getPluginsDirectory(); + $pluginsDir = Manager::getPluginDirectory($this->pluginName); - $componentFile = sprintf('%s%s/%s.php', $pluginsDir, $this->pluginName, $componentName); + $componentFile = sprintf('%s/%s.php', $pluginsDir, $componentName); if ($this->cache->contains($cacheId)) { $classname = $this->cache->fetch($cacheId); @@ -537,8 +537,9 @@ class Plugin { $components = array(); - $pluginsDir = Manager::getPluginsDirectory(); - $baseDir = $pluginsDir . $this->pluginName . '/' . $directoryWithinPlugin; + $pluginsDir = Manager::getPluginDirectory($this->pluginName); + $baseDir = $pluginsDir . '/' . $directoryWithinPlugin; + $files = Filesystem::globr($baseDir, '*.php'); foreach ($files as $file) { diff --git a/core/Plugin/ArchivedMetric.php b/core/Plugin/ArchivedMetric.php index 05fa3d8665..f68a1f2c10 100644 --- a/core/Plugin/ArchivedMetric.php +++ b/core/Plugin/ArchivedMetric.php @@ -64,6 +64,11 @@ class ArchivedMetric extends Metric $this->aggregation = $aggregation; } + public function getAggregation() + { + return $this->aggregation; + } + public function setDimension($dimension) { $this->dimension = $dimension; diff --git a/core/Plugin/Manager.php b/core/Plugin/Manager.php index d25234c735..f48f8416fb 100644 --- a/core/Plugin/Manager.php +++ b/core/Plugin/Manager.php @@ -12,11 +12,13 @@ namespace Piwik\Plugin; use Piwik\Application\Kernel\PluginList; use Piwik\Cache; use Piwik\Columns\Dimension; +use Piwik\Common; use Piwik\Config; use Piwik\Config as PiwikConfig; use Piwik\Container\StaticContainer; use Piwik\Development; use Piwik\EventDispatcher; +use Piwik\Exception\Exception; use Piwik\Exception\PluginDeactivatedException; use Piwik\Filesystem; use Piwik\Log; @@ -26,7 +28,6 @@ use Piwik\Plugin; use Piwik\Plugin\Dimension\ActionDimension; use Piwik\Plugin\Dimension\ConversionDimension; use Piwik\Plugin\Dimension\VisitDimension; -use Piwik\Plugins\Marketplace\Api\Client; use Piwik\Settings\Storage as SettingsStorage; use Piwik\SettingsPiwik; use Piwik\Theme; @@ -52,6 +53,8 @@ class Manager protected $doLoadPlugins = true; + protected static $pluginsToPathCache = array(); + private $pluginsLoadedAndActivated; /** @@ -316,21 +319,164 @@ class Manager */ public function readPluginsDirectory() { - $pluginsName = _glob(self::getPluginsDirectory() . '*', GLOB_ONLYDIR); $result = array(); - if ($pluginsName != false) { - foreach ($pluginsName as $path) { - if (self::pluginStructureLooksValid($path)) { - $result[] = basename($path); + foreach (self::getPluginsDirectories() as $pluginsDir) { + $pluginsName = _glob($pluginsDir . '*', GLOB_ONLYDIR); + if ($pluginsName != false) { + foreach ($pluginsName as $path) { + if (self::pluginStructureLooksValid($path)) { + $result[] = basename($path); + } } } } + + sort($result); + return $result; } + public static function initPluginDirectories() + { + $envDirs = getenv('MATOMO_PLUGIN_DIRS'); + if (!empty($envDirs)) { + // we expect it in the format `absoluteStorageDir1;webrootPathRelative1:absoluteStorageDir2;webrootPathRelative1` + if (empty($GLOBALS['MATOMO_PLUGIN_DIRS'])) { + $GLOBALS['MATOMO_PLUGIN_DIRS'] = array(); + } + + $envDirs = explode(':', $envDirs); + foreach ($envDirs as $envDir) { + $envDir = explode(';', $envDir); + $absoluteDir = rtrim($envDir[0], '/') . '/'; + $GLOBALS['MATOMO_PLUGIN_DIRS'][] = array( + 'pluginsPathAbsolute' => $absoluteDir, + 'webrootDirRelativeToMatomo' => isset($envDir[1]) ? $envDir[1] : null, + ); + } + } + + if (!empty($GLOBALS['MATOMO_PLUGIN_DIRS'])) { + foreach ($GLOBALS['MATOMO_PLUGIN_DIRS'] as $pluginDir => &$settings) { + if (!isset($settings['pluginsPathAbsolute'])) { + throw new \Exception('Missing "pluginsPathAbsolute" configuration for plugin dir'); + } + if (!isset($settings['webrootDirRelativeToMatomo'])) { + throw new \Exception('Missing "webrootDirRelativeToMatomo" configuration for plugin dir'); + } + } + + $pluginDirs = self::getPluginsDirectories(); + if (count($pluginDirs) > 1) { + spl_autoload_register(function ($className) use ($pluginDirs) { + if (strpos($className, 'Piwik\Plugins\\') === 0) { + $withoutPrefix = str_replace('Piwik\Plugins\\', '', $className); + $path = str_replace('\\', DIRECTORY_SEPARATOR, $withoutPrefix) . '.php'; + foreach ($pluginDirs as $pluginsDirectory) { + if (file_exists($pluginsDirectory . $path)) { + require_once $pluginsDirectory . $path; + } + } + } + }); + } + } + } + + public static function getAlternativeWebRootDirectories() + { + $dirs = array(); + + if (!empty($GLOBALS['MATOMO_PLUGIN_DIRS'])) { + foreach ($GLOBALS['MATOMO_PLUGIN_DIRS'] as $pluginDir) { + $absolute = rtrim($pluginDir['pluginsPathAbsolute'], '/') . '/'; + $relative = rtrim($pluginDir['webrootDirRelativeToMatomo'], '/') . '/'; + $dirs[$absolute] = $relative; + } + } + + return $dirs; + } + + /** + * Returns the path to all plugins directories. Each plugins directory may contain several plugins. + * All paths have a trailing slash '/'. + * @return string[] + * @api + */ + public static function getPluginsDirectories() + { + $dirs = array(self::getPluginsDirectory()); + + if (!empty($GLOBALS['MATOMO_PLUGIN_DIRS'])) { + $extraDirs = array_map(function ($dir) { + return rtrim($dir['pluginsPathAbsolute'], '/') . '/'; + }, $GLOBALS['MATOMO_PLUGIN_DIRS']); + $dirs = array_merge($dirs, $extraDirs); + } + + return $dirs; + } + + private static function getPluginRealPath($path) + { + if (strpos($path, '../') !== false) { + // for tests, only do it when needed re performance etc + $real = realpath($path); + if ($real && Common::stringEndsWith($path, '/')) { + return rtrim($real, '/') . '/'; + } + if ($real) { + return $real; + } + } + return $path; + } + + /** + * Gets the path to a specific plugin. If the plugin does not exist in any plugins folder, the default plugins + * folder will be assumed. + * + * @param $pluginName + * @return mixed|string + * @api + */ + public static function getPluginDirectory($pluginName) + { + if (isset(self::$pluginsToPathCache[$pluginName])) { + return self::$pluginsToPathCache[$pluginName]; + } + + $corePluginsDir = PIWIK_INCLUDE_PATH . 'plugins/' . $pluginName; + if (is_dir($corePluginsDir)) { + // for faster performance + self::$pluginsToPathCache[$pluginName] = self::getPluginRealPath($corePluginsDir); + return self::$pluginsToPathCache[$pluginName]; + } + + foreach (self::getPluginsDirectories() as $dir) { + $path = $dir . $pluginName; + if (is_dir($path)) { + self::$pluginsToPathCache[$pluginName] = self::getPluginRealPath($path); + return $path; + } + } + + // assume default directory when plugin does not exist just yet + return self::getPluginsDirectory() . $pluginName; + } + + /** + * Returns the path to the directory where core plugins are located. Please note since Matomo 3.9 + * plugins may also be located in other directories and therefore this method has been deprecated. + * @deprecated since Matomo 3.9.0 use {@link (getPluginsDirectories())} or {@link getPluginDirectory($pluginName)} instead + * @return string + */ public static function getPluginsDirectory() { - return PIWIK_INCLUDE_PATH . '/plugins/'; + $path = rtrim(PIWIK_INCLUDE_PATH, '/') . '/plugins/'; + $path = self::getPluginRealPath($path); + return $path; } /** @@ -459,8 +605,11 @@ class Manager public static function deletePluginFromFilesystem($plugin) { - $pluginDir = self::getPluginsDirectory(); - Filesystem::unlinkRecursive($pluginDir . $plugin, $deleteRootToo = true); + $pluginDir = self::getPluginDirectory($plugin); + if (strpos($pluginDir, PIWIK_INCLUDE_PATH) === 0) { + // only delete files for plugins within matomo directory... + Filesystem::unlinkRecursive($pluginDir, $deleteRootToo = true); + } } /** @@ -633,7 +782,7 @@ class Manager 'uninstallable' => true, ); } else { - $translator->addDirectory(self::getPluginsDirectory() . $pluginName . '/lang'); + $translator->addDirectory(self::getPluginDirectory($pluginName) . '/lang'); $this->loadPlugin($pluginName); $info = array( 'activated' => $this->isPluginActivated($pluginName), @@ -694,7 +843,8 @@ class Manager return true; } - $path = self::getPluginsDirectory() . $pluginName; + $path = self::getPluginDirectory($pluginName); + if (!$this->isManifestFileFound($path)) { return true; } @@ -1006,14 +1156,14 @@ class Manager */ protected function makePluginClass($pluginName) { - $pluginFileName = sprintf("%s/%s.php", $pluginName, $pluginName); $pluginClassName = $pluginName; if (!$this->isValidPluginName($pluginName)) { - throw new \Exception(sprintf("The plugin filename '%s' is not a valid plugin name", $pluginFileName)); + throw new \Exception(sprintf("The plugin name '%s' is not a valid plugin name", $pluginName)); } - $path = self::getPluginsDirectory() . $pluginFileName; + $path = self::getPluginDirectory($pluginName); + $path = sprintf('%s/%s.php', $path, $pluginName); if (!file_exists($path)) { // Create the smallest minimal Piwik Plugin @@ -1470,7 +1620,7 @@ class Manager /** @var Translator $translator */ $translator = StaticContainer::get('Piwik\Translation\Translator'); foreach ($this->getAllPluginsNames() as $pluginName) { - $translator->addDirectory(self::getPluginsDirectory() . $pluginName . '/lang'); + $translator->addDirectory(self::getPluginDirectory($pluginName) . '/lang'); } } } diff --git a/core/Plugin/MetadataLoader.php b/core/Plugin/MetadataLoader.php index 80eae18a80..a28f4cfc43 100644 --- a/core/Plugin/MetadataLoader.php +++ b/core/Plugin/MetadataLoader.php @@ -133,7 +133,7 @@ class MetadataLoader */ private function getPathToPluginFolder() { - return \Piwik\Plugin\Manager::getPluginsDirectory() . $this->pluginName; + return \Piwik\Plugin\Manager::getPluginDirectory($this->pluginName); } /** diff --git a/core/Theme.php b/core/Theme.php index ed6261334c..e6eb8756c9 100644 --- a/core/Theme.php +++ b/core/Theme.php @@ -75,7 +75,8 @@ class Theme public function rewriteAssetsPathToTheme($output) { - if ($this->themeName == \Piwik\Plugin\Manager::DEFAULT_THEME) { + if ($this->themeName == \Piwik\Plugin\Manager::DEFAULT_THEME + && !Manager::getAlternativeWebRootDirectories()) { return $output; } @@ -140,6 +141,15 @@ class Theme if (file_exists($fileToCheck)) { return str_replace($pathAsset, $overridingAsset, $source); } + + // not rewritten by theme, but may be located in custom webroot directory + foreach (Manager::getAlternativeWebRootDirectories() as $absDir => $webRootDirectory) { + $withoutPlugins = str_replace('plugins/', '', $pathAsset); + if (file_exists($absDir . '/' . $withoutPlugins)) { + return $webRootDirectory . $withoutPlugins; + } + } + return $source; } diff --git a/core/Twig.php b/core/Twig.php index 4b5f1e51ea..cac8624201 100644 --- a/core/Twig.php +++ b/core/Twig.php @@ -313,9 +313,8 @@ class Twig */ private function getDefaultThemeLoader() { - $themeLoader = new Twig_Loader_Filesystem(array( - sprintf("%s%s/templates/", Manager::getPluginsDirectory(), \Piwik\Plugin\Manager::DEFAULT_THEME) - ), PIWIK_DOCUMENT_ROOT.DIRECTORY_SEPARATOR); + $themeDir = Manager::getPluginDirectory(\Piwik\Plugin\Manager::DEFAULT_THEME) . '/templates/'; + $themeLoader = new Twig_Loader_Filesystem(array($themeDir), PIWIK_DOCUMENT_ROOT.DIRECTORY_SEPARATOR); return $themeLoader; } @@ -327,13 +326,13 @@ class Twig */ protected function getCustomThemeLoader(Plugin $theme) { - $pluginsDir = Manager::getPluginsDirectory(); - if (!file_exists(sprintf("%s%s/templates/", $pluginsDir, $theme->getPluginName()))) { + $pluginsDir = Manager::getPluginDirectory($theme->getPluginName()); + $themeDir = $pluginsDir . '/templates/'; + + if (!file_exists($themeDir)) { return false; } - $themeLoader = new Twig_Loader_Filesystem(array( - sprintf("%s%s/templates/", $pluginsDir, $theme->getPluginName()) - ), PIWIK_DOCUMENT_ROOT.DIRECTORY_SEPARATOR); + $themeLoader = new Twig_Loader_Filesystem(array($themeDir), PIWIK_DOCUMENT_ROOT.DIRECTORY_SEPARATOR); return $themeLoader; } @@ -522,11 +521,11 @@ class Twig $pluginManager = \Piwik\Plugin\Manager::getInstance(); $plugins = $pluginManager->getAllPluginsNames(); - $pluginsDir = Manager::getPluginsDirectory(); foreach ($plugins as $name) { - $path = sprintf("%s%s/templates/", $pluginsDir, $name); + $pluginsDir = Manager::getPluginDirectory($name); + $path = sprintf("%s/templates/", $pluginsDir); if (is_dir($path)) { - $loader->addPath($pluginsDir . $name . '/templates', $name); + $loader->addPath(rtrim($path, '/'), $name); } } } @@ -541,12 +540,11 @@ class Twig $pluginManager = \Piwik\Plugin\Manager::getInstance(); $plugins = $pluginManager->getAllPluginsNames(); - $pluginsDir = Manager::getPluginsDirectory(); - foreach ($plugins as $name) { - $path = sprintf("%s%s/templates/plugins/%s/", $pluginsDir, $pluginName, $name); + $pluginsDir = Manager::getPluginDirectory($name); + $path = sprintf("%s/templates/plugins/%s/", $pluginsDir, $name); if (is_dir($path)) { - $loader->addPath($pluginsDir . $pluginName . '/templates/plugins/'. $name, $name); + $loader->addPath(rtrim($path, '/'), $name); } } } diff --git a/core/Updater.php b/core/Updater.php index 9af07459b2..85c52e309b 100644 --- a/core/Updater.php +++ b/core/Updater.php @@ -63,7 +63,13 @@ class Updater public function __construct($pathUpdateFileCore = null, $pathUpdateFilePlugins = null, Columns\Updater $columnsUpdater = null) { $this->pathUpdateFileCore = $pathUpdateFileCore ?: PIWIK_INCLUDE_PATH . '/core/Updates/'; - $this->pathUpdateFilePlugins = $pathUpdateFilePlugins ?: Manager::getPluginsDirectory() . '%s/Updates/'; + + if ($pathUpdateFilePlugins) { + $this->pathUpdateFilePlugins = $pathUpdateFilePlugins; + } else { + $this->pathUpdateFilePlugins = null; + } + $this->columnsUpdater = $columnsUpdater ?: new Columns\Updater(); self::$activeInstance = $this; @@ -345,7 +351,11 @@ class Updater } elseif (ColumnUpdater::isDimensionComponent($name)) { $componentsWithUpdateFile[$name][PIWIK_INCLUDE_PATH . '/core/Columns/Updater.php'] = $newVersion; } else { - $pathToUpdates = sprintf($this->pathUpdateFilePlugins, $name) . '*.php'; + if ($this->pathUpdateFilePlugins) { + $pathToUpdates = sprintf($this->pathUpdateFilePlugins, $name) . '*.php'; + } else { + $pathToUpdates = Manager::getPluginDirectory($name) . '/Updates/*.php'; + } } if (!empty($pathToUpdates)) { diff --git a/core/bootstrap.php b/core/bootstrap.php index f0cae7495e..004ce59327 100644 --- a/core/bootstrap.php +++ b/core/bootstrap.php @@ -41,6 +41,8 @@ require_once PIWIK_INCLUDE_PATH . '/libs/upgradephp/upgrade.php'; // Composer autoloader require_once PIWIK_VENDOR_PATH . '/autoload.php'; +\Piwik\Plugin\Manager::initPluginDirectories(); + /** * Eaccelerator does not support closures and is known to be not comptabile with Piwik. Therefore we are disabling * it automatically. At this point it looks like Eaccelerator is no longer under development and the bug has not |