Issue #2613222 by webflo, alexpott, ameymudras, pooja saraah, _utsavsharma, penyaskito, Janvi Dasani: Language module shouldn't alter config in sync mode

merge-requests/5731/merge
catch 2024-02-26 10:55:14 +00:00
parent 09ade8fa41
commit 7e2db381c3
4 changed files with 112 additions and 3 deletions

View File

@ -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);
}
/**

View File

@ -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'));
}
}

View File

@ -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

View File

@ -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