diff options
Diffstat (limited to 'modules/menu')
-rw-r--r-- | modules/menu/menu.module | 61 |
1 files changed, 41 insertions, 20 deletions
diff --git a/modules/menu/menu.module b/modules/menu/menu.module index 6ca854633..be44c1330 100644 --- a/modules/menu/menu.module +++ b/modules/menu/menu.module @@ -270,19 +270,27 @@ function menu_flip_item($hide, $item) { */ function menu_edit_item(&$form_state, $type, $item, $menu) { + $form['menu'] = array( + '#type' => 'fieldset', + '#title' => t('Menu settings'), + '#collapsible' => FALSE, + '#tree' => TRUE, + '#weight' => -2, + '#attributes' => array('class' => 'menu-item-form'), + ); if ($type == 'add' || empty($item)) { // This is an add form, initialize the menu link. $item = array('link_title' => '', 'mlid' => 0, 'plid' => 0, 'menu_name' => $menu['menu_name'], 'weight' => 0, 'link_path' => '', 'options' => array(), 'module' => 'menu', 'expanded' => 0, 'hidden' => 0, 'has_children' => 0); } foreach (array('link_path', 'mlid', 'module', 'hidden', 'has_children', 'options') as $key) { - $form[$key] = array('#type' => 'value', '#value' => $item[$key]); + $form['menu'][$key] = array('#type' => 'value', '#value' => $item[$key]); } // Any item created or edited via this interface is considered "customized". - $form['customized'] = array('#type' => 'value', '#value' => 1); - $form['original_item'] = array('#type' => 'value', '#value' => $item); + $form['menu']['customized'] = array('#type' => 'value', '#value' => 1); + $form['menu']['original_item'] = array('#type' => 'value', '#value' => $item); if ($item['module'] == 'menu') { - $form['link_path'] = array( + $form['menu']['link_path'] = array( '#type' => 'textfield', '#title' => t('Path'), '#default_value' => $item['link_path'], @@ -298,26 +306,26 @@ function menu_edit_item(&$form_state, $type, $item, $menu) { ); } else { - $form['_path'] = array( + $form['menu']['_path'] = array( '#type' => 'item', '#title' => t('Path'), '#description' => l($item['link_title'], $item['href'], $item['options']), ); } - $form['link_title'] = array('#type' => 'textfield', + $form['menu']['link_title'] = array('#type' => 'textfield', '#title' => t('Menu link title'), '#default_value' => $item['link_title'], '#description' => t('The link text corresponding to this item that should appear in the menu.'), '#required' => TRUE, ); - $form['description'] = array( + $form['menu']['description'] = array( '#type' => 'textarea', '#title' => t('Description'), '#default_value' => isset($item['options']['attributes']['title']) ? $item['options']['attributes']['title'] : '', '#rows' => 1, '#description' => t('The description displayed when hovering over a menu item.'), ); - $form['expanded'] = array( + $form['menu']['expanded'] = array( '#type' => 'checkbox', '#title' => t('Expanded'), '#default_value' => $item['expanded'], @@ -330,13 +338,15 @@ function menu_edit_item(&$form_state, $type, $item, $menu) { if (!isset($options[$default])) { $default = 'navigation:0'; } - $form['parent'] = array( + $form['menu']['parent'] = array( '#type' => 'select', '#title' => t('Parent item'), '#default_value' => $default, '#options' => $options, + '#description' => t('The maximum depth for an item and all its children is fixed at !maxdepth. Some menu items may not be available as parents if selecting them would exceed this limit.', array('!maxdepth' => MENU_MAX_DEPTH)), + '#attributes' => array('class' => 'menu-title-select'), ); - $form['weight'] = array( + $form['menu']['weight'] = array( '#type' => 'weight', '#title' => t('Weight'), '#default_value' => $item['weight'], @@ -352,7 +362,7 @@ function menu_edit_item(&$form_state, $type, $item, $menu) { * Validate form values for a menu link being added or edited. */ function menu_edit_item_validate($form, &$form_state) { - $item = $form_state['values']; + $item = $form_state['values']['menu']; if (!trim($item['link_path']) || !menu_valid_path($item)) { form_set_error('link_path', t("The path '@link_path' is either invalid or you do not have access to it.", array('@link_path' => $item['link_path']))); } @@ -362,19 +372,20 @@ function menu_edit_item_validate($form, &$form_state) { * Submit function for the delete button on the menu item editing form. */ function menu_item_delete_submit($form, &$form_state) { - $form_state['redirect'] = 'admin/build/menu/item/'. $form_state['values']['mlid'] .'/delete'; + $form_state['redirect'] = 'admin/build/menu/item/'. $form_state['values']['menu']['mlid'] .'/delete'; } /** * Process menu and menu item add/edit form submissions. */ function menu_edit_item_submit($form, &$form_state) { - $form_state['values']['options']['attributes']['title'] = $form_state['values']['description']; - list($form_state['values']['menu_name'], $form_state['values']['plid']) = explode(':', $form_state['values']['parent']); - if (!menu_link_save($form_state['values'])) { + $item = $form_state['values']['menu']; + $item['options']['attributes']['title'] = $item['description']; + list($item['menu_name'], $item['plid']) = explode(':', $item['parent']); + if (!menu_link_save($item)) { drupal_set_message(t('There was an error saving the menu link.'), 'error'); } - $form_state['redirect'] = 'admin/build/menu-customize/'. $form_state['values']['menu_name']; + $form_state['redirect'] = 'admin/build/menu-customize/'. $item['menu_name']; } /** @@ -391,10 +402,13 @@ function menu_edit_item_submit($form, &$form_state) { */ function menu_parent_options($menus, $item) { + // If the item has children, there is an added limit to the depth of valid parents. + $limit = MENU_MAX_DEPTH - 1 - (($item['mlid'] && $item['has_children']) ? menu_link_children_relative_depth($item) : 0); + foreach ($menus as $menu_name => $title) { $tree = menu_tree_all_data($menu_name, NULL); $options[$menu_name .':0'] = '<'. $title .'>'; - _menu_parents_recurse($tree, $menu_name, '--', $options, $item['mlid']); + _menu_parents_recurse($tree, $menu_name, '--', $options, $item['mlid'], $limit); } return $options; } @@ -402,16 +416,20 @@ function menu_parent_options($menus, $item) { /** * Recursive helper function for menu_parent_options(). */ -function _menu_parents_recurse($tree, $menu_name, $indent, &$options, $exclude) { +function _menu_parents_recurse($tree, $menu_name, $indent, &$options, $exclude, $depth_limit) { foreach ($tree as $data) { + if ($data['link']['depth'] > $depth_limit) { + // Don't iterate through any links on this level. + break; + } if ($data['link']['mlid'] != $exclude && $data['link']['hidden'] >= 0) { $title = $indent .' '. truncate_utf8($data['link']['title'], 30, TRUE, FALSE); if ($data['link']['hidden']) { $title .= ' ('. t('disabled') .')'; } $options[$menu_name .':'. $data['link']['mlid']] = $title; - if ($data['below'] && $data['link']['depth'] < MENU_MAX_DEPTH - 1) { - _menu_parents_recurse($data['below'], $menu_name, $indent .'--', $options, $exclude); + if ($data['below']) { + _menu_parents_recurse($data['below'], $menu_name, $indent .'--', $options, $exclude, $depth_limit); } } } @@ -728,6 +746,7 @@ function menu_form_alter(&$form, $form_state, $form_id) { '#collapsed' => FALSE, '#tree' => TRUE, '#weight' => -2, + '#attributes' => array('class' => 'menu-item-form'), ); $item = $form['#node']->menu; @@ -763,6 +782,8 @@ function menu_form_alter(&$form, $form_state, $form_id) { '#title' => t('Parent item'), '#default_value' => $default, '#options' => $options, + '#description' => t('The maximum depth for an item and all its children is fixed at !maxdepth. Some menu items may not be available as parents if selecting them would exceed this limit.', array('!maxdepth' => MENU_MAX_DEPTH)), + '#attributes' => array('class' => 'menu-title-select'), ); $form['#submit'][] = 'menu_node_form_submit'; |