From 3ca907cb351afee3a2db07026089586fb6b1536e Mon Sep 17 00:00:00 2001
From: Dries Buytaert <dries@buytaert.net>
Date: Fri, 13 May 2011 11:57:16 -0400
Subject: [PATCH] =?UTF-8?q?-=20Patch=20#761648=20by=20lyricnz,=20andypost,?=
 =?UTF-8?q?=20ksenzee,=20Jody=20Lynn,=20G=C3=A1bor=20Hojtsy,=20Damien=20To?=
 =?UTF-8?q?urnoud,=20Shawn=20DeArmond,=20David=5FRothstein:=20menu=20items?=
 =?UTF-8?q?=20disappear=20after=20upgrade=20or=20manual=20menu=20entry.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 modules/menu/menu.module | 21 +++++++++++++--------
 modules/menu/menu.test   | 16 ++++++++++++++++
 2 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/modules/menu/menu.module b/modules/menu/menu.module
index 3edf158df144..fc8f68a6cb60 100644
--- a/modules/menu/menu.module
+++ b/modules/menu/menu.module
@@ -540,18 +540,23 @@ function menu_node_delete($node) {
 function menu_node_prepare($node) {
   if (empty($node->menu)) {
     // Prepare the node for the edit form so that $node->menu always exists.
-    $menu_name = variable_get('menu_parent_' . $node->type, 'main-menu:0');
+    $menu_name = strtok(variable_get('menu_parent_' . $node->type, 'main-menu:0'), ':');
     $item = array();
     if (isset($node->nid)) {
+      $mlid = FALSE;
       // Give priority to the default menu
-      $mlid = db_query_range("SELECT mlid FROM {menu_links} WHERE link_path = :path AND menu_name = :menu_name AND module = 'menu' ORDER BY mlid ASC", 0, 1, array(
-        ':path' => 'node/' . $node->nid,
-        ':menu_name' => $menu_name,
-      ))->fetchField();
-      // Check all menus if a link does not exist in the default menu.
-      if (!$mlid) {
-        $mlid = db_query_range("SELECT mlid FROM {menu_links} WHERE link_path = :path AND module = 'menu' ORDER BY mlid ASC", 0, 1, array(
+      $type_menus = variable_get('menu_options_' . $node->type, array('main-menu' => 'main-menu'));
+      if (in_array($menu_name, $type_menus)) {
+        $mlid = db_query_range("SELECT mlid FROM {menu_links} WHERE link_path = :path AND menu_name = :menu_name AND module = 'menu' ORDER BY mlid ASC", 0, 1, array(
           ':path' => 'node/' . $node->nid,
+          ':menu_name' => $menu_name,
+        ))->fetchField();
+      }
+      // Check all allowed menus if a link does not exist in the default menu.
+      if (!$mlid && !empty($type_menus)) {
+        $mlid = db_query_range("SELECT mlid FROM {menu_links} WHERE link_path = :path AND module = 'menu' AND menu_name IN (:type_menus) ORDER BY mlid ASC", 0, 1, array(
+          ':path' => 'node/' . $node->nid,
+          ':type_menus' => array_values($type_menus),
         ))->fetchField();
       }
       if ($mlid) {
diff --git a/modules/menu/menu.test b/modules/menu/menu.test
index 510e20c115ab..b457177cdbb0 100644
--- a/modules/menu/menu.test
+++ b/modules/menu/menu.test
@@ -664,5 +664,21 @@ class MenuNodeTestCase extends DrupalWebTestCase {
     // Assert that there is no link for the node.
     $this->drupalGet('');
     $this->assertNoLink($node_title);
+
+    // Add a menu link to the Management menu.
+    $item = array(
+      'link_path' => 'node/' . $node->nid,
+      'link_title' => $this->randomName(16),
+      'menu_name' => 'management',
+    );
+    menu_link_save($item);
+
+    // Assert that disabled Management menu is not shown on the node/$nid/edit page.
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertText('Provide a menu link', t('Link in not allowed menu not shown in node edit form'));
+    // Assert that the link is still in the management menu after save.
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $link = menu_link_load($item['mlid']);
+    $this->assertTrue($link, t('Link in not allowed menu still exists after saving node'));
   }
 }
-- 
GitLab