danielebarchiesi@2: array( danielebarchiesi@2: 'title' => t('Administer menu attributes'), danielebarchiesi@2: 'description' => t('Administer menu attributes.'), danielebarchiesi@2: ), danielebarchiesi@2: ); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Implements hook_menu_link_alter(). danielebarchiesi@2: */ danielebarchiesi@2: function menu_attributes_menu_link_alter(&$item, $menu) { danielebarchiesi@2: if (isset($item['options']['attributes']) && is_array($item['options']['attributes'])) { danielebarchiesi@2: // Filter out blank attributes. danielebarchiesi@2: foreach ($item['options']['attributes'] as $key => $value) { danielebarchiesi@2: if ((is_array($value) && empty($value)) || is_string($value) && !drupal_strlen($value)) { danielebarchiesi@2: unset($item['options']['attributes'][$key]); danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: // Convert classes to an array. danielebarchiesi@2: if (isset($item['options']['attributes']['class']) && is_string($item['options']['attributes']['class'])) { danielebarchiesi@2: $item['options']['attributes']['class'] = explode(' ', $item['options']['attributes']['class']); danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Implements hook_menu_attriute_info(). danielebarchiesi@2: */ danielebarchiesi@2: function menu_attributes_menu_attribute_info() { danielebarchiesi@2: $info['title'] = array( danielebarchiesi@2: 'label' => t('Title'), danielebarchiesi@2: 'description' => t('The description displayed when hovering over the link.'), danielebarchiesi@2: 'form' => array( danielebarchiesi@2: '#type' => 'textarea', danielebarchiesi@2: '#rows' => 2, danielebarchiesi@2: ), danielebarchiesi@2: ); danielebarchiesi@2: $info['id'] = array( danielebarchiesi@2: 'label' => t('ID'), danielebarchiesi@2: 'description' => t('Specifies a unique ID for the link.'), danielebarchiesi@2: ); danielebarchiesi@2: $info['name'] = array( danielebarchiesi@2: 'label' => t('Name'), danielebarchiesi@2: ); danielebarchiesi@2: $info['rel'] = array( danielebarchiesi@2: 'label' => t('Relationship'), danielebarchiesi@2: 'description' => t("Specifies the relationship between the current page and the link. Enter 'nofollow' here to nofollow this link."), danielebarchiesi@2: ); danielebarchiesi@2: $info['class'] = array( danielebarchiesi@2: 'label' => t('Classes'), danielebarchiesi@2: 'description' => t('Enter additional classes to be added to the link.'), danielebarchiesi@2: ); danielebarchiesi@2: $info['style'] = array( danielebarchiesi@2: 'label' => t('Style'), danielebarchiesi@2: 'description' => t('Enter additional styles to be applied to the link.'), danielebarchiesi@2: ); danielebarchiesi@2: $info['target'] = array( danielebarchiesi@2: 'label' => t('Target'), danielebarchiesi@2: 'description' => t('Specifies where to open the link. Using this attribute breaks XHTML validation.'), danielebarchiesi@2: 'form' => array( danielebarchiesi@2: '#type' => 'select', danielebarchiesi@2: '#options' => array( danielebarchiesi@2: '' => 'None (i.e. same window)', danielebarchiesi@2: '_blank' => 'New window (_blank)', danielebarchiesi@2: '_top' => 'Top window (_top)', danielebarchiesi@2: '_self' => 'Same window (_self)', danielebarchiesi@2: '_parent' => 'Parent window (_parent)', danielebarchiesi@2: ), danielebarchiesi@2: ), danielebarchiesi@2: ); danielebarchiesi@2: $info['accesskey'] = array( danielebarchiesi@2: 'label' => t('Access Key'), danielebarchiesi@2: 'description' => t('Specifies a keyboard shortcut to access this link.', array('@accesskey' => url('http://en.wikipedia.org/wiki/Access_keys'))), danielebarchiesi@2: 'form' => array( danielebarchiesi@2: '#maxlength' => 1, danielebarchiesi@2: '#size' => 1, danielebarchiesi@2: ), danielebarchiesi@2: ); danielebarchiesi@2: return $info; danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Fetch an array of menu attributes. danielebarchiesi@2: */ danielebarchiesi@2: function menu_attributes_get_menu_attribute_info() { danielebarchiesi@2: $attributes = module_invoke_all('menu_attribute_info'); danielebarchiesi@2: drupal_alter('menu_attribute_info', $attributes); danielebarchiesi@2: danielebarchiesi@2: // Merge in defaul values. danielebarchiesi@2: foreach ($attributes as $attribute => &$info) { danielebarchiesi@2: $info += array( danielebarchiesi@2: 'form' => array(), danielebarchiesi@2: 'enabled' => variable_get("menu_attributes_{$attribute}_enable", 1), danielebarchiesi@2: 'default' => '', danielebarchiesi@2: ); danielebarchiesi@2: $info['form'] += array( danielebarchiesi@2: '#type' => 'textfield', danielebarchiesi@2: '#title' => $info['label'], danielebarchiesi@2: '#description' => isset($info['description']) ? $info['description'] : '', danielebarchiesi@2: '#default_value' => variable_get("menu_attributes_{$attribute}_default", $info['default']), danielebarchiesi@2: ); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: return $attributes; danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Implements hook_form_FORM_ID_alter(). danielebarchiesi@2: * danielebarchiesi@2: * Adds menu attribute options to the edit menu item form. danielebarchiesi@2: * danielebarchiesi@2: * @see menu_edit_item() danielebarchiesi@2: * @see _menu_attributes_form_alter() danielebarchiesi@2: * @see menu_attributes_form_menu_edit_item_submit() danielebarchiesi@2: */ danielebarchiesi@2: function menu_attributes_form_menu_edit_item_alter(&$form, $form_state) { danielebarchiesi@2: $item = $form['original_item']['#value']; danielebarchiesi@2: _menu_attributes_form_alter($form, $item, $form); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Implements hook_form_FORM_ID_alter(). danielebarchiesi@2: * danielebarchiesi@2: * Adds menu attribute options to the node's edit menu item form. danielebarchiesi@2: * danielebarchiesi@2: * @see _menu_attributes_form_alter() danielebarchiesi@2: */ danielebarchiesi@2: function menu_attributes_form_node_form_alter(&$form, $form_state) { danielebarchiesi@2: if (isset($form['menu']['link'])) { danielebarchiesi@2: $item = $form['#node']->menu; danielebarchiesi@2: _menu_attributes_form_alter($form['menu']['link'], $item, $form); danielebarchiesi@2: $form['menu']['link']['options']['attributes']['#type'] = 'container'; danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Add the menu attributes to a menu item edit form. danielebarchiesi@2: * danielebarchiesi@2: * @param $form danielebarchiesi@2: * The menu item edit form passed by reference. danielebarchiesi@2: * @param $item danielebarchiesi@2: * The optional existing menu item for context. danielebarchiesi@2: */ danielebarchiesi@2: function _menu_attributes_form_alter(array &$form, array $item = array(), array &$complete_form) { danielebarchiesi@2: // Restrict access to the new form elements. danielebarchiesi@2: $form['options']['attributes']['#access'] = user_access('administer menu attributes'); danielebarchiesi@2: danielebarchiesi@2: $form['options']['#tree'] = TRUE; danielebarchiesi@2: $form['options']['#weight'] = 50; danielebarchiesi@2: danielebarchiesi@2: // Unset the previous value so that the new values get saved. danielebarchiesi@2: unset($form['options']['#value']['attributes']); danielebarchiesi@2: danielebarchiesi@2: $form['options']['attributes'] = array( danielebarchiesi@2: '#type' => 'fieldset', danielebarchiesi@2: '#title' => t('Menu item attributes'), danielebarchiesi@2: '#collapsible' => TRUE, danielebarchiesi@2: '#collapsed' => FALSE, danielebarchiesi@2: '#tree' => TRUE, danielebarchiesi@2: ); danielebarchiesi@2: danielebarchiesi@2: $attributes = menu_attributes_get_menu_attribute_info(); danielebarchiesi@2: foreach ($attributes as $attribute => $info) { danielebarchiesi@2: // Merge in the proper default value. danielebarchiesi@2: if (isset($item['options']['attributes'][$attribute])) { danielebarchiesi@2: // If the menu link already has this attribute, use it. danielebarchiesi@2: $info['form']['#default_value'] = $item['options']['attributes'][$attribute]; danielebarchiesi@2: // Convert the classes array to a string for the form. danielebarchiesi@2: if ($attribute == 'class' && is_array($info['form']['#default_value'])) { danielebarchiesi@2: $info['form']['#default_value'] = implode(' ', $info['form']['#default_value']); danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: elseif ($item['mlid']) { danielebarchiesi@2: // If this is an existing link, use the raw default (usually empty). danielebarchiesi@2: $info['form']['#default_value'] = $info['default']; danielebarchiesi@2: } danielebarchiesi@2: $form['options']['attributes'][$attribute] = $info['form'] + array( danielebarchiesi@2: '#access' => $info['enabled'], danielebarchiesi@2: ); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: // Add form values for the reset of $item['options'] and danielebarchiesi@2: // $item['options']['attributes'] so the values will carry over during save. danielebarchiesi@2: foreach ($item['options'] as $key => $value) { danielebarchiesi@2: if ($key !== 'attributes' && !isset($form['options'][$key])) { danielebarchiesi@2: $form['options'][$key] = array( danielebarchiesi@2: '#type' => 'value', danielebarchiesi@2: '#value' => $value, danielebarchiesi@2: ); danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: if (isset($item['options']['attributes'])) { danielebarchiesi@2: foreach ($item['options']['attributes'] as $key => $value) { danielebarchiesi@2: if (!isset($form['options']['attributes'][$key])) { danielebarchiesi@2: $form['options']['attributes'][$key] = array( danielebarchiesi@2: '#type' => 'value', danielebarchiesi@2: '#value' => $value, danielebarchiesi@2: ); danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: // Hide the 'description' field since we will be using our own 'title' field. danielebarchiesi@2: if (isset($form['description'])) { danielebarchiesi@2: $form['description']['#access'] = FALSE; danielebarchiesi@2: danielebarchiesi@2: // Because this form uses a special $form['description'] field which is danielebarchiesi@2: // really the 'title' attribute, we need to add special pre-submit handling danielebarchiesi@2: // to ensure our field gets saved as the title attribute. danielebarchiesi@2: array_unshift($complete_form['#submit'], '_menu_attributes_form_submit'); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: $form['options']['attributes']['#access'] = (bool) element_get_visible_children($form['options']['attributes']); danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Form submit handler for menu item links. danielebarchiesi@2: * danielebarchiesi@2: * Move the title attributes value into the 'description' value so that it danielebarchiesi@2: * will get properly saved. danielebarchiesi@2: */ danielebarchiesi@2: function _menu_attributes_form_submit($form, &$form_state) { danielebarchiesi@2: if (isset($form_state['values']['menu']['options']['attributes']['title'])) { danielebarchiesi@2: $form_state['values']['menu']['description'] = $form_state['values']['menu']['options']['attributes']['title']; danielebarchiesi@2: } danielebarchiesi@2: elseif (isset($form_state['values']['options']['attributes']['title'])) { danielebarchiesi@2: $form_state['values']['description'] = $form_state['values']['options']['attributes']['title']; danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Implements hook_form_FORM_ID_alter(). danielebarchiesi@2: * danielebarchiesi@2: * Alters the menu settings form with our menu attribute settings. danielebarchiesi@2: * danielebarchiesi@2: * @see menu_configure_form() danielebarchiesi@2: */ danielebarchiesi@2: function menu_attributes_form_menu_configure_alter(&$form, $form_state) { danielebarchiesi@2: if (!user_access('administer menu attributes')) { danielebarchiesi@2: return; danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: $form['attributes_title'] = array( danielebarchiesi@2: '#type' => 'item', danielebarchiesi@2: '#title' => t('Menu item attribute options'), danielebarchiesi@2: ); danielebarchiesi@2: $form['attributes_vertical_tabs'] = array( danielebarchiesi@2: '#type' => 'vertical_tabs', danielebarchiesi@2: '#attached' => array( danielebarchiesi@2: 'js' => array(drupal_get_path('module', 'menu_attributes') . '/menu_attributes.js'), danielebarchiesi@2: ), danielebarchiesi@2: ); danielebarchiesi@2: danielebarchiesi@2: $attributes = menu_attributes_get_menu_attribute_info(); danielebarchiesi@2: foreach ($attributes as $attribute => $info) { danielebarchiesi@2: $form['attributes'][$attribute] = array( danielebarchiesi@2: '#type' => 'fieldset', danielebarchiesi@2: '#title' => $info['label'], danielebarchiesi@2: '#group' => 'attributes_vertical_tabs', danielebarchiesi@2: '#description' => $info['form']['#description'], danielebarchiesi@2: ); danielebarchiesi@2: $form['attributes'][$attribute]["menu_attributes_{$attribute}_enable"] = array( danielebarchiesi@2: '#type' => 'checkbox', danielebarchiesi@2: '#title' => t('Enable the @attribute attribute.', array('@attribute' => drupal_strtolower($info['label']))), danielebarchiesi@2: '#default_value' => $info['enabled'], danielebarchiesi@2: ); danielebarchiesi@2: $form['attributes'][$attribute]["menu_attributes_{$attribute}_default"] = array( danielebarchiesi@2: '#title' => t('Default'), danielebarchiesi@2: '#description' => '', danielebarchiesi@2: '#states' => array( danielebarchiesi@2: 'invisible' => array( danielebarchiesi@2: 'input[name="menu_attributes_' . $attribute . '_enable"]' => array('checked' => FALSE), danielebarchiesi@2: ), danielebarchiesi@2: ), danielebarchiesi@2: ) + $info['form']; danielebarchiesi@2: } danielebarchiesi@2: }