Same name and namespace in other branches
  1. 4.6.x includes/menu.inc \menu_rebuild()
  2. 5.x includes/menu.inc \menu_rebuild()
  3. 6.x includes/menu.inc \menu_rebuild()
  4. 7.x includes/menu.inc \menu_rebuild()

Populate the database representation of the menu.

This need only be called at the start of pages that modify the menu.

Related topics

9 calls to menu_rebuild()
aggregator_form_category_submit in modules/aggregator.module
Process aggregator_form_category form submissions. @todo Add delete confirmation dialog.
aggregator_form_feed_submit in modules/aggregator.module
Process aggregator_form_feed form submissions. @todo Add delete confirmation dialog.
menu_overview in modules/menu.module
Menu callback; present the main menu management page.
system_modules_submit in modules/system.module
system_settings_form_submit in modules/system.module
Execute the system_settings_form.

... See full list

File

includes/menu.inc, line 588
API for the Drupal menu system.

Code

function menu_rebuild() {

  // Clear the page cache, so that changed menus are reflected for anonymous users.
  cache_clear_all();

  // Also clear the menu cache.
  cache_clear_all('menu:', TRUE);
  _menu_build();
  if (module_exist('menu')) {
    $menu = menu_get_menu();

    // Fill a queue of new menu items which are modifiable.
    $new_items = array();
    foreach ($menu['items'] as $mid => $item) {
      if ($mid < 0 && $item['type'] & MENU_MODIFIABLE_BY_ADMIN) {
        $new_items[$mid] = $item;
      }
    }
    $old_count = -1;

    // Save the new items updating the pids in each iteration
    while (($c = count($new_items)) && $c != $old_count) {
      $old_count = count($new_items);
      foreach ($new_items as $mid => $item) {

        // If the item has a valid parent, save it
        if ($item['pid'] >= 0) {

          // The new menu ID gets passed back by reference as $item['mid']
          menu_save_item($item);

          // Fix parent IDs for the children of the menu item just saved
          if ($item['children']) {
            foreach ($item['children'] as $child) {
              if (isset($new_items[$child])) {
                $new_items[$child]['pid'] = $item['mid'];
              }
            }
          }

          // remove the item
          unset($new_items[$mid]);
        }
      }
    }

    // Rebuild the menu to account for the changes.
    _menu_build();
  }

  // Reset the cached $menu in menu_get_item().
  menu_get_item(NULL, NULL, TRUE);
}