get('plugin.manager.entity') ->getListController('menu') ->render(); } /** * Page callback: Presents the menu creation form. * * @return array * A form array as expected by drupal_render(). * * @see menu_menu() */ function menu_menu_add() { $menu = entity_create('menu', array()); return entity_get_form($menu); } /** * Page callback: Presents the menu edit form. * * @param \Drupal\system\Plugin\Core\Entity\Menu $menu * The menu to edit. * * @return array * A form array as expected by drupal_render(). * * @see menu_menu() */ function menu_menu_edit(Menu $menu) { drupal_set_title(t('Edit menu %label', array('%label' => $menu->label())), PASS_THROUGH); return entity_get_form($menu); } /** * Form constructor to edit an entire menu tree at once. * * Shows for one menu the menu links accessible to the current user and * relevant operations. * * This form constructor can be integrated as a section into another form. It * relies on the following keys in $form_state: * - menu: A loaded menu definition, as returned by menu_load(). * - menu_overview_form_parents: An array containing the parent keys to this * form. * Forms integrating this section should call menu_overview_form_submit() from * their form submit handler. */ function menu_overview_form($form, &$form_state) { global $menu_admin; // Ensure that menu_overview_form_submit() knows the parents of this form // section. $form['#tree'] = TRUE; $form['#theme'] = 'menu_overview_form'; $form_state += array('menu_overview_form_parents' => array()); $form['#attached']['css'] = array(drupal_get_path('module', 'menu') . '/menu.admin.css'); $links = array(); $query = entity_query('menu_link') ->condition('menu_name', $form_state['menu']->id()); for ($i = 1; $i <= MENU_MAX_DEPTH; $i++) { $query->sort('p' . $i, 'ASC'); } $result = $query->execute(); if (!empty($result)) { $links = menu_link_load_multiple($result); } $delta = max(count($links), 50); $tree = menu_tree_data($links); $node_links = array(); menu_tree_collect_node_links($tree, $node_links); // We indicate that a menu administrator is running the menu access check. $menu_admin = TRUE; menu_tree_check_access($tree, $node_links); $menu_admin = FALSE; // Inline the "Add link" action so it displays right above the table of // links. No access check needed, since this form has the same access // restriction as adding menu items to the menu. $form['inline_actions'] = array( '#prefix' => '
' . format_plural($num_links, 'Warning: There is currently 1 menu link in %title. It will be deleted (system-defined items will be reset).', 'Warning: There are currently @count menu links in %title. They will be deleted (system-defined links will be reset).', array('%title' => $menu->label())) . '
'; } $caption .= '' . t('This action cannot be undone.') . '
'; return confirm_form($form, t('Are you sure you want to delete the custom menu %title?', array('%title' => $menu->label())), 'admin/structure/menu/manage/' . $menu->id(), $caption, t('Delete')); } /** * Delete a custom menu and all links in it. */ function menu_delete_menu_confirm_submit($form, &$form_state) { $menu = $form['#menu']; $form_state['redirect'] = 'admin/structure/menu'; // System-defined menus may not be deleted - only menus defined by this module. $system_menus = menu_list_system_menus(); if (isset($system_menus[$menu->id()])) { return; } // Reset all the menu links defined by the system via hook_menu(). // @todo Convert this to an EFQ once we figure out 'ORDER BY m.number_parts'. $result = db_query("SELECT mlid FROM {menu_links} ml INNER JOIN {menu_router} m ON ml.router_path = m.path WHERE ml.menu_name = :menu AND ml.module = 'system' ORDER BY m.number_parts ASC", array(':menu' => $menu->id()), array('fetch' => PDO::FETCH_ASSOC))->fetchCol(); $menu_links = menu_link_load_multiple($result); foreach ($menu_links as $link) { $link->reset(); } // Delete all links to the overview page for this menu. $menu_links = entity_load_multiple_by_properties('menu_link', array('link_path' => 'admin/structure/menu/manage/' . $menu->id())); menu_link_delete_multiple(array_keys($menu_links)); // Delete the custom menu and all its menu links. $menu->delete(); $t_args = array('%title' => $menu->label()); drupal_set_message(t('The custom menu %title has been deleted.', $t_args)); watchdog('menu', 'Deleted custom menu %title and all its menu links.', $t_args, WATCHDOG_NOTICE); } /** * Returns whether a menu name already exists. * * @see menu_edit_menu() * @see form_validate_machine_name() */ function menu_edit_menu_name_exists($value) { $custom_exists = entity_load('menu', $value); // 'menu-' is added to the menu name to avoid name-space conflicts. $value = 'menu-' . $value; $link_exists = entity_query('menu_link')->condition('menu_name', $value)->range(0,1)->count()->execute(); return $custom_exists || $link_exists; } /** * Submit function for adding or editing a custom menu. */ function menu_edit_menu_submit($form, &$form_state) { $menu = $form_state['values']; $path = 'admin/structure/menu/manage/'; if ($form['#insert']) { // Add 'menu-' to the menu name to help avoid name-space conflicts. $menu['id'] = 'menu-' . $menu['id']; $system_link = entity_load_multiple_by_properties('menu_link', array('link_path' => 'admin/structure/menu', 'module' => 'system')); $system_link = reset($system_link); $menu_link = entity_create('menu_link', array( 'link_title' => $menu['label'], 'link_path' => $path . $menu['id'], 'router_path' => $path . '%', 'plid' => $system_link->id(), )); $menu_link->save(); menu_save($menu); } else { menu_save($menu); $menu_links = entity_load_multiple_by_properties('menu_link', array('link_path' => $path . $menu['id'])); foreach ($menu_links as $menu_link) { $menu_link->link_title = $menu['label']; $menu_link->save(); } } drupal_set_message(t('Your configuration has been saved.')); $form_state['redirect'] = $path . $menu['id']; } /** * Menu callback: Provides the menu link submission form. * * @param \Drupal\system\Plugin\Core\Entity\Menu $menu * An entity representing a custom menu. * * @return * Returns the menu link submission form. */ function menu_link_add(Menu $menu) { $menu_link = entity_create('menu_link', array( 'mlid' => 0, 'plid' => 0, 'menu_name' => $menu->id(), )); drupal_set_title(t('Add menu link')); return entity_get_form($menu_link); } /** * Menu callback; Check access and present a confirm form for deleting a menu * link. */ function menu_link_delete_page(MenuLink $menu_link) { // Links defined via hook_menu may not be deleted. Updated items are an // exception, as they can be broken. if ($menu_link->module == 'system' && !$menu_link->updated) { throw new AccessDeniedHttpException(); } return drupal_get_form('menu_link_delete_form', $menu_link); } /** * Build a confirm form for deletion of a single menu link. */ function menu_link_delete_form($form, &$form_state, MenuLink $menu_link) { $form['#menu_link'] = $menu_link; return confirm_form($form, t('Are you sure you want to delete the custom menu link %item?', array('%item' => $menu_link->link_title)), 'admin/structure/menu/manage/' . $menu_link->menu_name ); } /** * Processes menu link delete form submissions. */ function menu_link_delete_form_submit($form, &$form_state) { $menu_link = $form['#menu_link']; menu_link_delete($menu_link->id()); $t_args = array('%title' => $menu_link->link_title); drupal_set_message(t('The menu link %title has been deleted.', $t_args)); watchdog('menu', 'Deleted menu link %title.', $t_args, WATCHDOG_NOTICE); $form_state['redirect'] = 'admin/structure/menu/manage/' . $menu_link->menu_name; } /** * Menu callback; Reset a single modified menu link. */ function menu_link_reset_form($form, &$form_state, MenuLink $menu_link) { $form['#menu_link'] = $menu_link; return confirm_form($form, t('Are you sure you want to reset the link %item to its default values?', array('%item' => $menu_link->link_title)), 'admin/structure/menu/manage/' . $menu_link->menu_name, t('Any customizations will be lost. This action cannot be undone.'), t('Reset')); } /** * Processes menu link reset form submissions. */ function menu_link_reset_form_submit($form, &$form_state) { $menu_link = $form['#menu_link']; $new_menu_link = $menu_link->reset(); drupal_set_message(t('The menu link was reset to its default settings.')); $form_state['redirect'] = 'admin/structure/menu/manage/' . $new_menu_link->menu_name; }