public static function GetDataModelVersion($sDatamodelDir)
 {
     $sVersionFile = $sDatamodelDir . 'version.xml';
     if (file_exists($sVersionFile)) {
         $oParams = new XMLParameters($sVersionFile);
         return $oParams->Get('version');
     }
     return false;
 }
 protected function GetStepInfo($idx = null)
 {
     $aStepInfo = null;
     if ($idx === null) {
         $index = $this->GetStepIndex();
     } else {
         $index = $idx;
     }
     $aSteps = array();
     if (@file_exists($this->GetSourceFilePath())) {
         $aParams = new XMLParameters($this->GetSourceFilePath());
         $aSteps = $aParams->Get('steps', array());
         $bAddExtensionsOnly = true;
     } else {
         // No wizard configuration provided, build a standard one:
         $bAddExtensionsOnly = false;
         $aSteps[] = array('title' => 'Modules Selection', 'description' => '<h2>Select the modules to install. You can launch the installation again to install new modules, but you cannot remove already installed modules.</h2>', 'banner' => '/images/modules.png', 'options' => array());
     }
     // Additional step for the extensions
     $aSteps[] = array('title' => 'Extensions', 'description' => '<h2>Select additional extensions to install. You can launch the installation again to install new extensions, but you cannot remove already installed extensions.</h2>', 'banner' => '/images/extension.png', 'options' => array());
     try {
         $sDefaultAppPath = utils::GetDefaultUrlAppRoot();
     } catch (Exception $e) {
         $sDefaultAppPath = '..';
     }
     $aAvailableModules = SetupUtils::AnalyzeInstallation($this->oWizard);
     foreach ($aAvailableModules as $sModuleId => $aModule) {
         if ($sModuleId == ROOT_MODULE) {
             continue;
         }
         // Convention: the version number of the application (and datamodel) are stored as a module named ROOT_MODULE
         $sModuleLabel = $aModule['label'];
         $sModuleHelp = $aModule['doc.more_information'];
         $sMoreInfo = !empty($aModule['doc.more_information']) ? "<a href=\"{$sDefaultAppPath}{$aModule['doc.more_information']}\" target=\"_blank\">more info</a>" : '';
         if ($aModule['category'] != 'authentication' && $aModule['visible']) {
             if ($bAddExtensionsOnly && !$this->IsExtension($aModule)) {
                 continue;
             }
             if ($this->IsExtension($aModule)) {
                 $iStepIndex = count($aSteps) - 1;
             } else {
                 $iStepIndex = 0;
             }
             $aSteps[$iStepIndex]['options'][] = array('title' => $sModuleLabel, 'description' => '', 'more_info' => $sMoreInfo, 'default' => true, 'modules' => array($sModuleId), 'mandatory' => $aModule['install']['flag'] & MODULE_ACTION_MANDATORY ? true : false);
         }
     }
     if (count($aSteps[count($aSteps) - 1]['options']) == 0) {
         // No extensions at all, remove the last step
         array_pop($aSteps);
     }
     if (array_key_exists($index, $aSteps)) {
         $aStepInfo = $aSteps[$index];
     }
     return $aStepInfo;
 }