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
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/API/Proxy.php2
-rw-r--r--core/AssetManager/UIAsset/OnDiskUIAsset.php19
-rw-r--r--core/AssetManager/UIAssetFetcher.php33
-rw-r--r--core/AssetManager/UIAssetMerger/StylesheetUIAssetMerger.php36
-rw-r--r--core/Columns/Updater.php10
-rw-r--r--core/Container/ContainerFactory.php4
-rw-r--r--core/Plugin.php9
-rw-r--r--core/Plugin/ArchivedMetric.php5
-rw-r--r--core/Plugin/Manager.php180
-rw-r--r--core/Plugin/MetadataLoader.php2
-rw-r--r--core/Theme.php12
-rw-r--r--core/Twig.php28
-rw-r--r--core/Updater.php14
-rw-r--r--core/bootstrap.php2
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