From f341fd00c5b735c9c31c3cda657c6afc6a1fcab3 Mon Sep 17 00:00:00 2001 From: catch <6915-catch@users.noreply.drupalcode.org> Date: Mon, 25 Nov 2024 18:32:44 +0000 Subject: [PATCH] Issue #3488768 by plopesc, m4olivei, atul_ghate: Menu blocks specific to Navigation are leaking into the Block layout UI --- .../navigation/src/Hook/NavigationHooks.php | 23 +++++++++---------- .../NavigationSafeBlockDefinitionTest.php | 17 +++++++++++++- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/core/modules/navigation/src/Hook/NavigationHooks.php b/core/modules/navigation/src/Hook/NavigationHooks.php index 9faf932e3251..71b9a40791a0 100644 --- a/core/modules/navigation/src/Hook/NavigationHooks.php +++ b/core/modules/navigation/src/Hook/NavigationHooks.php @@ -154,27 +154,26 @@ public function pluginFilterLayoutLayoutBuilderAlter(array &$definitions, array */ #[Hook('block_alter')] public function blockAlter(&$definitions) : void { - // Hide Navigation specific blocks from the generic UI. - $hidden = ['navigation_user', 'navigation_shortcuts', 'navigation_menu', 'navigation_link']; - foreach ($hidden as $block_id) { - if (isset($definitions[$block_id])) { - $definitions[$block_id]['_block_ui_hidden'] = TRUE; - } - } - - // Add the allow_in_navigation attribute to those blocks valid for Navigation. - // @todo Refactor to use actual block Attribute once - // https://www.drupal.org/project/drupal/issues/3443882 is merged. array_walk($definitions, function (&$definition, $block_id) { + [$base_plugin_id] = explode(PluginBase::DERIVATIVE_SEPARATOR, $block_id); + + // Add the allow_in_navigation attribute to those blocks valid for Navigation. + // @todo Refactor to use actual block Attribute once + // https://www.drupal.org/project/drupal/issues/3443882 is merged. $allow_in_navigation = [ 'navigation_user', 'navigation_shortcuts', 'navigation_menu', ]; - [$base_plugin_id] = explode(PluginBase::DERIVATIVE_SEPARATOR, $block_id); if (in_array($base_plugin_id, $allow_in_navigation, TRUE)) { $definition['allow_in_navigation'] = TRUE; } + + // Hide Navigation specific blocks from the generic UI. + $hidden = ['navigation_user', 'navigation_shortcuts', 'navigation_menu', 'navigation_link']; + if (in_array($base_plugin_id, $hidden, TRUE)) { + $definition['_block_ui_hidden'] = TRUE; + } }); } diff --git a/core/modules/navigation/tests/src/Functional/NavigationSafeBlockDefinitionTest.php b/core/modules/navigation/tests/src/Functional/NavigationSafeBlockDefinitionTest.php index 5a9c85f8f98f..2f0ab834a27d 100644 --- a/core/modules/navigation/tests/src/Functional/NavigationSafeBlockDefinitionTest.php +++ b/core/modules/navigation/tests/src/Functional/NavigationSafeBlockDefinitionTest.php @@ -16,7 +16,7 @@ class NavigationSafeBlockDefinitionTest extends BrowserTestBase { /** * {@inheritdoc} */ - protected static $modules = ['navigation', 'navigation_test']; + protected static $modules = ['navigation', 'navigation_test', 'block']; /** * {@inheritdoc} @@ -40,6 +40,7 @@ protected function setUp(): void { $this->adminUser = $this->drupalCreateUser([ 'configure navigation layout', 'access navigation', + 'administer blocks', ]); $this->drupalLogin($this->adminUser); @@ -73,4 +74,18 @@ public function testNavigationSafeBlockDefinition(): void { $this->assertSession()->linkNotExists('Navigation Shortcuts'); } + /** + * Tests logic to exclude blocks in Block Layout UI. + */ + public function testNavigationBlocksHiddenInBlockLayout(): void { + $block_url = '/admin/structure/block'; + $this->drupalGet($block_url); + $this->clickLink('Place block'); + $this->assertSession()->linkByHrefNotExists('/admin/structure/block/add/navigation_menu%3Aadmin/stark'); + $this->assertSession()->linkByHrefNotExists('/admin/structure/block/add/navigation_menu%3Acontent/stark'); + $this->assertSession()->linkByHrefNotExists('/admin/structure/block/add/navigation_shortcuts/stark'); + $this->assertSession()->linkByHrefNotExists('/admin/structure/block/add/navigation_user/stark'); + $this->assertSession()->linkByHrefNotExists('/admin/structure/block/add/navigation_link/stark'); + } + } -- GitLab