/** * 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 $packageFile = $this->package->getPath(rex_package::FILE_PACKAGE); if (!is_readable($packageFile)) { throw new rex_functional_exception($this->i18n('missing_yml_file')); } try { rex_file::getConfig($packageFile); } catch (rex_yaml_parse_exception $e) { throw new rex_functional_exception($this->i18n('invalid_yml_file') . ' ' . $e->getMessage()); } $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); } $reinstall = $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 (!$reinstall) { $this->package->setProperty('status', true); } $this->saveConfig(); if ($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($reinstall ? 'reinstalled' : '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; }