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:
authorThomas Steur <thomas.steur@gmail.com>2013-09-13 06:05:01 +0400
committerThomas Steur <thomas.steur@gmail.com>2013-09-13 06:09:32 +0400
commita752dec91b0e236c0ecf10f3f3d67e69cdc5a08e (patch)
tree762c26487be87b32026d0c06350d13ba5bf04f01 /plugins
parent330bde599424559dee2d08fef4fc1743aa76c2fe (diff)
current state of installing plugin from marketplace
Diffstat (limited to 'plugins')
-rw-r--r--plugins/CorePluginsAdmin/Controller.php15
-rw-r--r--plugins/CorePluginsAdmin/MarketplaceApiClient.php26
-rw-r--r--plugins/CorePluginsAdmin/PluginInstaller.php111
-rw-r--r--plugins/CorePluginsAdmin/templates/browsePlugins.twig2
-rw-r--r--plugins/CorePluginsAdmin/templates/browseThemes.twig2
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>