From 38937209db00383c20fb92a69aa092ecfe322d1a Mon Sep 17 00:00:00 2001 From: Lee Rowlands Date: Tue, 11 Apr 2023 07:10:23 +1000 Subject: [PATCH] Issue #2927311 by DanielVeza, smustgrave, Gribnif, richard.thomas, larowlan: Contextual links are not sorted by weight, contrary to documentation (cherry picked from commit fcc16f499080ed920b8f52ba5356f05e182b0069) --- core/modules/contextual/src/Element/ContextualLinks.php | 3 +++ .../tests/src/Functional/ContextualDynamicContextTest.php | 5 +++++ .../tests/modules/menu_test/menu_test.links.contextual.yml | 3 +++ 3 files changed, 11 insertions(+) diff --git a/core/modules/contextual/src/Element/ContextualLinks.php b/core/modules/contextual/src/Element/ContextualLinks.php index 915a3132ca6..9ac0f42d104 100644 --- a/core/modules/contextual/src/Element/ContextualLinks.php +++ b/core/modules/contextual/src/Element/ContextualLinks.php @@ -3,6 +3,7 @@ namespace Drupal\contextual\Element; use Drupal\Component\Utility\Html; +use Drupal\Component\Utility\SortArray; use Drupal\Core\Render\Element\RenderElement; use Drupal\Core\Url; @@ -72,6 +73,8 @@ class ContextualLinks extends RenderElement { $items += $contextual_links_manager->getContextualLinksArrayByGroup($group, $args['route_parameters'], $args['metadata']); } + uasort($items, [SortArray::class, 'sortByWeightElement']); + // Transform contextual links into parameters suitable for links.html.twig. $links = []; foreach ($items as $class => $item) { diff --git a/core/modules/contextual/tests/src/Functional/ContextualDynamicContextTest.php b/core/modules/contextual/tests/src/Functional/ContextualDynamicContextTest.php index f1fb389b0d8..b2aba0902ea 100644 --- a/core/modules/contextual/tests/src/Functional/ContextualDynamicContextTest.php +++ b/core/modules/contextual/tests/src/Functional/ContextualDynamicContextTest.php @@ -161,6 +161,11 @@ class ContextualDynamicContextTest extends BrowserTestBase { $this->drupalGet(Url::fromRoute('menu_test.contextual_test')); $this->assertSession()->assertEscaped(""); $this->assertSession()->responseContains('
  • Edit menu - contextual
  • '); + // Test contextual links respects the weight set in *.links.contextual.yml. + $firstLink = $this->assertSession()->elementExists('css', 'ul.contextual-links li:nth-of-type(1) a'); + $secondLink = $this->assertSession()->elementExists('css', 'ul.contextual-links li:nth-of-type(2) a'); + $this->assertEquals(base_path() . 'menu-test-contextual/1/edit', $firstLink->getAttribute('href')); + $this->assertEquals(base_path() . 'menu-test-contextual/1', $secondLink->getAttribute('href')); } /** diff --git a/core/modules/system/tests/modules/menu_test/menu_test.links.contextual.yml b/core/modules/system/tests/modules/menu_test/menu_test.links.contextual.yml index 2849592433d..2b633b910bc 100644 --- a/core/modules/system/tests/modules/menu_test/menu_test.links.contextual.yml +++ b/core/modules/system/tests/modules/menu_test/menu_test.links.contextual.yml @@ -3,6 +3,7 @@ menu_test.contextual_hidden_manage: group: menu_test_menu route_name: menu_test.contextual_hidden_manage class: '\Drupal\menu_test\Plugin\Menu\ContextualLink\TestContextualLink' + weight: 2 menu_test.contextual_hidden_manage_edit: title: 'Edit menu - contextual' @@ -13,8 +14,10 @@ menu_test.contextual_hidden_manage_edit: class: ['use-ajax'] data-dialog-type: 'modal' data-is-something: TRUE + weight: 1 menu_test.hidden_block_configure: title: 'Configure block' group: menu_test_block route_name: menu_test.hidden_block_configure + weight: 0