diff --git a/core/core.services.yml b/core/core.services.yml index e0b682334d..048c298b90 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -543,6 +543,12 @@ services: lazy: true required_module_uninstall_validator: class: Drupal\Core\Extension\RequiredModuleUninstallValidator + tags: + - { name: module_install.uninstall_validator } + arguments: ['@string_translation', '@extension.list.module'] + lazy: true + module_required_by_themes_uninstall_validator: + class: Drupal\Core\Extension\ModuleRequiredByThemesUninstallValidator tags: - { name: module_install.uninstall_validator } arguments: ['@string_translation', '@extension.list.module', '@extension.list.theme', '@config.factory'] diff --git a/core/lib/Drupal/Core/Extension/ModuleRequiredByThemesUninstallValidator.php b/core/lib/Drupal/Core/Extension/ModuleRequiredByThemesUninstallValidator.php new file mode 100644 index 0000000000..bc44b9ba14 --- /dev/null +++ b/core/lib/Drupal/Core/Extension/ModuleRequiredByThemesUninstallValidator.php @@ -0,0 +1,96 @@ +stringTranslation = $string_translation; + $this->moduleExtensionList = $extension_list_module; + $this->themeExtensionList = $extension_list_theme; + $this->configFactory = $config_factory; + $this->getModulesThemesDependOn(); + } + + /** + * {@inheritdoc} + */ + public function validate($module) { + $reasons = []; + + if (isset($this->modulesThemesDependOn[$module])) { + $module_name = $this->moduleExtensionList->get($module)->info['name']; + $theme_names = implode(", ", $this->modulesThemesDependOn[$module]); + $reasons[] = $this->formatPlural(count($theme_names), + 'The @module_name module is required by the theme @theme_names', + 'The @module_name module is required by the themes @theme_names', + ['@module_name' => $module_name, '@theme_names' => $theme_names]); + } + + return $reasons; + } + + /** + * Populate $this->modulesThemesDependOn with modules themes depend on. + */ + protected function getModulesThemesDependOn() { + $installed_themes = $this->themeExtensionList->getAllInstalledInfo(); + foreach ($this->themeExtensionList->getAllInstalledInfo() as $theme) { + foreach ($theme['dependencies'] as $dependency) { + if (!isset($installed_themes[$dependency])) { + $this->modulesThemesDependOn[$dependency][] = $theme['name']; + } + } + } + } + +}