Loading core/modules/block/block.module +4 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ * @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 Loading core/modules/block/src/Hook/BlockHooks.php +6 −1 Original line number Diff line number Diff line Loading @@ -151,7 +151,12 @@ public function pageTop(array &$page_top): void { * @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 Loading core/modules/block/tests/src/Kernel/BlockConfigSyncTest.php 0 → 100644 +86 −0 Original line number Diff line number Diff line <?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()); } } Loading
core/modules/block/block.module +4 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ * @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 Loading
core/modules/block/src/Hook/BlockHooks.php +6 −1 Original line number Diff line number Diff line Loading @@ -151,7 +151,12 @@ public function pageTop(array &$page_top): void { * @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 Loading
core/modules/block/tests/src/Kernel/BlockConfigSyncTest.php 0 → 100644 +86 −0 Original line number Diff line number Diff line <?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()); } }