diff --git a/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php b/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php index 7be84562ab..b6fa42ee4a 100644 --- a/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php +++ b/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php @@ -205,7 +205,7 @@ class DataFeatureRemovalController extends Controller $oExtensionsMap = \iTopExtensionsMap::GetExtensionsMap($oRuntimeEnvironment->GetBuildEnv()); // Removed modules are stored as static for FindModules() $oExtensionsMap->DeclareExtensionAsRemoved($aRemovedExtensions); - $aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions); + $aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromSelectedExtensions($oConfig, $aSelectedExtensions); } DataFeatureRemovalLog::Debug( @@ -217,7 +217,7 @@ class DataFeatureRemovalController extends Controller Session::Unset('bForceCompilation'); } else { if (count($aSelectedModules) === 0) { - $aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions); + $aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromSelectedExtensions($oConfig, $aSelectedExtensions); } } DataFeatureRemovalLog::Debug(__METHOD__.": modules", null, ['selected_modules' => $aSelectedModules]); diff --git a/setup/moduleinstallation/InstallationChoicesToModuleConverter.php b/setup/moduleinstallation/InstallationChoicesToModuleConverter.php index 991431e27d..1a91829a88 100644 --- a/setup/moduleinstallation/InstallationChoicesToModuleConverter.php +++ b/setup/moduleinstallation/InstallationChoicesToModuleConverter.php @@ -34,7 +34,7 @@ class InstallationChoicesToModuleConverter } /** - * @param array $aInstallationChoices + * @param array $aSelectedExtensions * @param array $aSearchDirs * @param string|null $sInstallationFilePath * @param array|null $aExtensionDirs : module/extension dirs to load if they are compliant with choices @@ -42,7 +42,7 @@ class InstallationChoicesToModuleConverter * @return array * @throws \ModuleInstallationException */ - public function GetModules(array $aInstallationChoices, array $aSearchDirs, ?string $sInstallationFilePath = null, ?array $aExtensionDirs = null): array + public function GetModules(array $aSelectedExtensions, array $aSearchDirs, ?string $sInstallationFilePath = null, ?array $aExtensionDirs = null): array { $aPackageModules = $this->GetAllModules($aSearchDirs); @@ -54,9 +54,9 @@ class InstallationChoicesToModuleConverter if (!is_array($aSteps)) { return []; } - $aInstalledModuleNames = $this->FindInstalledPackageModules($aPackageModules, $aInstallationChoices, $aSteps); + $aInstalledModuleNames = $this->FindInstalledPackageModules($aPackageModules, $aSelectedExtensions, $aSteps); } else { - $aInstalledModuleNames = $this->FindInstalledPackageModules($aPackageModules, $aInstallationChoices); + $aInstalledModuleNames = $this->FindInstalledPackageModules($aPackageModules, $aSelectedExtensions); } $aInstalledModules = []; @@ -68,20 +68,39 @@ class InstallationChoicesToModuleConverter } if (!is_null($aExtensionDirs)) { - foreach (array_keys($this->GetAllModules($aExtensionDirs)) as $sModuleId) { - $oModule = new Module($sModuleId); + foreach ($this->GetAllModules($aExtensionDirs) as $sModuleId => $aModule) { + if (!isset($aModule['auto_select'])) { + $oModule = new Module($sModuleId); - $sPreviousModuleId = $aInstalledModules[$oModule->GetModuleName()] ?? null; - if (is_null($sPreviousModuleId)) { - $aInstalledModules[$oModule->GetModuleName()] = $sModuleId; - continue; - } + $sPreviousModuleId = $aInstalledModules[$oModule->GetModuleName()] ?? null; + if (is_null($sPreviousModuleId)) { + $aInstalledModules[$oModule->GetModuleName()] = $sModuleId; + continue; + } - $oPreviousModule = new Module($sPreviousModuleId); - if (version_compare($oModule->GetVersion(), $oPreviousModule->GetVersion(), '>')) { - $aInstalledModules[$oModule->GetModuleName()] = $sModuleId; + $oPreviousModule = new Module($sPreviousModuleId); + if (version_compare($oModule->GetVersion(), $oPreviousModule->GetVersion(), '>')) { + $aInstalledModules[$oModule->GetModuleName()] = $sModuleId; + } } } + foreach ($this->GetAllModules($aExtensionDirs) as $sModuleId => $aModule) { + if ($this->IsAutoSelectedModule($aInstalledModules, $sModuleId, $aModule)) { + $oModule = new Module($sModuleId); + + $sPreviousModuleId = $aInstalledModules[$oModule->GetModuleName()] ?? null; + if (is_null($sPreviousModuleId)) { + $aInstalledModules[$oModule->GetModuleName()] = $sModuleId; + continue; + } + + $oPreviousModule = new Module($sPreviousModuleId); + if (version_compare($oModule->GetVersion(), $oPreviousModule->GetVersion(), '>')) { + $aInstalledModules[$oModule->GetModuleName()] = $sModuleId; + } + } + } + } return array_values($aInstalledModules); diff --git a/setup/runtimeenv.class.inc.php b/setup/runtimeenv.class.inc.php index 9b5852a205..bd0ef63e5f 100644 --- a/setup/runtimeenv.class.inc.php +++ b/setup/runtimeenv.class.inc.php @@ -1288,7 +1288,7 @@ class RunTimeEnvironment $oConfig = new Config(utils::GetConfigFilePath($sSourceEnv)); $this->InitExtensionMap($oConfig); $aSelectedExtensions = $this->GetExtensionMap()->GetSelectedExtensions($oConfig, $aAddedExtensions, []); - $aSelectedModules = $this->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions); + $aSelectedModules = $this->GetModulesToLoadFromSelectedExtensions($oConfig, $aSelectedExtensions); return $this->DoCompile($aSelectedExtensions, [], $aSelectedModules, $bUseSymLinks ?? false); } @@ -1494,14 +1494,14 @@ class RunTimeEnvironment * Return modules based on installation choices+package * * @param \Config $oConfig - * @param array|bool $aChoices + * @param array|bool $aSelectedExtensions * * @return array|null * @throws \ModuleInstallationException */ - public function GetModulesToLoadFromChoices(Config $oConfig, array|bool $aChoices): ?array + public function GetModulesToLoadFromSelectedExtensions(Config $oConfig, array|bool $aSelectedExtensions): ?array { - if (false === $aChoices) { + if (false === $aSelectedExtensions) { return null; } @@ -1515,16 +1515,14 @@ class RunTimeEnvironment } $aExtensionDirs = []; - $aFromSelectedExtensionModules = []; foreach ($this->GetExtensionMap()->GetAllExtensions() as $oExtension) { - if (in_array($oExtension->sCode, $aChoices) && is_dir($oExtension->sSourceDir)) { + if (in_array($oExtension->sCode, $aSelectedExtensions) && is_dir($oExtension->sSourceDir)) { $aExtensionDirs [] = $oExtension->sSourceDir; - $aFromSelectedExtensionModules = array_merge($aFromSelectedExtensionModules, $oExtension->aModules); } } SetupLog::Info(__METHOD__, null, ['ext_dirs' => $aExtensionDirs]); - $aModuleIdsToLoad = InstallationChoicesToModuleConverter::GetInstance()->GetModules($aChoices, $aSearchDirs, $sInstallFilePath, $aExtensionDirs); + $aModuleIdsToLoad = InstallationChoicesToModuleConverter::GetInstance()->GetModules($aSelectedExtensions, $aSearchDirs, $sInstallFilePath, $aExtensionDirs); $aModulesToLoad = []; foreach ($aModuleIdsToLoad as $sModuleId) { diff --git a/setup/wizardsteps/WizStepLandingBeforeAudit.php b/setup/wizardsteps/WizStepLandingBeforeAudit.php index 11eb5d0af4..f4310ca625 100644 --- a/setup/wizardsteps/WizStepLandingBeforeAudit.php +++ b/setup/wizardsteps/WizStepLandingBeforeAudit.php @@ -97,18 +97,24 @@ class WizStepLandingBeforeAudit extends WizStepModulesChoice } } } - - // Save the choices for the summary step - $sDisplayChoices = '
    '; - $i = 0; - foreach ($this->aSteps as $aStepInfo) { - $sDisplayChoices .= $this->GetSelectedModules($aStepInfo, $aSelectedComponents[$i], $aModules, '', '', $aExtensions); - $i++; - } - $sDisplayChoices .= '
'; - $this->oWizard->SetParameter('display_choices', $sDisplayChoices); + } else { + $this->GetWizardSteps(); + $aSelectedComponents = $this->GetSelectedComponents($this->aSteps, $this->oWizard->GetParameter('selected_extensions', '[]')); } + // Save the choices for the summary step + $sDisplayChoices = '
    '; + $aModules = []; + $aExtensions = []; + $i = 0; + foreach ($this->aSteps as $aStepInfo) { + $sDisplayChoices .= $this->GetSelectedModules($aStepInfo, $aSelectedComponents[$i], $aModules, '', '', $aExtensions); + $i++; + } + $sDisplayChoices .= '
'; + $this->oWizard->SetParameter('display_choices', $sDisplayChoices); + $this->oWizard->SetParameter('selected_modules', json_encode(array_keys($aModules))); + return new WizardState(WizStepDataAudit::class); } diff --git a/setup/wizardsteps/WizStepModulesChoice.php b/setup/wizardsteps/WizStepModulesChoice.php index 01bb3afb5c..5a927c6254 100644 --- a/setup/wizardsteps/WizStepModulesChoice.php +++ b/setup/wizardsteps/WizStepModulesChoice.php @@ -229,14 +229,14 @@ class WizStepModulesChoice extends AbstractWizStepInstall $sExtensionCode = $aAlternativeInfo["extension_code"] ?? null; if (in_array($sExtensionCode, $aExtensions)) { - $aStepRes = $this->ProcessSelectedOption($sCurrentIndex, $i, $aStepRes, $aAlternativeInfo, $aExtensions); + $aStepRes = $this->ProcessSelectedOption($sCurrentIndex, $i, $aStepRes, $aAlternativeInfo, $aExtensions, true); break; } } } /** - * @param string $sCurrentIndex + * @param string $sCurrentId * @param int|string $i * @param array $aStepRes * @param mixed $aOptionsInfo @@ -244,18 +244,19 @@ class WizStepModulesChoice extends AbstractWizStepInstall * * @return array */ - public function ProcessSelectedOption(string $sCurrentIndex, int|string $i, array $aStepRes, mixed $aOptionsInfo, array $aExtensions): array + public function ProcessSelectedOption(string $sCurrentId, int|string $i, array $aStepRes, mixed $aOptionsInfo, array $aExtensions, bool $bIsAlternative = false): array { - $sNextIndex = "{$sCurrentIndex}_{$i}"; - $aStepRes[$sNextIndex] = $sNextIndex; + $sNextId = "{$sCurrentId}_{$i}"; + $sNextName = $bIsAlternative ? "{$sCurrentId}_0" : $sNextId; + $aStepRes[$sNextName] = $sNextId; $aSubOptions = $aOptionsInfo['sub_options'] ?? null; if (!is_null($aSubOptions) && is_array($aSubOptions)) { - $this->ProcessOptions($sNextIndex, $aSubOptions, $aExtensions, $aStepRes); - $this->ProcessAlternatives($sNextIndex, $aSubOptions, $aExtensions, $aStepRes); + $this->ProcessOptions($sNextId, $aSubOptions, $aExtensions, $aStepRes); + $this->ProcessAlternatives($sNextId, $aSubOptions, $aExtensions, $aStepRes); } - $this->ProcessAlternatives($sNextIndex, $aOptionsInfo, $aExtensions, $aStepRes); + $this->ProcessAlternatives($sNextId, $aOptionsInfo, $aExtensions, $aStepRes); return $aStepRes; } diff --git a/tests/php-unit-tests/src/Service/UnitTestRunTimeEnvironment.php b/tests/php-unit-tests/src/Service/UnitTestRunTimeEnvironment.php index 4b288e644a..13edb10aeb 100644 --- a/tests/php-unit-tests/src/Service/UnitTestRunTimeEnvironment.php +++ b/tests/php-unit-tests/src/Service/UnitTestRunTimeEnvironment.php @@ -73,7 +73,7 @@ class UnitTestRunTimeEnvironment extends RunTimeEnvironment $oConfig = new Config(utils::GetConfigFilePath($sSourceEnv)); $this->InitExtensionMap($oConfig); $aSelectedExtensions = $this->GetExtensionMap()->GetSelectedExtensions($oConfig, $aAddedExtensions, []); - $aSelectedModules = $this->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions); + $aSelectedModules = $this->GetModulesToLoadFromSelectedExtensions($oConfig, $aSelectedExtensions); return $this->DoCompile(array_keys($aSelectedExtensions), [], $aSelectedModules, $bUseSymLinks ?? false); } catch (DOMFormatException $e) { $sFileName = $sSourceEnv.'.delta.xml'; diff --git a/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php b/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php index af12878cf3..28b617699c 100644 --- a/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php @@ -1639,10 +1639,10 @@ HTML, $aParams = new XMLParameters(__DIR__.'/ressources/installation_330.xml'); $aSteps = $aParams->Get('steps', []); - $aSelectedExtensions = ["itop-config-mgmt-core","itop-config-mgmt-datacenter","itop-config-mgmt-end-user","itop-config-mgmt-storage","itop-config-mgmt-virtualization","itop-container-mgmt","itop-service-mgmt-enterprise","itop-ticket-mgmt-simple-ticket","itop-ticket-mgmt-simple-ticket-enhanced-portal","itop-change-mgmt-simple","itop-kown-error-mgmt","itop-problem-mgmt","combodo-oauth2-client","combodo-mfa-extended","combodo-data-replication","combodo-api-playground","combodo-snapshot"]; + $aSelectedExtensions = ["itop-config-mgmt-core","itop-config-mgmt-datacenter","itop-config-mgmt-end-user","itop-config-mgmt-storage","itop-config-mgmt-virtualization","itop-container-mgmt","itop-service-mgmt-service-provider","itop-ticket-mgmt-itil","itop-ticket-mgmt-itil-user-request","itop-ticket-mgmt-itil-incident", "itop-ticket-mgmt-itil-enhanced-portal","itop-change-mgmt-simple","itop-kown-error-mgmt","itop-problem-mgmt","combodo-oauth2-client","combodo-mfa-extended","combodo-data-replication","combodo-api-playground","combodo-snapshot"]; $aRes = $this->oWizStepModulesChoiceFake->GetSelectedComponents($aSteps, json_encode($aSelectedExtensions)); - $aExpected = json_decode('[{"_0":"_0","_1":"_1","_2":"_2","_3":"_3","_4":"_4","_4_0":"_4_0"},{"_0":"_0"},{"_0":"_0","_0_0":"_0_0"},{"_0":"_0"},{"_0":"_0","_1":"_1"}]', true); + $aExpected = json_decode('[{"_0":"_0","_1":"_1","_2":"_2","_3":"_3","_4":"_4","_4_0":"_4_0"},{"_0":"_1"},{"_0":"_1","_1_0":"_1_0", "_1_1": "_1_1", "_1_2": "_1_2"},{"_0":"_0"},{"_0":"_0","_1":"_1"}]', true); $this->assertEquals($aExpected, $aRes); } diff --git a/tests/php-unit-tests/unitary-tests/setup/feature_removal/SetupAuditTest.php b/tests/php-unit-tests/unitary-tests/setup/feature_removal/SetupAuditTest.php index eff5c45892..2d8598df9a 100644 --- a/tests/php-unit-tests/unitary-tests/setup/feature_removal/SetupAuditTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/feature_removal/SetupAuditTest.php @@ -8,7 +8,6 @@ use Combodo\iTop\Setup\FeatureRemoval\SetupAudit; use Combodo\iTop\Test\UnitTest\ItopCustomDatamodelTestCase; use Combodo\iTop\Test\UnitTest\Service\UnitTestRunTimeEnvironment; use Config; -use MetaModel; use RunTimeEnvironment; use SetupUtils; use utils; @@ -69,7 +68,7 @@ class SetupAuditTest extends ItopCustomDatamodelTestCase $oConfig = new Config(utils::GetConfigFilePath($this->GetTestEnvironment())); $aRemovedExtensions = ['nominal_ext1', 'finalclass_ext2']; $aSelectedExtensions = DataFeatureRemoverExtensionService::GetInstance()->GetExtensionMap()->GetSelectedExtensions($oConfig, ['finalclass_ext1', 'finalclass_ext3'], $aRemovedExtensions); - $aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions); + $aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromSelectedExtensions($oConfig, $aSelectedExtensions); $oRuntimeEnvironment->DoCompile($aSelectedExtensions, $aRemovedExtensions, $aSelectedModules);