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 b6fa42ee4a..1bf8850fe5 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 @@ -24,6 +24,7 @@ use ContextTag; use CoreException; use Dict; use Exception; +use iTopExtension; use MetaModel; use MFCompiler; use RunTimeEnvironment; @@ -464,13 +465,14 @@ class DataFeatureRemovalController extends Controller 'extensions_not_uninstallable' => [], ]; foreach ($aAvailableExtensions as $sCode => &$aExtensionData) { - if (!isset($aSelectedExtensionsFromUI[$sCode])) { + $sCodeFromUI = $sCode !== '' ? $sCode : iTopExtension::CODE_NO_CODE; + if (!isset($aSelectedExtensionsFromUI[$sCodeFromUI])) { continue; } - if ($aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] !== 'on') { + if ($aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCodeFromUI] !== 'on') { $aExtensionData['extra_flags']['selected'] = false; - $sLabel = $aAvailableExtensions[$sCode]['label']; + $sLabel = $aExtensionData['label']; $this->aExtensionsToCheck['to_be_removed'][$sCode] = $sLabel; if (! $this->bForcedUninstallation && $aExtensionData['extra_flags']['uninstallable']) { $this->bForcedUninstallation = true; @@ -478,9 +480,9 @@ class DataFeatureRemovalController extends Controller if (false === $aExtensionData['extra_flags']['uninstallable'] || true === $aExtensionData['extra_flags']['remote']) { $this->aExtensionsToCheck['extensions_not_uninstallable'][] = $sCode; } - } elseif (!$aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] === 'on') { + } elseif (!$aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCodeFromUI] === 'on') { $aExtensionData['extra_flags']['selected'] = true; - $sLabel = $aAvailableExtensions[$sCode]['label']; + $sLabel = $aExtensionData['label']; $this->aExtensionsToCheck['to_be_installed'][$sCode] = $sLabel; } } diff --git a/setup/itopextension.class.inc.php b/setup/itopextension.class.inc.php index 898eb8599d..7feed18c69 100644 --- a/setup/itopextension.class.inc.php +++ b/setup/itopextension.class.inc.php @@ -13,6 +13,7 @@ class iTopExtension public const SOURCE_WIZARD = 'datamodels'; public const SOURCE_MANUAL = 'extensions'; public const SOURCE_REMOTE = 'data'; + public const CODE_NO_CODE = 'error-extension-code-missing'; /** * @var string diff --git a/sources/Application/UI/Base/Layout/Extension/ExtensionDetails.php b/sources/Application/UI/Base/Layout/Extension/ExtensionDetails.php index ef3578142b..7327b9ae4f 100644 --- a/sources/Application/UI/Base/Layout/Extension/ExtensionDetails.php +++ b/sources/Application/UI/Base/Layout/Extension/ExtensionDetails.php @@ -9,6 +9,7 @@ use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu; use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenuItem\PopoverMenuItemFactory; use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock; use Dict; +use iTopExtension; use JSButtonItem; class ExtensionDetails extends UIContentBlock @@ -179,7 +180,8 @@ class ExtensionDetails extends UIContentBlock protected function InitializeToggler() { - $sName = 'aSelectedExtensions['.$this->GetCode().']'; + $sCode = $this->GetCode() !== '' ? $this->GetCode() : iTopExtension::CODE_NO_CODE; + $sName = 'aSelectedExtensions['.$sCode.']'; $this->oToggler = new Toggler(); $this->oToggler->SetName($sName); $this->oToggler->SetTooltip(Dict::Format('UI:Layout:ExtensionsDetails:TogglerTooltip', $this->GetLabel()));