Index: includes/menu.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/menu.inc,v retrieving revision 1.325 diff -u -p -r1.325 menu.inc --- includes/menu.inc 24 May 2009 17:39:30 -0000 1.325 +++ includes/menu.inc 27 May 2009 13:53:00 -0000 @@ -2243,6 +2243,26 @@ function menu_link_save(&$item) { } /** + * Save a custom menu. + * + * @param menu_name + * The machine readable name. + * @param $title + * The human readable name. + * @param description + * Optional; The custom menu description. + */ +function menu_custom_save($menu_name, $title, $description = '') { + db_merge('menu_custom') + ->key(array('menu_name' => $menu_name)) + ->fields(array( + 'title' => $title, + 'description' => $description, + )) + ->execute(); +} + +/** * Helper function to clear the page and block caches at most twice per page load. */ function _menu_clear_page_cache() { Index: modules/menu/menu.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/menu/menu.admin.inc,v retrieving revision 1.48 diff -u -p -r1.48 menu.admin.inc --- modules/menu/menu.admin.inc 24 May 2009 17:39:32 -0000 1.48 +++ modules/menu/menu.admin.inc 27 May 2009 13:53:00 -0000 @@ -574,22 +574,10 @@ function menu_edit_menu_submit($form, &$ ->fetchField(); menu_link_save($link); - db_insert('menu_custom') - ->fields(array( - 'menu_name' => $menu['menu_name'], - 'title' => $menu['title'], - 'description' => $menu['description'], - )) - ->execute(); + menu_custom_save($menu['menu_name'], $menu['title'], $menu['description']); } else { - db_update('menu_custom') - ->fields(array( - 'title' => $menu['title'], - 'description' => $menu['description'], - )) - ->condition('menu_name', $menu['menu_name']) - ->execute(); + menu_custom_save($menu['menu_name'], $menu['title'], $menu['description']); $result = db_query("SELECT mlid FROM {menu_links} WHERE link_path = :path", array(':path' => $path . $menu['menu_name']), array('fetch' => PDO::FETCH_ASSOC)); foreach ($result as $m) { $link = menu_link_load($m['mlid']); Index: modules/menu/menu.test =================================================================== RCS file: /cvs/drupal/drupal/modules/menu/menu.test,v retrieving revision 1.15 diff -u -p -r1.15 menu.test --- modules/menu/menu.test 24 May 2009 17:39:32 -0000 1.15 +++ modules/menu/menu.test 27 May 2009 13:53:01 -0000 @@ -87,6 +87,34 @@ class MenuTestCase extends DrupalWebTest $this->menu = $this->addCustomMenu(); $this->doMenuTests($this->menu['menu_name']); $this->addInvalidMenuLink($this->menu['menu_name']); + $this->addCustomMenuApi(); + } + + /** + * Add custom menu using API. + */ + function addCustomMenuApi() { + // Add a new custom menu. + $menu_name = substr(md5($this->randomName(16)), 0, MENU_MAX_MENU_NAME_LENGTH_UI); + $title = $this->randomName(16); + + $menu = array( + 'menu_name' => $menu_name, + 'title' => $title, + 'description' => 'Description text', + ); + menu_custom_save($menu['menu_name'], $menu['title'], $menu['description']); + + // Assert the menu. + $this->drupalGet('admin/build/menu-customize/' . $menu_name . '/edit'); + $this->assertText($title, t('Custom menu was added.')); + + // Edit the menu. + $new_title = $this->randomName(16); + $menu['title'] = $new_title; + menu_custom_save($menu['menu_name'], $menu['title']); + $this->drupalGet('admin/build/menu-customize/' . $menu_name . '/edit'); + $this->assertText($new_title, t('Custom menu was edited.')); } /**