diff -u b/core/lib/Drupal/Core/Menu/DefaultMenuLinkTreeManipulators.php b/core/lib/Drupal/Core/Menu/DefaultMenuLinkTreeManipulators.php --- b/core/lib/Drupal/Core/Menu/DefaultMenuLinkTreeManipulators.php +++ b/core/lib/Drupal/Core/Menu/DefaultMenuLinkTreeManipulators.php @@ -145,23 +145,17 @@ if ($node_links) { // These could be serial node IDs or UUIDs. $node_identifiers = array_keys($node_links); - - $nids = []; - $uuids = []; - foreach ($node_identifiers as $node_identifier) { - if (ctype_digit($node_identifier) || is_int($node_identifier)) { - $nids[] = $node_identifier; - } - else { - $uuids[] = $node_identifier; - } - } + $nids = array_filter($node_identifiers, function ($value) { + return ctype_digit($value) || is_int($value); + }); + $uuids = array_diff($node_identifiers, $nids); $query = $this->queryFactory->get('node'); if (!empty($nids) && !empty($uuids)) { - $group = $query->orConditionGroup(); - $group->condition('nid', $nids, 'IN'); - $group->condition('uuid', $uuids, 'IN'); + $group = $query + ->orConditionGroup() + ->condition('nid', $nids, 'IN') + ->condition('uuid', $uuids, 'IN'); $query->condition($group); } elseif (!empty($nids)) { diff -u b/core/tests/Drupal/Tests/Core/Menu/DefaultMenuLinkTreeManipulatorsTest.php b/core/tests/Drupal/Tests/Core/Menu/DefaultMenuLinkTreeManipulatorsTest.php --- b/core/tests/Drupal/Tests/Core/Menu/DefaultMenuLinkTreeManipulatorsTest.php +++ b/core/tests/Drupal/Tests/Core/Menu/DefaultMenuLinkTreeManipulatorsTest.php @@ -326,10 +326,12 @@ ->willReturn($condition); $condition->expects($this->at(0)) ->method('condition') - ->with('nid', array(1, 2, 3)); + ->with('nid', [1, 2, 3]) + ->willReturn($condition); $condition->expects($this->at(1)) ->method('condition') - ->with('uuid', array('7910d537-04be-450a-8200-b53f49ea6b30')); + ->with('uuid', [3 => '7910d537-04be-450a-8200-b53f49ea6b30']) + ->willReturn($condition); $query->expects($this->at(1)) ->method('condition') ->with($condition); only in patch2: unchanged: --- a/core/modules/node/src/Tests/NodeAccessMenuLinkTest.php +++ b/core/modules/node/src/Tests/NodeAccessMenuLinkTest.php @@ -44,29 +44,57 @@ protected function setUp() { */ function testNodeAccessMenuLink() { - $menu_link_title = $this->randomString(); + $nid_menu_link_title = $this->randomString(); $this->drupalLogin($this->contentAdminUser); + $node_title = $this->randomString(); $edit = [ - 'title[0][value]' => $this->randomString(), + 'title[0][value]' => $node_title, 'body[0][value]' => $this->randomString(), 'menu[enabled]' => 1, - 'menu[title]' => $menu_link_title, + 'menu[title]' => $nid_menu_link_title, ]; $this->drupalPostForm('node/add/page', $edit, t('Save')); - $this->assertLink($menu_link_title); + + // Create another node to link by UUID. + $node = $this->createNode(); + $uuid_menu_link_title = '!link_' . $this->randomMachineName(16); + $edit = array( + 'link[0][uri]' => 'entity:node/' . $node->uuid(), + 'title[0][value]' => $uuid_menu_link_title, + 'description[0][value]' => '', + 'enabled[value]' => 1, + 'menu_parent' => 'main:', + ); + // Add menu link. + $this->drupalPostForm('admin/structure/menu/manage/main/add', $edit, t('Save')); + + // Ensure you can add a child link to both node menu links. + // @see \Drupal\Core\Menu\DefaultMenuLinkTreeManipulators::checkNodeAccess() + $this->drupalGet('admin/structure/menu/manage/main/add'); + $elements = $this->xpath('//select["edit-menu-parent"]//option[contains(text(), :title)]', [':title' => $uuid_menu_link_title]); + $this->assertTrue(is_array($elements) && isset($elements[0]), 'Node menu item using UUID can be a parent'); + $elements = $this->xpath('//select["edit-menu-parent"]//option[contains(text(), :title)]', [':title' => $nid_menu_link_title]); + $this->assertTrue(is_array($elements) && isset($elements[0]), 'Node menu item using node ID can be a parent'); + + // Ensure the menu links appear for a user with the correct permissions. + $this->drupalGet(''); + $this->assertLink($nid_menu_link_title); + $this->assertLink($uuid_menu_link_title); // Ensure anonymous users without "access content" permission do not see // this menu link. $this->drupalLogout(); $this->drupalGet(''); - $this->assertNoLink($menu_link_title); + $this->assertNoLink($nid_menu_link_title); + $this->assertNoLink($uuid_menu_link_title); // Ensure anonymous users with "access content" permission see this menu // link. $this->config('user.role.' . RoleInterface::ANONYMOUS_ID)->set('permissions', array('access content'))->save(); $this->drupalGet(''); - $this->assertLink($menu_link_title); + $this->assertLink($nid_menu_link_title); + $this->assertLink($uuid_menu_link_title); } }