You are here

function menu_link_weight_menu_link_content_element_process in Menu Link Weight 8

Same name and namespace in other branches
  1. 8.2 menu_link_weight.menu_ui.inc \menu_link_weight_menu_link_content_element_process()

Process callback for the menu link weight element.

1 string reference to 'menu_link_weight_menu_link_content_element_process'
_menu_link_weight_menu_link_form_alter in ./menu_link_weight.menu_ui.inc
Alter and attach the menu link weight widgets for menu link edit form.

File

./menu_link_weight.menu_ui.inc, line 150

Code

function menu_link_weight_menu_link_content_element_process($element, FormStateInterface $form_state, &$complete_form) {

  // Find out which parent to select after loading (or AJAX reloading) the form.
  $parent_element = $complete_form['menu_parent'];
  $parent_value = _menu_link_weight_get_parent_value_from_element($parent_element, $form_state);
  if (strstr($parent_value, ':')) {

    // The parent value is of the form "$menu_name:" or
    // "$menu_name:$link_plugin_id".

    /** @see \Drupal\Core\Menu\MenuParentFormSelector::getParentSelectOptions() */
    list($menu_name, $parent_id) = explode(':', $parent_value, 2);
  }
  else {
    return $element;
  }

  // Get the menu title for the parent based on the current menu selection.
  $url = Url::fromRoute('entity.menu.edit_form', array(
    'menu' => $menu_name,
  ));
  if ($parent_id === '') {
    $label = Menu::load($menu_name)
      ->label();
  }
  else {

    /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */
    $menu_link_manager = \Drupal::service('plugin.manager.menu.link');

    /** @var \Drupal\Core\Menu\MenuLinkInterface $parent_link */
    $parent_link = $menu_link_manager
      ->createInstance($parent_id);
    $label = $parent_link
      ->getTitle();

    /** @see menu_link_weight_form_menu_form_alter() */
    $html_id = 'menu-link-weight-link-id-' . Html::getId($parent_id);
    $url
      ->setOption('fragment', $html_id);
  }
  $generated_url = $url
    ->toString(TRUE);
  $generated_url
    ->applyTo($element);
  $element['#description'] = t('Change the weight of the links within the <a href=":url">@menu</a> menu by dragging the items up/down.', array(
    ':url' => $generated_url
      ->getGeneratedUrl(),
    '@menu' => $label,
  ));

  // Get the ID for the current menu link.
  $current_mlid = $form_state
    ->get([
    'menu_link_weight',
    'current_mlid',
  ]);

  // Get the title for the current menu link.
  $new_item_title = $form_state
    ->get([
    'menu_link_weight',
    'new_item_title',
  ]);

  // Get the options array we will use to build the form elements for every
  // menu link.
  $options = _menu_link_weight_get_options($menu_name, $parent_id, $current_mlid, $new_item_title);

  // Allow other modules to reorder the options, if applicable.
  if ($relative_position = $form_state
    ->get([
    'menu_link_weight_relative_position',
    $parent_value,
  ])) {
    $options = _menu_link_weight_reorder_options($options, $relative_position);
  }

  // Build the form elements using the options array.
  foreach ($options as $link_id => $info) {
    $element['table'][$link_id] = array(
      '#attributes' => [
        'class' => [
          'draggable',
        ],
      ],
      '#weight' => $info['weight'],
      'name' => $info['title'],
      'weight' => array(
        '#type' => 'weight',
        '#title' => t('Weight'),
        '#default_value' => $info['weight'],
        '#delta' => MENU_LINK_WEIGHT_MAX_DELTA,
        '#title_display' => 'invisible',
        '#attributes' => [
          'class' => [
            'menu-link-weight-item-weight',
          ],
        ],
      ),
    );
    if ($link_id != 'link_current') {

      // Save the current weight in the database of the rendered menu links
      // into the form, so that we can give an error if the weights have changed
      // by the time the form is submitted.
      $complete_form['db_weights'][$link_id] = array(
        '#type' => 'hidden',
        '#value' => $info['db_weight'],
      );
    }
  }
  return $element;
}