Get('steps', []); if (!is_array($aSteps)) { return []; } } else { $aSteps = $aInstallationChoices; } $aInstalledModuleNames = $this->FindInstalledPackageModules($aPackageModules, $aInstallationChoices, $aSteps, $bInstallationFileProvided); $aInstalledModules = []; foreach (array_keys($aPackageModules) as $sModuleId) { list($sModuleName) = ModuleDiscovery::GetModuleName($sModuleId); if (in_array($sModuleName, $aInstalledModuleNames)) { $aInstalledModules[] = $sModuleId; } } return $aInstalledModules; } private function FindInstalledPackageModules(array $aPackageModules, array $aInstallationChoices, array $aInstallationDescription, bool $bInstallationFileProvided): array { $aInstalledModules = []; $this->ProcessDefaultModules($aPackageModules, $aInstalledModules); if ($bInstallationFileProvided) { $this->ProcessInstallationChoices(array_keys($aInstallationChoices), $aInstallationDescription, $aInstalledModules); } else { $aInstalledModules = array_merge($aInstalledModules, $aInstallationChoices); } $this->ProcessAutoSelectModules($aPackageModules, $aInstalledModules); return array_keys($aInstalledModules); } private function ProcessDefaultModules(array $aPackageModules, array &$aInstalledModules): void { foreach ($aPackageModules as $sModuleId => $aModule) { if (($sModuleId != ROOT_MODULE)) { if (isset($aModule['auto_select'])) { continue; } if (($aModule['category'] == 'authentication') || (!$aModule['visible'])) { list($sModuleName) = ModuleDiscovery::GetModuleName($sModuleId); $aInstalledModules[$sModuleName] = true; } } } } private function ProcessAutoSelectModules(array $aPackageModules, array &$aInstalledModules): void { foreach ($aPackageModules as $sModuleId => $aModule) { if (($sModuleId !== ROOT_MODULE) && isset($aModule['auto_select'])) { try { SetupInfo::SetSelectedModules($aInstalledModules); $bSelected = DependencyExpression::GetPhpExpressionEvaluator()->ParseAndEvaluateBooleanExpression($aModule['auto_select']); if ($bSelected) { list($sModuleName) = ModuleDiscovery::GetModuleName($sModuleId); $aInstalledModules[$sModuleName] = true; } } catch (Exception $e) { IssueLog::Error('Error evaluating module auto-select', null, [ 'module' => $sModuleId, 'error' => $e->getMessage(), 'evaluated code' => $aModule['auto_select'], 'stacktrace' => $e->getTraceAsString(), ]); } } } } private function ProcessInstallationChoices(array $aInstallationChoices, array $aInstallationDescription, array &$aInstalledModules): void { foreach ($aInstallationDescription as $aStepInfo) { $aOptions = $aStepInfo['options'] ?? null; if (is_array($aOptions)) { foreach ($aOptions as $aChoiceInfo) { $this->ProcessSelectedChoice($aInstallationChoices, $aChoiceInfo, $aInstalledModules); } } $aOptions = $aStepInfo['alternatives'] ?? null; if (is_array($aOptions)) { foreach ($aOptions as $aChoiceInfo) { $this->ProcessSelectedChoice($aInstallationChoices, $aChoiceInfo, $aInstalledModules); } } } } private function ProcessSelectedChoice(array $aInstallationChoices, array $aChoiceInfo, array &$aInstalledModules) { if (!is_array($aChoiceInfo)) { return; } $sMandatory = $aChoiceInfo['mandatory'] ?? 'false'; $aCurrentModules = $aChoiceInfo['modules'] ?? []; $sExtensionCode = $aChoiceInfo['extension_code']; $bSelected = ($sMandatory === 'true') || in_array($sExtensionCode, $aInstallationChoices); if (!$bSelected) { return; } foreach ($aCurrentModules as $sModuleId) { $aInstalledModules[$sModuleId] = true; } $aAlternatives = $aChoiceInfo['alternatives'] ?? null; if (is_array($aAlternatives)) { foreach ($aAlternatives as $aSubChoiceInfo) { $this->ProcessSelectedChoice($aInstallationChoices, $aSubChoiceInfo, $aInstalledModules); } } $aSubOptionsChoiceInfo = $aChoiceInfo['sub_options'] ?? null; if (is_array($aSubOptionsChoiceInfo)) { $aSubOptions = $aSubOptionsChoiceInfo['options'] ?? null; if (is_array($aSubOptions)) { foreach ($aSubOptions as $aSubChoiceInfo) { $this->ProcessSelectedChoice($aInstallationChoices, $aSubChoiceInfo, $aInstalledModules); } } $aSubAlternatives = $aSubOptionsChoiceInfo['alternatives'] ?? null; if (is_array($aSubAlternatives)) { foreach ($aSubAlternatives as $aSubChoiceInfo) { $this->ProcessSelectedChoice($aInstallationChoices, $aSubChoiceInfo, $aInstalledModules); } } } } }