On a fresh website custom menus are never added to the menu_default_active_menus variable and this variable is never created at all. The reason is in different default values used for this variable in menu_save() function and menu_set_active_menu_names(). In the first one default value contains only custom menus (including saved menu) and in the latter one default value is system menus list.
In menu_save():
function menu_save($menu) {
$status = db_merge('menu_custom')
->key(array('menu_name' => $menu['menu_name']))
->fields(array(
'title' => $menu['title'],
'description' => $menu['description'],
))
->execute();
menu_cache_clear_all();
switch ($status) {
case SAVED_NEW:
// Make sure the menu is present in the active menus variable so that its
// items may appear in the menu active trail.
// @see menu_set_active_menu_names()
$active_menus = variable_get('menu_default_active_menus', array_keys(menu_get_menus()));
if (!in_array($menu['menu_name'], $active_menus)) {
// Never happens, because $active_menus contains custom menus returned as a default value.
$active_menus[] = $menu['menu_name'];
variable_set('menu_default_active_menus', $active_menus);
}
module_invoke_all('menu_insert', $menu);
break;
case SAVED_UPDATED:
module_invoke_all('menu_update', $menu);
break;
}
}
As a result menu_set_active_menu_names() returns system menus:
function menu_set_active_menu_names($menu_names = NULL) {
$active = &drupal_static(__FUNCTION__);
if (isset($menu_names) && is_array($menu_names)) {
$active = $menu_names;
}
elseif (!isset($active)) {
$active = variable_get('menu_default_active_menus', array_keys(menu_list_system_menus()));
}
return $active;
}
This problem also exists in D8. Is it a bug or a feature?
Comments
Comment #1
jax commentedJust hit the same bug. It's a bug, default values should be the same everywhere or things won't work.
Comment #1.0
jax commentedAdded functions source code.