summaryrefslogtreecommitdiffstatshomepage
path: root/core
diff options
context:
space:
mode:
authorLee Rowlands <lee.rowlands@previousnext.com.au>2025-05-21 08:00:11 +1000
committerLee Rowlands <lee.rowlands@previousnext.com.au>2025-05-21 08:00:11 +1000
commit68131d921c52fdc448a7c6ec802afb6e55a15a68 (patch)
treee7dca59335798bef3dd0af490fb7d053f04c87d6 /core
parent05b8266c350d1e5eb021f7ce70891ad786916c2c (diff)
downloaddrupal-68131d921c52fdc448a7c6ec802afb6e55a15a68.tar.gz
drupal-68131d921c52fdc448a7c6ec802afb6e55a15a68.zip
Issue #3182716 by thejimbirch, phenaproxima, primsi, alexpott, berdir, smustgrave, godotislate, nicxvan: block_theme_initialize should not create blocks during config sync
Diffstat (limited to 'core')
-rw-r--r--core/modules/block/block.module4
-rw-r--r--core/modules/block/src/Hook/BlockHooks.php7
-rw-r--r--core/modules/block/tests/src/Kernel/BlockConfigSyncTest.php86
3 files changed, 96 insertions, 1 deletions
diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index 94a2cb9fc7a..24e28589491 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -16,6 +16,10 @@ use Drupal\Core\Installer\InstallerKernel;
* @see block_modules_installed()
*/
function block_themes_installed($theme_list): void {
+ // Do not create blocks during config sync.
+ if (\Drupal::service('config.installer')->isSyncing()) {
+ return;
+ }
// Disable this functionality prior to install profile installation because
// block configuration is often optional or provided by the install profile
// itself. block_theme_initialize() will be called when the install profile is
diff --git a/core/modules/block/src/Hook/BlockHooks.php b/core/modules/block/src/Hook/BlockHooks.php
index 657109309a3..802a60bccb1 100644
--- a/core/modules/block/src/Hook/BlockHooks.php
+++ b/core/modules/block/src/Hook/BlockHooks.php
@@ -151,7 +151,12 @@ class BlockHooks {
* @see block_themes_installed()
*/
#[Hook('modules_installed')]
- public function modulesInstalled($modules): void {
+ public function modulesInstalled($modules, bool $is_syncing): void {
+ // Do not create blocks during config sync.
+ if ($is_syncing) {
+ return;
+ }
+
// block_themes_installed() does not call block_theme_initialize() during
// site installation because block configuration can be optional or provided
// by the profile. Now, when the profile is installed, this configuration
diff --git a/core/modules/block/tests/src/Kernel/BlockConfigSyncTest.php b/core/modules/block/tests/src/Kernel/BlockConfigSyncTest.php
new file mode 100644
index 00000000000..80e3f798342
--- /dev/null
+++ b/core/modules/block/tests/src/Kernel/BlockConfigSyncTest.php
@@ -0,0 +1,86 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\block\Kernel;
+
+use Drupal\Core\Config\ConfigInstallerInterface;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\Extension\ThemeInstallerInterface;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\block\Entity\Block;
+
+/**
+ * Tests that blocks are not created during config sync.
+ *
+ * @group block
+ */
+class BlockConfigSyncTest extends KernelTestBase {
+
+ /**
+ * {@inheritdoc}
+ */
+ protected static $modules = ['block', 'system'];
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function setUp(): void {
+ parent::setUp();
+
+ \Drupal::service(ThemeInstallerInterface::class)
+ ->install(['stark', 'claro']);
+
+ // Delete all existing blocks.
+ foreach (Block::loadMultiple() as $block) {
+ $block->delete();
+ }
+
+ // Set the default theme.
+ $this->config('system.theme')
+ ->set('default', 'stark')
+ ->save();
+
+ // Create a block for the default theme to be copied later.
+ Block::create([
+ 'id' => 'test_block',
+ 'plugin' => 'system_powered_by_block',
+ 'region' => 'content',
+ 'theme' => 'stark',
+ ])->save();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function register(ContainerBuilder $container): void {
+ parent::register($container);
+ $container->setParameter('install_profile', 'testing');
+ }
+
+ /**
+ * Tests blocks are not created during config sync.
+ *
+ * @param bool $syncing
+ * Whether or not config is syncing when the hook is invoked.
+ * @param string|null $expected_block_id
+ * The expected ID of the block that should be created, or NULL if no block
+ * should be created.
+ *
+ * @testWith [true, null]
+ * [false, "claro_test_block"]
+ */
+ public function testNoBlocksCreatedDuringConfigSync(bool $syncing, ?string $expected_block_id): void {
+ \Drupal::service(ConfigInstallerInterface::class)
+ ->setSyncing($syncing);
+
+ // Invoke the hook that should skip block creation due to config sync.
+ \Drupal::moduleHandler()->invoke('block', 'themes_installed', [['claro']]);
+ // This should hold true if the "current" install profile triggers an
+ // invocation of hook_modules_installed().
+ \Drupal::moduleHandler()->invoke('block', 'modules_installed', [['testing'], $syncing]);
+
+ $this->assertSame($expected_block_id, Block::load('claro_test_block')?->id());
+ }
+
+}