diff options
author | Thomas Steur <thomas.steur@gmail.com> | 2013-09-13 06:05:01 +0400 |
---|---|---|
committer | Thomas Steur <thomas.steur@gmail.com> | 2013-09-13 06:09:32 +0400 |
commit | a752dec91b0e236c0ecf10f3f3d67e69cdc5a08e (patch) | |
tree | 762c26487be87b32026d0c06350d13ba5bf04f01 /plugins | |
parent | 330bde599424559dee2d08fef4fc1743aa76c2fe (diff) |
current state of installing plugin from marketplace
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/CorePluginsAdmin/Controller.php | 15 | ||||
-rw-r--r-- | plugins/CorePluginsAdmin/MarketplaceApiClient.php | 26 | ||||
-rw-r--r-- | plugins/CorePluginsAdmin/PluginInstaller.php | 111 | ||||
-rw-r--r-- | plugins/CorePluginsAdmin/templates/browsePlugins.twig | 2 | ||||
-rw-r--r-- | plugins/CorePluginsAdmin/templates/browseThemes.twig | 2 |
5 files changed, 153 insertions, 3 deletions
diff --git a/plugins/CorePluginsAdmin/Controller.php b/plugins/CorePluginsAdmin/Controller.php index 0f4ddc6022..d5ae70cf41 100644 --- a/plugins/CorePluginsAdmin/Controller.php +++ b/plugins/CorePluginsAdmin/Controller.php @@ -13,6 +13,7 @@ namespace Piwik\Plugins\CorePluginsAdmin; use Piwik\Piwik; use Piwik\Common; use Piwik\Config; +use Piwik\Plugin; use Piwik\View; use Piwik\Url; @@ -25,6 +26,20 @@ class Controller extends \Piwik\Controller\Admin private $validSortMethods = array('popular', 'newest', 'alpha'); private $defaultSortMethod = 'popular'; + public function installPlugin() + { + $pluginName = Common::getRequestVar('pluginName', '', 'string'); + + if (empty($pluginName)) { + return; + } + + $pluginInstaller = new PluginInstaller($pluginName); + $pluginInstaller->installOrUpdatePluginFromMarketplace(); + + // \Piwik\PluginsManager::getInstance()->activatePlugin($pluginName); + } + public function browsePlugins() { $query = Common::getRequestVar('query', '', 'string', $_POST); diff --git a/plugins/CorePluginsAdmin/MarketplaceApiClient.php b/plugins/CorePluginsAdmin/MarketplaceApiClient.php index 4578a211b3..f3b1e40eaa 100644 --- a/plugins/CorePluginsAdmin/MarketplaceApiClient.php +++ b/plugins/CorePluginsAdmin/MarketplaceApiClient.php @@ -15,7 +15,7 @@ use Piwik\Http; * * @package CorePluginsAdmin */ -class MarketplaceApiClient extends \Piwik\Controller\Admin +class MarketplaceApiClient { private function fetch($method, $params) @@ -31,6 +31,30 @@ class MarketplaceApiClient extends \Piwik\Controller\Admin return $result; } + private function getInfo($name) + { + $method = sprintf('plugins/%s/info', $name); + return $this->fetch($method, array()); + } + + public function download($pluginOrThemeName, $target) + { + $plugin = $this->getInfo($pluginOrThemeName); + + if (empty($plugin)) { + // TODO throw exception notExistingPlugin + return; + } + + $latestVersion = array_pop($plugin->versions); + + $downloadUrl = $latestVersion->download; + + $success = Http::fetchRemoteFile($downloadUrl, $target); + + return $success; + } + public function searchForPlugins($keywords, $query, $sort) { $response = $this->fetch('plugins', array('keywords' => $keywords, 'query' => $query, 'sort' => $sort)); diff --git a/plugins/CorePluginsAdmin/PluginInstaller.php b/plugins/CorePluginsAdmin/PluginInstaller.php new file mode 100644 index 0000000000..c6c54b89c1 --- /dev/null +++ b/plugins/CorePluginsAdmin/PluginInstaller.php @@ -0,0 +1,111 @@ +<?php +/** + * Piwik - Open source web analytics + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + * @category Piwik_Plugins + * @package CorePluginsAdmin + */ +namespace Piwik\Plugins\CorePluginsAdmin; +use Piwik\Http; +use Piwik\Piwik; +use Piwik\Unzip; + +/** + * + * @package CorePluginsAdmin + */ +class PluginInstaller +{ + const PATH_TO_DOWNLOAD = '/tmp/plugins/'; + const PATH_TO_EXTRACT = '/plugins/'; + + private $pluginName; + + public function __construct($pluginName) + { + $this->pluginName = $pluginName; + } + + public function installOrUpdatePluginFromMarketplace() + { + $tmpPluginZip = PIWIK_USER_PATH . self::PATH_TO_DOWNLOAD . $this->pluginName . '.zip'; + $tmpPluginFolder = PIWIK_USER_PATH . self::PATH_TO_DOWNLOAD . $this->pluginName; + + $this->makeSureFoldersAreWritable(); + $this->downloadPluginFromMarketplace($tmpPluginZip); + $this->extractPluginFiles($tmpPluginZip, $tmpPluginFolder); + $this->copyPluginToDestination($tmpPluginFolder); + + $this->removeFileIfExists($tmpPluginZip); + $this->removeFolderIfExists($tmpPluginFolder); + } + + private function makeSureFoldersAreWritable() + { + Piwik::dieIfDirectoriesNotWritable(array(self::PATH_TO_DOWNLOAD, self::PATH_TO_EXTRACT)); + } + + private function downloadPluginFromMarketplace($pluginZipTargetFile) + { + $this->removeFileIfExists($pluginZipTargetFile); + + $marketplace = new MarketplaceApiClient(); + $success = $marketplace->download($this->pluginName, $pluginZipTargetFile); + + if (!$success) { + throw new \Exception('Failed to download plugin'); + } + } + + /** + * @param $pluginZipFile + * @param $pathExtracted + * @throws \Exception + */ + private function extractPluginFiles($pluginZipFile, $pathExtracted) + { + $archive = Unzip::factory('PclZip', $pluginZipFile); + + $this->removeFolderIfExists($pathExtracted); + + if (0 == ($pluginFiles = $archive->extract($pathExtracted))) { + throw new \Exception(Piwik_TranslateException('Plugin_ExceptionArchiveIncompatible', $archive->errorInfo())); + } + + if (0 == count($pluginFiles)) { + throw new \Exception(Piwik_TranslateException('Plugin Zip File Is Empty')); + } + } + + private function copyPluginToDestination($tmpPluginFolder) + { + $pluginTargetPath = PIWIK_USER_PATH . self::PATH_TO_EXTRACT . $this->pluginName; + + $this->removeFolderIfExists($pluginTargetPath); + Piwik::copyRecursive($tmpPluginFolder, $pluginTargetPath); + } + + /** + * @param $pathExtracted + */ + private function removeFolderIfExists($pathExtracted) + { + if (file_exists($pathExtracted)) { + Piwik::unlinkRecursive($pathExtracted, true); + } + } + + /** + * @param $targetTmpFile + */ + private function removeFileIfExists($targetTmpFile) + { + if (file_exists($targetTmpFile)) { + unlink($targetTmpFile); + } + } + +} diff --git a/plugins/CorePluginsAdmin/templates/browsePlugins.twig b/plugins/CorePluginsAdmin/templates/browsePlugins.twig index 8f0b09bc4c..b4b22bac63 100644 --- a/plugins/CorePluginsAdmin/templates/browsePlugins.twig +++ b/plugins/CorePluginsAdmin/templates/browsePlugins.twig @@ -33,7 +33,7 @@ <div class="plugin"> - <a href="#" class="install">Install</a> + <a href="{{ linkTo({'action': 'installPlugin', 'pluginName': plugin.name}) }}" class="install">Install</a> <h3>{{ plugin.name }}</h3> <p class="description">{{ plugin.description }}</p> diff --git a/plugins/CorePluginsAdmin/templates/browseThemes.twig b/plugins/CorePluginsAdmin/templates/browseThemes.twig index b9ad21a1ff..c23932544c 100644 --- a/plugins/CorePluginsAdmin/templates/browseThemes.twig +++ b/plugins/CorePluginsAdmin/templates/browseThemes.twig @@ -35,7 +35,7 @@ <div class="plugin"> - <a href="#" class="install">Install</a> + <a href="{{ linkTo({'action': 'installPlugin', 'pluginName': plugin.name}) }}" class="install">Install</a> <h3>{{ plugin.name }}</h3> <p class="description">{{ plugin.description }}</p> |