diff --git a/module/extension/control.php b/module/extension/control.php
index eff8594085..caaff06a51 100644
--- a/module/extension/control.php
+++ b/module/extension/control.php
@@ -360,8 +360,10 @@ class extension extends control
$this->extension->executeDB($extension, 'uninstall');
$this->extension->updateExtension($extension, array('status' => 'available'));
+ $this->extension->togglePackageDisable($extension, 'disabled');
+
+ $this->view->title = $this->lang->extension->uninstallFinished;
$this->view->removeCommands = $this->extension->removePackage($extension);
- $this->view->title = $this->lang->extension->uninstallFinished;
if($postUninstallHook = $this->extension->getHookFile($extension, 'postuninstall')) include $postUninstallHook;
$this->display();
@@ -388,6 +390,7 @@ class extension extends control
}
}
+ $this->extension->togglePackageDisable($extension, 'active');
$this->extension->copyPackageFiles($extension);
$this->extension->updateExtension($extension, array('status' => 'installed'));
$this->view->title = $this->lang->extension->activateFinished;
@@ -405,6 +408,7 @@ class extension extends control
public function deactivate($extension)
{
$this->extension->updateExtension($extension, array('status' => 'deactivated'));
+ $this->extension->togglePackageDisable($extension, 'disabled');
$this->view->removeCommands = $this->extension->removePackage($extension);
$this->view->title = $this->lang->extension->deactivateFinished;
$this->view->position[] = $this->lang->extension->deactivateFinished;
@@ -435,6 +439,8 @@ class extension extends control
$tmpName = $_FILES['file']['tmp_name'];
$fileName = $_FILES['file']['name'];
$dest = $this->app->getTmpRoot() . "extension/$fileName";
+
+ if(!is_dir(dirname($dest))) mkdir(dirname($dest));
if(!move_uploaded_file($tmpName, $dest))
{
$downloadPath = $this->app->getTmpRoot() . 'extension/';
diff --git a/module/extension/model.php b/module/extension/model.php
index c4214f2f39..1d97d6f30c 100644
--- a/module/extension/model.php
+++ b/module/extension/model.php
@@ -24,6 +24,14 @@ class extensionModel extends model
*/
public $apiRoot;
+ /**
+ * The package root.
+ *
+ * @var string
+ * @access public
+ */
+ public $pkgRoot;
+
/**
* The construct function.
*
@@ -35,6 +43,7 @@ class extensionModel extends model
parent::__construct();
$this->setApiRoot();
$this->classFile = $this->app->loadClass('zfile');
+ $this->pkgRoot = $this->app->getExtensionRoot() . 'pkg' . DS;
}
/**
@@ -216,7 +225,7 @@ class extensionModel extends model
$info = new stdclass();
/* First, try ini file. before 2.5 version. */
- $infoFile = "ext/$extension/doc/copyright.txt";
+ $infoFile = $this->pkgRoot . "$extension/doc/copyright.txt";
if(file_exists($infoFile)) return (object)parse_ini_file($infoFile);
/**
@@ -225,8 +234,8 @@ class extensionModel extends model
/* Try the yaml of current lang, then try en. */
$lang = $this->app->getClientLang();
- $infoFile = "ext/$extension/doc/$lang.yaml";
- if(!file_exists($infoFile)) $infoFile = "ext/$extension/doc/en.yaml";
+ $infoFile = $this->pkgRoot . "$extension/doc/$lang.yaml";
+ if(!file_exists($infoFile)) $infoFile = $this->pkgRoot . "$extension/doc/en.yaml";
if(!file_exists($infoFile)) return $info;
/* Load the yaml file and parse it into object. */
@@ -284,9 +293,6 @@ class extensionModel extends model
}
}
- /* Append the paths to stored the extracted files. */
- $paths[] = "module/extension/ext/";
-
return array_unique($paths);
}
@@ -299,7 +305,7 @@ class extensionModel extends model
*/
public function getFilesFromPackage($extension)
{
- $extensionDir = "ext/$extension/";
+ $extensionDir = $this->pkgRoot . $extension;
$files = $this->classFile->readDir($extensionDir, array('db', 'doc'));
return $files;
}
@@ -357,7 +363,7 @@ class extensionModel extends model
*/
public function getHookFile($extension, $hook)
{
- $hookFile = "ext/$extension/hook/$hook.php";
+ $hookFile = $this->pkgRoot . "$extension/hook/$hook.php";
if(file_exists($hookFile)) return $hookFile;
return false;
}
@@ -372,7 +378,7 @@ class extensionModel extends model
*/
public function getDBFile($extension, $method = 'install')
{
- return "ext/$extension/db/$method.sql";
+ return $this->pkgRoot . "$extension/db/$method.sql";
}
/**
@@ -427,6 +433,18 @@ class extensionModel extends model
$checkResult->chmodCommands = '';
$checkResult->dirs2Created = array();
+ if(!is_dir($this->pkgRoot) and !mkdir($this->pkgRoot))
+ {
+ $checkResult->errors .= sprintf($this->lang->extension->errorTargetPathNotExists, $this->pkgRoot) . '
';
+ $checkResult->mkdirCommands .= "sudo mkdir -p {$this->pkgRoot}
";
+ $checkResult->chmodCommands .= "sudo chmod -R 777 {$this->pkgRoot}
";
+ }
+ if(is_dir($this->pkgRoot) and !is_writable($this->pkgRoot))
+ {
+ $checkResult->errors .= sprintf($this->lang->extension->errorTargetPathNotWritable, $this->pkgRoot) . '
';
+ $checkResult->chmodCommands .= "sudo chmod -R 777 {$this->pkgRoot}
";
+ }
+
$appRoot = $this->app->getAppRoot();
$paths = $this->getPathsFromPackage($extension);
foreach($paths as $path)
@@ -456,7 +474,7 @@ class extensionModel extends model
$checkResult->errors .= sprintf($this->lang->extension->errorTargetPathNotExists, $path) . '
';
$checkResult->mkdirCommands .= "sudo mkdir -p $path
";
}
- if(file_exists($path) and realpath($path) != realpath($appRoot . 'module/extension') . 'ext') $checkResult->dirs2Created[] = $path;
+ if(file_exists($path) and realpath($path) != $this->pkgRoot) $checkResult->dirs2Created[] = $path;
}
}
@@ -501,7 +519,7 @@ class extensionModel extends model
$appRoot = $this->app->getAppRoot();
foreach($extensionFiles as $extensionFile)
{
- $compareFile = $appRoot . str_replace(realpath("ext/$extension") . '/', '', $extensionFile);
+ $compareFile = $appRoot . str_replace($this->pkgRoot . $extension . DS, '', $extensionFile);
if(!file_exists($compareFile)) continue;
if(md5_file($extensionFile) != md5_file($compareFile)) $return->error .= $compareFile . '
';
}
@@ -524,7 +542,7 @@ class extensionModel extends model
$return->error = '';
/* try remove pre extracted files. */
- $extensionPath = "ext/$extension";
+ $extensionPath = $this->pkgRoot . $extension;
if(is_dir($extensionPath)) $this->classFile->removeDir($extensionPath);
/* Extract files. */
@@ -554,7 +572,7 @@ class extensionModel extends model
public function copyPackageFiles($extension)
{
$appRoot = $this->app->getAppRoot();
- $extensionDir = "ext/$extension/";
+ $extensionDir = $this->pkgRoot . $extension . DS;
$paths = scandir($extensionDir);
$copiedFiles = array();
@@ -686,7 +704,7 @@ class extensionModel extends model
}
/* Remove the extracted files. */
- $extractedDir = realpath("ext/$extension");
+ $extractedDir = $this->pkgRoot . $extension;
if($extractedDir and $extractedDir != '/' and !$this->classFile->removeDir($extractedDir))
{
$removeCommands[] = PHP_OS == 'Linux' ? "rm -fr $extractedDir" : "rmdir $extractedDir /s";
@@ -967,4 +985,22 @@ class extensionModel extends model
}
return $plugins;
}
+
+ /**
+ * Mark package active or disabled
+ *
+ * @param string $extension
+ * @param string $action disabled|active
+ * @access public
+ * @return bool
+ */
+ public function togglePackageDisable($extension, $action = 'disabled')
+ {
+ if(!is_dir($this->pkgRoot . $extension)) return true;
+
+ $disabledFile = $this->pkgRoot . $extension . DS . 'disabled';
+ if($action == 'disabled') touch($disabledFile);
+ if($action == 'active' && file_exists($disabledFile)) unlink($disabledFile);
+ return true;
+ }
}