function loadAppConfig() { if (jApp::config()) { return; } $xml = simplexml_load_file(jApp::appPath('project.xml')); $configFile = ''; foreach ($xml->entrypoints->entry as $entrypoint) { $file = (string) $entrypoint['file']; if ($file == $this->entryPointName) { $configFile = (string) $entrypoint['config']; break; } } if ($configFile == '') { throw new Exception("Entry point is unknown"); } require_once JELIX_LIB_PATH . "core/jConfigCompiler.class.php"; jApp::setConfig(jConfigCompiler::read($configFile, true, true, $this->entryPointName)); }
/** * init jelix configuration. * * If you need to setup a full jelix environment with a coordinator, * prefer to call initClassicRequest * @param string $config the configuration file to use, as if you were inside an entry point * @param string $entryPoint the entrypoint name as indicated into project.xml */ protected static function initJelixConfig($config = 'index/config.ini.php', $entryPoint = 'index.php') { $config = jConfigCompiler::read($config, true, true, $entryPoint); jApp::setConfig($config); jApp::setCoord(null); }
public function run() { $this->loadAppConfig(); $module = $this->getParam('module'); $initialVersion = $this->getOption('-ver'); if ($initialVersion === false) { $initialVersion = '0.1pre'; } // note: since module name are used for name of generated name, // only this characters are allowed if ($module == null || preg_match('/([^a-zA-Z_0-9])/', $module)) { throw new Exception("'" . $module . "' is not a valid name for a module"); } // check if the module already exist or not $path = ''; try { $path = $this->getModulePath($module); } catch (Exception $e) { } if ($path != '') { throw new Exception("module '" . $module . "' already exists"); } // verify the given repository $repository = $this->getParam('repository', 'app:modules/'); if (substr($repository, -1) != '/') { $repository .= '/'; } $repositoryPath = jFile::parseJelixPath($repository); $iniDefault = new jIniFileModifier(jApp::mainConfigFile()); $this->updateModulePath($iniDefault, $iniDefault->getValue('modulesPath'), $repository, $repositoryPath); if ($this->verbose()) { echo "modulePath updated in the main configuration\n"; } if (!$this->allEntryPoint) { $list = $this->getEntryPointsList(); foreach ($list as $k => $entryPoint) { if ($entryPoint['file'] == $this->entryPointName) { $ini = new jIniFileModifier(jApp::configPath($entryPoint['config'])); break; } } if (!$ini) { throw new Exception("entry point is unknown"); } $this->updateModulePath($ini, jApp::config()->modulesPath, $repository, $repositoryPath); if ($this->verbose()) { echo "modulePath updated in the configuration " . $entryPoint['config'] . "\n"; } } $path = $repositoryPath . $module . '/'; $this->createDir($path); jApp::setConfig(null); if ($this->getOption('-admin')) { $this->removeOption('-nosubdir'); $this->removeOption('-addinstallzone'); } $param = array(); $param['module'] = $module; $param['default_id'] = $module . $this->config->infoIDSuffix; $param['version'] = $initialVersion; $this->createFile($path . 'module.xml', 'module/module.xml.tpl', $param); // create all sub directories of a module if (!$this->getOption('-nosubdir')) { $this->createDir($path . 'classes/'); $this->createDir($path . 'zones/'); $this->createDir($path . 'controllers/'); $this->createDir($path . 'templates/'); $this->createDir($path . 'classes/'); $this->createDir($path . 'daos/'); $this->createDir($path . 'forms/'); $this->createDir($path . 'locales/'); $this->createDir($path . 'locales/en_US/'); $this->createDir($path . 'locales/fr_FR/'); $this->createDir($path . 'install/'); if ($this->verbose()) { echo "Sub directories have been created in the new module {$module}.\n"; } $this->createFile($path . 'install/install.php', 'module/install.tpl', $param); $this->createFile($path . 'urls.xml', 'module/urls.xml.tpl', array()); } $isdefault = $this->getOption('-defaultmodule'); // activate the module in the application if ($isdefault) { $iniDefault->setValue('startModule', $module); $iniDefault->setValue('startAction', 'default:index'); if ($this->verbose()) { echo "The new module {$module} becomes the default module\n"; } } $iniDefault->setValue($module . '.access', $this->allEntryPoint ? 2 : 1, 'modules'); $iniDefault->save(); $list = $this->getEntryPointsList(); $install = new jIniFileModifier(jApp::configPath('installer.ini.php')); // install the module for all needed entry points foreach ($list as $k => $entryPoint) { $configFile = jApp::configPath($entryPoint['config']); $epconfig = new jIniFileModifier($configFile); if ($this->allEntryPoint) { $access = 2; } else { $access = $entryPoint['file'] == $this->entryPointName ? 2 : 0; } $epconfig->setValue($module . '.access', $access, 'modules'); $epconfig->save(); if ($this->allEntryPoint || $entryPoint['file'] == $this->entryPointName) { $install->setValue($module . '.installed', 1, $entryPoint['id']); $install->setValue($module . '.version', $initialVersion, $entryPoint['id']); } if ($isdefault) { // we set the module as default module for one or all entry points. // we set the startModule option for all entry points except // if an entry point is indicated on the command line if ($this->allEntryPoint || $entryPoint['file'] == $this->entryPointName) { if ($epconfig->getValue('startModule') != '') { $epconfig->setValue('startModule', $module); $epconfig->setValue('startAction', 'default:index'); $epconfig->save(); } } } if ($this->verbose()) { echo "The module is initialized for the entry point " . $entryPoint['file'] . ".\n"; } } $install->save(); // create a default controller if (!$this->getOption('-nocontroller')) { $agcommand = JelixScript::getCommand('createctrl', $this->config); $options = $this->getCommonActiveOption(); if ($this->getOption('-cmdline')) { $options['-cmdline'] = true; } if ($this->getOption('-addinstallzone')) { $options['-addinstallzone'] = true; } $agcommand->initOptParam($options, array('module' => $module, 'name' => 'default', 'method' => 'index')); $agcommand->run(); } if ($this->getOption('-admin')) { $this->createFile($path . 'classes/admin' . $module . '.listener.php', 'module/admin.listener.php.tpl', $param, "Listener"); $this->createFile($path . 'events.xml', 'module/events.xml.tpl', $param); file_put_contents($path . 'locales/en_US/interface.UTF-8.properties', 'menu.item=' . $module); file_put_contents($path . 'locales/fr_FR/interface.UTF-8.properties', 'menu.item=' . $module); } }
protected function handleCustomTestSuite() { $modulesTests = -1; /* $this->options[0] is an array of all options '--xxx'. each values is an array(0=>'optionname', 1=>'value if given') $this->options[1] is a list of parameters given after options it can be array(0=>'test name', 1=>'filename') */ foreach ($this->options[0] as $option) { switch ($option[0]) { case '--entrypoint': $this->entryPoint = $option[1]; break; case '--all-modules': $modulesTests = 0; break; case '--module': $modulesTests = 1; // test is the module name // testFile is the test file inside the module break; case '--testtype': $this->testType = $option[1]; break; } } if (isset($this->options[1][1]) && $modulesTests != 0) { // a specifique test file $this->arguments['testFile'] = $this->options[1][1]; } else { $this->arguments['testFile'] = ''; } $appInstaller = new jInstallerApplication(); $this->epInfo = $appInstaller->getEntryPointInfo($this->entryPoint); // let's load configuration now, and coordinator. it could be needed by tests // (during load of their php files or during execution) jApp::setConfig(jConfigCompiler::readAndCache($this->epInfo->configFile, null, $this->entryPoint)); jApp::setCoord(new jCoordinator('', false)); if ($modulesTests == 0) { // we add all modules in the test list $suite = $this->getAllModulesTestSuites(); if (count($suite)) { $this->arguments['test'] = $suite; unset($this->arguments['testFile']); } else { $this->showMessage("Error: no tests in modules\n"); exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT); } } else { if ($modulesTests == 1 && !$this->version36) { $suite = $this->getModuleTestSuite($this->options[1][0]); if (count($suite)) { $this->arguments['test'] = $suite; if (isset($this->options[1][1])) { // a specifique test file $this->arguments['testFile'] = $this->options[1][1]; } else { $this->arguments['testFile'] = ''; } } else { $this->showMessage("Error: no tests in the module\n"); exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT); } } else { if ($modulesTests == 1) { if (isset($this->options[1][1])) { // a specifique test file $suite = $this->getModuleTestSuite($this->options[1][0], $this->options[1][1]); } else { $suite = $this->getModuleTestSuite($this->options[1][0]); } if (count($suite)) { $this->arguments['test'] = $suite; } else { $this->showMessage("Error: no tests in the module\n"); exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT); } } } } }
protected function _installModules(&$modules, $epId, $installWholeApp, $flags = 3) { $this->notice('install.entrypoint.start', $epId); $ep = $this->entryPoints[$epId]; jApp::setConfig($ep->config); if ($ep->config->disableInstallers) { $this->notice('install.entrypoint.installers.disabled'); } $result = $this->checkDependencies($modules, $epId); if (!$result) { $this->error('install.bad.dependencies'); $this->ok('install.entrypoint.bad.end', $epId); return false; } $this->ok('install.dependencies.ok'); $componentsToInstall = array(); foreach ($this->_componentsToInstall as $item) { list($component, $toInstall) = $item; try { if ($flags == self::FLAG_MIGRATION_11X) { $this->installerIni->setValue($component->getName() . '.installed', 1, $epId); $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId); if ($ep->config->disableInstallers) { $upgraders = array(); } else { $upgraders = $component->getUpgraders($ep); foreach ($upgraders as $upgrader) { $upgrader->preInstall(); } } $componentsToInstall[] = array($upgraders, $component, false); } else { if ($toInstall) { if ($ep->config->disableInstallers) { $installer = null; } else { $installer = $component->getInstaller($ep, $installWholeApp); } $componentsToInstall[] = array($installer, $component, $toInstall); if ($flags & self::FLAG_INSTALL_MODULE && $installer) { $installer->preInstall(); } } else { if ($ep->config->disableInstallers) { $upgraders = array(); } else { $upgraders = $component->getUpgraders($ep); } if ($flags & self::FLAG_UPGRADE_MODULE && count($upgraders)) { foreach ($upgraders as $upgrader) { $upgrader->preInstall(); } } $componentsToInstall[] = array($upgraders, $component, $toInstall); } } } catch (jInstallerException $e) { $result = false; $this->error($e->getLocaleKey(), $e->getLocaleParameters()); } catch (Exception $e) { $result = false; $this->error('install.module.error', array($component->getName(), $e->getMessage())); } } if (!$result) { $this->warning('install.entrypoint.bad.end', $epId); return false; } $installedModules = array(); try { foreach ($componentsToInstall as $item) { list($installer, $component, $toInstall) = $item; if ($toInstall) { if ($installer && $flags & self::FLAG_INSTALL_MODULE) { $installer->install(); } $this->installerIni->setValue($component->getName() . '.installed', 1, $epId); $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId); $this->installerIni->setValue($component->getName() . '.version.date', $component->getSourceDate(), $epId); $this->installerIni->setValue($component->getName() . '.firstversion', $component->getSourceVersion(), $epId); $this->installerIni->setValue($component->getName() . '.firstversion.date', $component->getSourceDate(), $epId); $this->ok('install.module.installed', $component->getName()); $installedModules[] = array($installer, $component, true); } else { $lastversion = ''; foreach ($installer as $upgrader) { if ($flags & self::FLAG_UPGRADE_MODULE) { $upgrader->install(); } $this->installerIni->setValue($component->getName() . '.version', $upgrader->version, $epId); $this->installerIni->setValue($component->getName() . '.version.date', $upgrader->date, $epId); $this->ok('install.module.upgraded', array($component->getName(), $upgrader->version)); $lastversion = $upgrader->version; } if ($lastversion != $component->getSourceVersion()) { $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId); $this->installerIni->setValue($component->getName() . '.version.date', $component->getSourceDate(), $epId); $this->ok('install.module.upgraded', array($component->getName(), $component->getSourceVersion())); } $installedModules[] = array($installer, $component, false); } $ep->configIni->save(); $ep->config = jConfigCompiler::read($ep->configFile, true, $ep->isCliScript, $ep->scriptName); jApp::setConfig($ep->config); } } catch (jInstallerException $e) { $result = false; $this->error($e->getLocaleKey(), $e->getLocaleParameters()); } catch (Exception $e) { $result = false; $this->error('install.module.error', array($component->getName(), $e->getMessage())); } if (!$result) { $this->warning('install.entrypoint.bad.end', $epId); return false; } foreach ($installedModules as $item) { try { list($installer, $component, $toInstall) = $item; if ($toInstall) { if ($installer && $flags & self::FLAG_INSTALL_MODULE) { $installer->postInstall(); $component->installFinished($ep); } } else { if ($flags & self::FLAG_UPGRADE_MODULE) { foreach ($installer as $upgrader) { $upgrader->postInstall(); $component->upgradeFinished($ep, $upgrader); } } } $ep->configIni->save(); $ep->config = jConfigCompiler::read($ep->configFile, true, $ep->isCliScript, $ep->scriptName); jApp::setConfig($ep->config); } catch (jInstallerException $e) { $result = false; $this->error($e->getLocaleKey(), $e->getLocaleParameters()); } catch (Exception $e) { $result = false; $this->error('install.module.error', array($component->getName(), $e->getMessage())); } } $this->ok('install.entrypoint.end', $epId); return $result; }
/** * core of the installation * @param array $modules list of jInstallerComponentModule * @param string $epId the entrypoint id * @param boolean $installWholeApp true if the installation is done during app installation * @param integer $flags to know what to do * @return boolean true if the installation is ok */ protected function _installModules(&$modules, $epId, $installWholeApp, $flags = 3) { $this->notice('install.entrypoint.start', $epId); $ep = $this->entryPoints[$epId]; jApp::setConfig($ep->config); if ($ep->config->disableInstallers) { $this->notice('install.entrypoint.installers.disabled'); } // first, check dependencies of the component, to have the list of component // we should really install. It fills $this->_componentsToInstall, in the right // order $result = $this->checkDependencies($modules, $epId); if (!$result) { $this->error('install.bad.dependencies'); $this->ok('install.entrypoint.bad.end', $epId); return false; } $this->ok('install.dependencies.ok'); // ----------- pre install // put also available installers into $componentsToInstall for // the next step $componentsToInstall = array(); foreach ($this->_componentsToInstall as $item) { list($component, $toInstall) = $item; try { if ($flags == self::FLAG_MIGRATION_11X) { $this->installerIni->setValue($component->getName() . '.installed', 1, $epId); $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId); if ($ep->config->disableInstallers) { $upgraders = array(); } else { $upgraders = $component->getUpgraders($ep); foreach ($upgraders as $upgrader) { $upgrader->preInstall(); } } $componentsToInstall[] = array($upgraders, $component, false); } else { if ($toInstall) { if ($ep->config->disableInstallers) { $installer = null; } else { $installer = $component->getInstaller($ep, $installWholeApp); } $componentsToInstall[] = array($installer, $component, $toInstall); if ($flags & self::FLAG_INSTALL_MODULE && $installer) { $installer->preInstall(); } } else { if ($ep->config->disableInstallers) { $upgraders = array(); } else { $upgraders = $component->getUpgraders($ep); } if ($flags & self::FLAG_UPGRADE_MODULE && count($upgraders)) { foreach ($upgraders as $upgrader) { $upgrader->preInstall(); } } $componentsToInstall[] = array($upgraders, $component, $toInstall); } } } catch (jInstallerException $e) { $result = false; $this->error($e->getLocaleKey(), $e->getLocaleParameters()); } catch (Exception $e) { $result = false; $this->error('install.module.error', array($component->getName(), $e->getMessage())); } } if (!$result) { $this->warning('install.entrypoint.bad.end', $epId); return false; } $installedModules = array(); // ----- installation process try { foreach ($componentsToInstall as $item) { list($installer, $component, $toInstall) = $item; if ($toInstall) { if ($installer && $flags & self::FLAG_INSTALL_MODULE) { $installer->install(); } $this->installerIni->setValue($component->getName() . '.installed', 1, $epId); $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId); $this->installerIni->setValue($component->getName() . '.version.date', $component->getSourceDate(), $epId); $this->installerIni->setValue($component->getName() . '.firstversion', $component->getSourceVersion(), $epId); $this->installerIni->setValue($component->getName() . '.firstversion.date', $component->getSourceDate(), $epId); $this->ok('install.module.installed', $component->getName()); $installedModules[] = array($installer, $component, true); } else { $lastversion = ''; foreach ($installer as $upgrader) { if ($flags & self::FLAG_UPGRADE_MODULE) { $upgrader->install(); } // we set the version of the upgrade, so if an error occurs in // the next upgrader, we won't have to re-run this current upgrader // during a future update $this->installerIni->setValue($component->getName() . '.version', $upgrader->version, $epId); $this->installerIni->setValue($component->getName() . '.version.date', $upgrader->date, $epId); $this->ok('install.module.upgraded', array($component->getName(), $upgrader->version)); $lastversion = $upgrader->version; } // we set the version to the component version, because the version // of the last upgrader could not correspond to the component version. if ($lastversion != $component->getSourceVersion()) { $this->installerIni->setValue($component->getName() . '.version', $component->getSourceVersion(), $epId); $this->installerIni->setValue($component->getName() . '.version.date', $component->getSourceDate(), $epId); $this->ok('install.module.upgraded', array($component->getName(), $component->getSourceVersion())); } $installedModules[] = array($installer, $component, false); } // we always save the configuration, so it invalidates the cache $ep->configIni->save(); // we re-load configuration file for each module because // previous module installer could have modify it. $ep->config = jConfigCompiler::read($ep->configFile, true, $ep->isCliScript, $ep->scriptName); jApp::setConfig($ep->config); } } catch (jInstallerException $e) { $result = false; $this->error($e->getLocaleKey(), $e->getLocaleParameters()); } catch (Exception $e) { $result = false; $this->error('install.module.error', array($component->getName(), $e->getMessage())); } if (!$result) { $this->warning('install.entrypoint.bad.end', $epId); return false; } // post install foreach ($installedModules as $item) { try { list($installer, $component, $toInstall) = $item; if ($toInstall) { if ($installer && $flags & self::FLAG_INSTALL_MODULE) { $installer->postInstall(); $component->installFinished($ep); } } else { if ($flags & self::FLAG_UPGRADE_MODULE) { foreach ($installer as $upgrader) { $upgrader->postInstall(); $component->upgradeFinished($ep, $upgrader); } } } // we always save the configuration, so it invalidates the cache $ep->configIni->save(); // we re-load configuration file for each module because // previous module installer could have modify it. $ep->config = jConfigCompiler::read($ep->configFile, true, $ep->isCliScript, $ep->scriptName); jApp::setConfig($ep->config); } catch (jInstallerException $e) { $result = false; $this->error($e->getLocaleKey(), $e->getLocaleParameters()); } catch (Exception $e) { $result = false; $this->error('install.module.error', array($component->getName(), $e->getMessage())); } } $this->ok('install.entrypoint.end', $epId); return $result; }
function loadAppConfig() { if (jApp::config()) { return; } $xml = simplexml_load_file(jApp::appPath('project.xml')); $configFile = ''; foreach ($xml->entrypoints->entry as $entrypoint) { $file = (string) $entrypoint['file']; if ($file == $this->entryPointName) { $configFile = (string) $entrypoint['config']; break; } } if ($configFile == '') { throw new Exception($this->name . ": Entry point is unknown"); } jApp::setConfig(jConfigCompiler::read($configFile, true, true, $this->entryPointName)); }