1 menu.module | menu_form_node_form_alter(&$form, $form_state) |
Implements hook_form_BASE_FORM_ID_alter().
Adds menu item fields to the node form.
See also
File
- core/
modules/ menu/ menu.module, line 728 - Allows administrators to customize the site's menus.
Code
function menu_form_node_form_alter(&$form, $form_state) {
// Generate a list of possible parents (not including this link or descendants).
// @todo This must be handled in a #process handler.
$link = $form['#node']->menu;
$type = $form['#node']->type;
$node_type = node_type_load($type);
// Function menu_node_prepare() makes sure, that $node->menu always exists.
$options = menu_parent_options(menu_get_menus(), $link, $type);
// If no possible parent menu items were found, there is nothing to display.
if (empty($options)) {
return;
}
// Attach ajax to the node form language select list.
if (module_exists('language')) {
$form['langcode']['#ajax'] = array(
'callback' => 'menu_update_parent_options_ajax',
'wrapper' => 'menu-parent-select-wrapper',
);
}
$form['menu'] = array(
'#type' => 'fieldset',
'#title' => t('Menu settings'),
'#access' => user_access('administer menu'),
'#collapsible' => TRUE,
'#collapsed' => !$link['link_title'],
'#group' => 'additional_settings',
'#attached' => array(
'js' => array(backdrop_get_path('module', 'menu') . '/js/menu.js'),
),
'#tree' => TRUE,
'#weight' => 40,
'#attributes' => array('class' => array('menu-link-form')),
);
$form['menu']['enabled'] = array(
'#type' => 'checkbox',
'#title' => t('Provide a menu link'),
'#default_value' => empty($form['#node']->nid) ? $node_type->settings['menu_default'] : (int) (bool) $link['mlid'],
);
$form['menu']['link'] = array(
'#type' => 'container',
'#parents' => array('menu'),
'#states' => array(
'invisible' => array(
'input[name="menu[enabled]"]' => array('checked' => FALSE),
),
),
);
// Populate the element with the link data.
foreach (array('mlid', 'module', 'hidden', 'has_children', 'customized', 'options', 'expanded', 'hidden', 'parent_depth_limit') as $key) {
$form['menu']['link'][$key] = array('#type' => 'value', '#value' => $link[$key]);
}
$form['menu']['link']['link_title'] = array(
'#type' => 'textfield',
'#title' => t('Menu link title'),
'#maxlength' => 255,
'#default_value' => $link['mlid'] ? $link['link_title'] : '',
);
$form['menu']['link']['description'] = array(
'#type' => 'textarea',
'#title' => t('Description'),
'#default_value' => isset($link['options']['attributes']['title']) ? $link['options']['attributes']['title'] : '',
'#rows' => 1,
'#description' => t('Shown when hovering over the menu link.'),
);
$default = ($link['mlid'] ? $link['menu_name'] . ':' . $link['plid'] : $node_type->settings['menu_parent']);
// If the current parent menu item is not present in options, use the first
// available option as default value.
// @todo User should not be allowed to access menu link settings in such a
// case.
if (!isset($options[$default])) {
$array = array_keys($options);
$default = reset($array);
}
$form['menu']['link']['parent'] = array(
'#type' => 'select',
'#title' => t('Parent item'),
'#default_value' => $default,
'#options' => $options,
'#attributes' => array('class' => array('menu-parent-select')),
'#prefix' => '<div id="menu-parent-select-wrapper">',
'#suffix' => '</div>',
);
// Get number of items in all possible parent menus, so the weight selector is
// sized appropriately.
$menu_names = array_keys(menu_get_menus());
$menu_options = array();
foreach ($menu_names as $menu_name) {
if (isset($options[$menu_name . ':0'])) {
$menu_options[] = $menu_name;
}
}
// Make sure that we always have values in menu_options.
$menu_options = !empty($menu_options) ? $menu_options : $menu_names;
$form['menu']['link']['weight'] = array(
'#type' => 'weight',
'#title' => t('Weight'),
'#delta' => _menu_get_menu_weight_delta($menu_options),
'#default_value' => $link['weight'],
'#description' => t('Menu links with smaller weights are displayed before links with larger weights.'),
);
}