diff options
-rw-r--r-- | includes/menu.inc | 9 | ||||
-rw-r--r-- | modules/simpletest/tests/menu.test | 12 | ||||
-rw-r--r-- | modules/simpletest/tests/menu_test.module | 14 |
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; } |