diff --git a/core/modules/block/src/Plugin/ConfigAction/PlaceBlock.php b/core/modules/block/src/Plugin/ConfigAction/PlaceBlock.php index 512ad99facb2c4d54d9c4cb8a7c55afacbe413cb..b43b455639b9ba715099ce863b1002ebebe07585 100644 --- a/core/modules/block/src/Plugin/ConfigAction/PlaceBlock.php +++ b/core/modules/block/src/Plugin/ConfigAction/PlaceBlock.php @@ -73,15 +73,17 @@ public function apply(string $configName, mixed $value): void { 'theme' => $theme, 'region' => $value['region'], ]); - // Sort the blocks by weight. Don't use \Drupal\block\Entity\Block::sort() - // here because it seems to be intended to sort blocks in the UI, where - // we really just want to get the weights right in this situation. - uasort($blocks, fn (BlockInterface $a, BlockInterface $b) => $a->getWeight() <=> $b->getWeight()); + if ($blocks) { + // Sort the blocks by weight. Don't use \Drupal\block\Entity\Block::sort() + // here because it seems to be intended to sort blocks in the UI, where + // we really just want to get the weights right in this situation. + uasort($blocks, fn (BlockInterface $a, BlockInterface $b) => $a->getWeight() <=> $b->getWeight()); - $value['weight'] = match ($value['position']) { - 'first' => reset($blocks)->getWeight() - 1, - 'last' => end($blocks)->getWeight() + 1, - }; + $value['weight'] = match ($value['position']) { + 'first' => reset($blocks)->getWeight() - 1, + 'last' => end($blocks)->getWeight() + 1, + }; + } } // Remove values that are not valid properties of block entities. unset($value['position'], $value['default_region']); diff --git a/core/modules/block/tests/src/Kernel/ConfigActionsTest.php b/core/modules/block/tests/src/Kernel/ConfigActionsTest.php index 88bdb8afef8e4bb5ce2029898d35e2960e2dcd86..b12ee0edc94094a0eee8920d87beded1fe9d673e 100644 --- a/core/modules/block/tests/src/Kernel/ConfigActionsTest.php +++ b/core/modules/block/tests/src/Kernel/ConfigActionsTest.php @@ -180,4 +180,28 @@ public function testPlaceBlockAtPosition(): void { $this->assertSame('last', end($blocks)); } + /** + * Tests using the PlaceBlock action in an empty region. + */ + public function testPlaceBlockInEmptyRegion(): void { + /** @var \Drupal\Core\Entity\Query\QueryInterface $query */ + $query = $this->container->get(EntityTypeManagerInterface::class) + ->getStorage('block') + ->getQuery() + ->count() + ->condition('theme', 'olivero') + ->condition('region', 'footer_top'); + $this->assertSame(0, $query->execute()); + + // Place a block in that region. + $this->configActionManager->applyAction('placeBlockInDefaultTheme', 'block.block.test', [ + 'plugin' => 'system_powered_by_block', + 'region' => [ + 'olivero' => 'footer_top', + ], + 'position' => 'first', + ]); + $this->assertSame(1, $query->execute()); + } + }