diff --git a/core/modules/menu_link_content/menu_link_content.module b/core/modules/menu_link_content/menu_link_content.module index f94a139d462..a5541cda261 100644 --- a/core/modules/menu_link_content/menu_link_content.module +++ b/core/modules/menu_link_content/menu_link_content.module @@ -89,10 +89,17 @@ function menu_link_content_path_delete($path) { function menu_link_content_entity_predelete(EntityInterface $entity) { /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */ $menu_link_manager = \Drupal::service('plugin.manager.menu.link'); + $entity_type_id = $entity->getEntityTypeId(); foreach ($entity->uriRelationships() as $rel) { $url = $entity->toUrl($rel); + $route_parameters = $url->getRouteParameters(); + if (!isset($route_parameters[$entity_type_id])) { + // Do not delete links which do not relate to this exact entity. For + // example, "collection", "add-form", etc. + continue; + } // Delete all MenuLinkContent links that point to this entity route. - $result = $menu_link_manager->loadLinksByRoute($url->getRouteName(), $url->getRouteParameters()); + $result = $menu_link_manager->loadLinksByRoute($url->getRouteName(), $route_parameters); if ($result) { foreach ($result as $id => $instance) { diff --git a/core/modules/menu_link_content/tests/src/Functional/LinksTest.php b/core/modules/menu_link_content/tests/src/Functional/LinksTest.php index 298af6fae3e..7cce477b5a0 100644 --- a/core/modules/menu_link_content/tests/src/Functional/LinksTest.php +++ b/core/modules/menu_link_content/tests/src/Functional/LinksTest.php @@ -147,8 +147,12 @@ class LinksTest extends BrowserTestBase { * Tests that menu link pointing to entities get removed on entity remove. */ public function testMenuLinkOnEntityDelete() { + + // Create user. $user = User::create(['name' => 'username']); $user->save(); + + // Create "canonical" menu link pointing to the user. $menu_link_content = MenuLinkContent::create([ 'title' => 'username profile', 'menu_name' => 'menu_test', @@ -156,11 +160,30 @@ class LinksTest extends BrowserTestBase { 'bundle' => 'menu_test', ]); $menu_link_content->save(); + + // Create "collection" menu link pointing to the user listing page. + $menu_link_content_collection = MenuLinkContent::create([ + 'title' => 'users listing', + 'menu_name' => 'menu_test', + 'link' => [['uri' => 'internal:/' . $user->toUrl('collection')->getInternalPath()]], + 'bundle' => 'menu_test', + ]); + $menu_link_content_collection->save(); + + // Check is menu links present in the menu. $menu_tree_condition = (new MenuTreeParameters())->addCondition('route_name', 'entity.user.canonical'); $this->assertCount(1, \Drupal::menuTree()->load('menu_test', $menu_tree_condition)); + $menu_tree_condition_collection = (new MenuTreeParameters())->addCondition('route_name', 'entity.user.collection'); + $this->assertCount(1, \Drupal::menuTree()->load('menu_test', $menu_tree_condition_collection)); + // Delete the user. $user->delete(); + + // The "canonical" menu item has to be deleted. $this->assertCount(0, \Drupal::menuTree()->load('menu_test', $menu_tree_condition)); + + // The "collection" menu item should still present in the menu. + $this->assertCount(1, \Drupal::menuTree()->load('menu_test', $menu_tree_condition_collection)); } /**