You are here

function menu_link_weight_menu_link_content_form_validate 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_form_validate()

Validation hook for the menu_link weight element.

1 string reference to 'menu_link_weight_menu_link_content_form_validate'
_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 230

Code

function menu_link_weight_menu_link_content_form_validate($form, FormStateInterface $form_state) {

  /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */
  $menu_link_manager = \Drupal::service('plugin.manager.menu.link');
  $parent_element = $form['menu_parent'];
  $parent_value = _menu_link_weight_get_parent_value_from_element($parent_element, $form_state);
  if ($form_state
    ->hasValue([
    'menu_link_weight',
  ])) {
    list($menu_name, $parent_id) = explode(':', $parent_value, 2);

    // Loop through submitted weights and confirm that the parent link/menu
    // are still the same.
    $weights = $form_state
      ->getValue([
      'menu_link_weight',
    ]);
    unset($weights['link_current']);
    foreach ($weights as $link_id => $weight) {

      /** @var \Drupal\Core\Menu\MenuLinkInterface $link */
      $link = $menu_link_manager
        ->createInstance($link_id);
      if ($link
        ->getParent() != $parent_id) {
        $form_state
          ->setErrorByName('menu][menu_link_weight', t('The parent for one of the menu links have been changed by another user, please try again.'));
      }
      if ($link
        ->getMenuName() != $menu_name) {
        $form_state
          ->setErrorByName('menu][menu_link_weight', t('The menu for one of the menu links have been changed by another user, please try again.'));
      }
    }
  }
  if ($form_state
    ->hasValue([
    'db_weights',
  ])) {

    // Check that children and weights are still the same as when the form was
    // loaded. Get the old values from the "hidden" form elements.
    foreach ($form_state
      ->getValue([
      'db_weights',
    ]) as $link_id => $db_weight) {
      $link = $menu_link_manager
        ->createInstance($link_id);
      if ($link
        ->getWeight() != $db_weight) {
        $form_state
          ->setErrorByName('menu][menu_link_weight', t('The menu link weights have been changed by another user, please try again.'));
      }
    }
  }
  if (!$form_state
    ->getErrors() && $form_state
    ->hasValue([
    'menu',
    'menu_link_weight',
    'link_current',
    'weight',
  ])) {

    // Override the weight of the current link.
    // MenuLinkContent form has different form structure.
    if ($form_state
      ->hasValue([
      'weight',
      0,
      'value',
    ])) {
      $form_state
        ->setValue([
        'weight',
        0,
        'value',
      ], $form_state
        ->getValue([
        'menu',
        'menu_link_weight',
        'link_current',
        'weight',
      ]));
    }
    else {
      $form_state
        ->setValue([
        'weight',
      ], $form_state
        ->getValue([
        'menu',
        'menu_link_weight',
        'link_current',
        'weight',
      ]));
    }
  }
}