diff --git a/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php b/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php index 63bd799..d7c3a84 100644 --- a/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php +++ b/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php @@ -221,7 +221,8 @@ public function form(array $form, FormStateInterface $form_state) { $form = parent::form($form, $form_state); $default = $this->entity->getMenuName() . ':' . $this->entity->getParentId(); - $form['menu_parent'] = $this->menuParentSelector->parentSelectElement($default, $this->entity->getPluginId()); + $id = $this->entity->isNew() ? '' : $this->entity->getPluginId(); + $form['menu_parent'] = $this->menuParentSelector->parentSelectElement($default, $id); $form['menu_parent']['#weight'] = 10; $form['menu_parent']['#title'] = $this->t('Parent link'); $form['menu_parent']['#description'] = $this->t('The maximum depth for a link and all its children is fixed. Some menu links may not be available as parents if selecting them would exceed this limit.'); diff --git a/core/modules/menu_ui/src/Tests/MenuTest.php b/core/modules/menu_ui/src/Tests/MenuTest.php index 8763132..be7e88c 100644 --- a/core/modules/menu_ui/src/Tests/MenuTest.php +++ b/core/modules/menu_ui/src/Tests/MenuTest.php @@ -462,6 +462,9 @@ function doMenuTests() { $this->clickLink($item8->getTitle()); $this->assertResponse(200); + // Check invalid menu link parents. + $this->checkInvalidParentMenuLinks(); + // Save menu links for later tests. $this->items[] = $item1; $this->items[] = $item2; @@ -648,6 +651,48 @@ function addInvalidMenuLink() { } /** + * Tests that parent options are limited by depth when adding menu links. + */ + function checkInvalidParentMenuLinks() { + $last_link = null; + $created_links = array(); + + // Get the max depth of the tree. + $menu_link_tree = \Drupal::service('menu.link_tree'); + $max_depth = $menu_link_tree->maxDepth(); + + // Create a maximum number of menu links, each a child of the previous. + for ($i = 0; $i <= $max_depth - 1; $i++) { + $parent = $last_link ? 'tools:' . $last_link->getPluginId() : 'tools:'; + $title = 'title' . $i; + $edit = array( + 'link[0][uri]' => '', + 'title[0][value]' => $title, + 'menu_parent' => $parent, + 'description[0][value]' => '', + 'enabled[value]' => 1, + 'expanded[value]' => FALSE, + 'weight[0][value]' => '0', + ); + $test = $this->drupalPostForm("admin/structure/menu/manage/{$this->menu->id()}/add", $edit, t('Save')); + $menu_links = entity_load_multiple_by_properties('menu_link_content', array('title' => $title)); + $last_link = reset($menu_links); + $created_links[] = 'tools:' . $last_link->getPluginId(); + } + + // Check that the last link cannot be selected as parent in the new menu link form. + $this->drupalGet('admin/structure/menu/manage/admin/add'); + $value = 'tools:' . $last_link->getPluginId(); + $this->assertNoOption('edit-menu-parent', $value, 'The invalid option is not there'); + + // Check that all links but the last can be selected as parent in the new menu link form. + array_pop($created_links); + foreach ($created_links as $key => $link) { + $this->assertOption('edit-menu-parent', $link, 'The valid option number ' . ($key + 1) . ' is there.'); + } + } + + /** * Verifies a menu link using the UI. * * @param \Drupal\menu_link_content\Entity\MenuLinkContent $item