summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/menu.inc9
-rw-r--r--modules/simpletest/tests/menu.test12
-rw-r--r--modules/simpletest/tests/menu_test.module14
3 files changed, 31 insertions, 4 deletions
diff --git a/includes/menu.inc b/includes/menu.inc
index cff3ef5d8..706347278 100644
--- a/includes/menu.inc
+++ b/includes/menu.inc
@@ -2063,16 +2063,17 @@ function menu_link_save(&$item) {
// If not derived from a router item, we respect the specified menu name.
$query->condition('menu_name', $item['menu_name']);
}
+
// Find the parent - it must be unique.
$parent_path = $item['link_path'];
do {
$parent = FALSE;
$parent_path = substr($parent_path, 0, strrpos($parent_path, '/'));
- $query->condition('link_path', $parent_path);
- $query_cnt = $query;
+ $new_query = clone $query;
+ $new_query->condition('link_path', $parent_path);
// Only valid if we get a unique result.
- if ($query_cnt->countQuery()->execute()->fetchField() == 1) {
- $parent = $query->fields('menu_links')->execute()->fetchAssoc();
+ if ($new_query->countQuery()->execute()->fetchField() == 1) {
+ $parent = $new_query->fields('menu_links')->execute()->fetchAssoc();
}
} while ($parent === FALSE && $parent_path);
}
diff --git a/modules/simpletest/tests/menu.test b/modules/simpletest/tests/menu.test
index a4935c968..633945cfc 100644
--- a/modules/simpletest/tests/menu.test
+++ b/modules/simpletest/tests/menu.test
@@ -47,6 +47,18 @@ class MenuIncTestCase extends DrupalWebTestCase {
$name = db_result(db_query($sql));
$this->assertEqual($name, 'changed', t('Menu name was successfully changed after rebuild.'));
}
+
+ /**
+ * Tests for menu hiearchy.
+ */
+ function testMenuHiearchy() {
+ $parent_link = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => 'menu-test/hierarchy/parent'))->fetchAssoc();
+ $child_link = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => 'menu-test/hierarchy/parent/child'))->fetchAssoc();
+ $unattached_child_link = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => 'menu-test/hierarchy/parent/child2/child'))->fetchAssoc();
+
+ $this->assertEqual($child_link['plid'], $parent_link['mlid'], t('The parent of a directly attached child is correct.'));
+ $this->assertEqual($unattached_child_link['plid'], $parent_link['mlid'], t('The parent of a non-directly attached child is correct.'));
+ }
}
/**
diff --git a/modules/simpletest/tests/menu_test.module b/modules/simpletest/tests/menu_test.module
index 7a25f6aff..7bb5af5e5 100644
--- a/modules/simpletest/tests/menu_test.module
+++ b/modules/simpletest/tests/menu_test.module
@@ -24,6 +24,20 @@ function menu_test_menu() {
'page callback' => 'menu_test_callback',
'access arguments' => array('access content'),
);
+
+ // Hierarchical tests.
+ $items['menu-test/hierarchy/parent'] = array(
+ 'title' => 'Parent menu router',
+ 'page callback' => 'node_page_default',
+ );
+ $items['menu-test/hierarchy/parent/child'] = array(
+ 'title' => 'Child menu router',
+ 'page callback' => 'node_page_default',
+ );
+ $items['menu-test/hierarchy/parent/child2/child'] = array(
+ 'title' => 'Unattached subchild router',
+ 'page callback' => 'node_page_default',
+ );
return $items;
}