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; + } }