From 7e2db381c38de9d292603e52c231fb1f618abe7d Mon Sep 17 00:00:00 2001 From: catch <catch@35733.no-reply.drupal.org> Date: Mon, 26 Feb 2024 10:55:14 +0000 Subject: [PATCH] Issue #2613222 by webflo, alexpott, ameymudras, pooja saraah, _utsavsharma, penyaskito, Janvi Dasani: Language module shouldn't alter config in sync mode --- core/modules/language/language.module | 27 ++++++++++-- ...guageConfigInstallOverrideExistingTest.php | 42 +++++++++++++++++++ .../config/install/language.types.yml | 39 +++++++++++++++++ .../test_language_negotiation.info.yml | 7 ++++ 4 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 core/modules/language/tests/src/Functional/LanguageConfigInstallOverrideExistingTest.php create mode 100644 core/profiles/test_language_negotiation/config/install/language.types.yml create mode 100644 core/profiles/test_language_negotiation/test_language_negotiation.info.yml diff --git a/core/modules/language/language.module b/core/modules/language/language.module index fc057c3ef500..7629cbf38c2a 100644 --- a/core/modules/language/language.module +++ b/core/modules/language/language.module @@ -7,12 +7,15 @@ use Drupal\Core\Url; use Drupal\Core\Access\AccessResult; +use Drupal\Core\Config\FileStorage; +use Drupal\Core\Config\InstallStorage; use Drupal\Core\Entity\ContentEntityFormInterface; use Drupal\Core\Entity\EntityFormInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Installer\InstallerKernel; use Drupal\Core\Language\LanguageInterface; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Session\AccountInterface; @@ -289,8 +292,26 @@ function language_negotiation_url_prefixes_update() { /** * Implements hook_modules_installed(). */ -function language_modules_installed($modules) { +function language_modules_installed($modules, $is_syncing) { + if ($is_syncing) { + return; + } + if (!in_array('language', $modules)) { + if (InstallerKernel::installationAttempted()) { + // If the install profile provides its own language.types configuration do + // not overwrite it. + $profile_directory = \Drupal::service('extension.list.profile')->getPath(\Drupal::installProfile()); + $profile_storages = [ + new FileStorage($profile_directory . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY), + new FileStorage($profile_directory . '/' . InstallStorage::CONFIG_OPTIONAL_DIRECTORY), + ]; + foreach ($profile_storages as $storage) { + if ($storage->exists('language.types')) { + return; + } + } + } // Since newly (un)installed modules may change the default settings for // non-locked language types (e.g. content language), we need to resave the // language type configuration. @@ -318,8 +339,8 @@ function language_modules_installed($modules) { /** * Implements hook_modules_uninstalled(). */ -function language_modules_uninstalled($modules) { - language_modules_installed($modules); +function language_modules_uninstalled($modules, $is_syncing) { + language_modules_installed($modules, $is_syncing); } /** diff --git a/core/modules/language/tests/src/Functional/LanguageConfigInstallOverrideExistingTest.php b/core/modules/language/tests/src/Functional/LanguageConfigInstallOverrideExistingTest.php new file mode 100644 index 000000000000..74a8bd9352c7 --- /dev/null +++ b/core/modules/language/tests/src/Functional/LanguageConfigInstallOverrideExistingTest.php @@ -0,0 +1,42 @@ +<?php + +namespace Drupal\Tests\language\Functional; + +use Drupal\Tests\BrowserTestBase; + +/** + * Ensures the language config is installed but not altered on install. + * + * @group language + */ +class LanguageConfigInstallOverrideExistingTest extends BrowserTestBase { + + /** + * {@inheritdoc} + */ + protected $profile = 'test_language_negotiation'; + + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + + /** + * Tests when language config is installed existing config is not overridden. + */ + public function testLanguageConfigInstallOverrideExisting() { + /** @var \Drupal\Core\Config\StorageInterface $storage */ + $storage = $this->container->get('config.storage'); + $config = $this->config('language.types'); + + // The negotiation methods that have been removed should be disabled after + // purging if not avoided in language_modules_installed(). + $language_types_data = $storage->read('language.types'); + $this->assertTrue(isset($language_types_data['negotiation']['language_content']['enabled']['test_language_negotiation_method'])); + $this->assertTrue(isset($language_types_data['negotiation']['language_content']['enabled']['language-selected'])); + + $this->assertEquals(-10, $config->get('negotiation.language_content.enabled.test_language_negotiation_method')); + $this->assertEquals(12, $config->get('negotiation.language_content.enabled.language-selected')); + } + +} diff --git a/core/profiles/test_language_negotiation/config/install/language.types.yml b/core/profiles/test_language_negotiation/config/install/language.types.yml new file mode 100644 index 000000000000..9e411ba2c495 --- /dev/null +++ b/core/profiles/test_language_negotiation/config/install/language.types.yml @@ -0,0 +1,39 @@ +all: + - language_interface + - language_content + - language_url +configurable: + - language_interface + - language_content +negotiation: + language_content: + enabled: + test_language_negotiation_method: -10 + language-url: -8 + language-selected: 12 + method_weights: + test_language_negotiation_method: -10 + language-content-entity: -9 + language-url: -8 + language-session: -6 + language-user: -4 + language-browser: -2 + language-interface: 9 + language-selected: 12 + language_url: + enabled: + language-url: 0 + language-url-fallback: 1 + language_interface: + enabled: + language-user-admin: -20 + language-user: -19 + language-url: -18 + language-selected: -15 + method_weights: + language-user-admin: -20 + language-user: -19 + language-url: -18 + language-session: -17 + language-browser: -16 + language-selected: -15 diff --git a/core/profiles/test_language_negotiation/test_language_negotiation.info.yml b/core/profiles/test_language_negotiation/test_language_negotiation.info.yml new file mode 100644 index 000000000000..a83b1cfb4347 --- /dev/null +++ b/core/profiles/test_language_negotiation/test_language_negotiation.info.yml @@ -0,0 +1,7 @@ +name: Testing language negotiation +type: profile +description: 'Minimal profile for running tests related the language negotiation.' +version: VERSION +hidden: true +install: + - drupal:language -- GitLab