/** * Uninstalls a package. * * @param bool $installDump When TRUE, the sql dump will be importet * * @throws rex_functional_exception * * @return bool TRUE on success, FALSE on error */ public function uninstall($installDump = true) { $isActivated = $this->package->isAvailable(); if ($isActivated && !$this->deactivate()) { return false; } try { $this->package->setProperty('install', false); // include uninstall.php if (is_readable($this->package->getPath(rex_package::FILE_UNINSTALL))) { if (!$isActivated) { rex_i18n::addDirectory($this->package->getPath('lang')); } $this->package->includeFile(rex_package::FILE_UNINSTALL); if (($instmsg = $this->package->getProperty('installmsg', '')) != '') { throw new rex_functional_exception($instmsg); } if ($this->package->isInstalled()) { throw new rex_functional_exception($this->i18n('no_reason')); } } // import uninstall.sql $uninstallSql = $this->package->getPath(rex_package::FILE_UNINSTALL_SQL); if ($installDump === true && is_readable($uninstallSql)) { rex_sql_util::importDump($uninstallSql); } // delete assets $assets = $this->package->getAssetsPath(); if (is_dir($assets) && !rex_dir::delete($assets)) { throw new rex_functional_exception($this->i18n('install_cant_delete_files')); } rex_config::removeNamespace($this->package->getPackageId()); $this->saveConfig(); $this->message = $this->i18n('uninstalled', $this->package->getName()); return true; } catch (rex_functional_exception $e) { $this->message = $e->getMessage(); } catch (rex_sql_exception $e) { $this->message = 'SQL error: ' . $e->getMessage(); } $this->package->setProperty('install', true); if ($isActivated) { $this->package->setProperty('status', true); } $this->saveConfig(); $this->message = $this->i18n('no_uninstall', $this->package->getName()) . '<br />' . $this->message; return false; }
/** * Installs a package. * * @param bool $installDump When TRUE, the sql dump will be importet * * @throws rex_functional_exception * * @return bool TRUE on success, FALSE on error */ public function install($installDump = true) { try { // check package directory perms $install_dir = $this->package->getPath(); if (!rex_dir::isWritable($install_dir)) { throw new rex_functional_exception($this->i18n('dir_not_writable', $install_dir)); } // check package.yml if (!is_readable($this->package->getPath(rex_package::FILE_PACKAGE))) { throw new rex_functional_exception($this->i18n('missing_yml_file')); } $packageId = $this->package->getProperty('package'); if ($packageId === null) { throw new rex_functional_exception($this->i18n('missing_id', $this->package->getPackageId())); } if ($packageId != $this->package->getPackageId()) { $parts = explode('/', $packageId, 2); throw new rex_functional_exception($this->wrongPackageId($parts[0], isset($parts[1]) ? $parts[1] : null)); } if ($this->package->getVersion() === null) { throw new rex_functional_exception($this->i18n('missing_version')); } // check requirements and conflicts $message = ''; if (!$this->checkRequirements()) { $message = $this->message; } if (!$this->checkConflicts()) { $message .= $this->message; } if ($message) { throw new rex_functional_exception($message); } $activate = !$this->package->getProperty('install'); $available = $this->package->isAvailable(); $this->package->setProperty('install', true); // include install.php if (is_readable($this->package->getPath(rex_package::FILE_INSTALL))) { if (!$available) { rex_autoload::addDirectory($this->package->getPath('lib')); rex_autoload::addDirectory($this->package->getPath('vendor')); rex_i18n::addDirectory($this->package->getPath('lang')); } $this->package->includeFile(rex_package::FILE_INSTALL); if (($instmsg = $this->package->getProperty('installmsg', '')) != '') { throw new rex_functional_exception($instmsg); } if (!$this->package->isInstalled()) { throw new rex_functional_exception($this->i18n('no_reason')); } } // import install.sql $installSql = $this->package->getPath(rex_package::FILE_INSTALL_SQL); if ($installDump === true && is_readable($installSql)) { rex_sql_util::importDump($installSql); } if ($activate) { $this->package->setProperty('status', true); } $this->saveConfig(); if ($activate && $this->generatePackageOrder) { self::generatePackageOrder(); } // copy assets $assets = $this->package->getPath('assets'); if (is_dir($assets)) { if (!rex_dir::copy($assets, $this->package->getAssetsPath())) { throw new rex_functional_exception($this->i18n('install_cant_copy_files')); } } $this->message = $this->i18n('installed', $this->package->getName()); return true; } catch (rex_functional_exception $e) { $this->message = $e->getMessage(); } catch (rex_sql_exception $e) { $this->message = 'SQL error: ' . $e->getMessage(); } $this->package->setProperty('install', false); $this->message = $this->i18n('no_install', $this->package->getName()) . '<br />' . $this->message; return false; }
/** * {@inheritdoc} */ public function isAvailable() { return $this->getAddon()->isAvailable() && parent::isAvailable(); }