You are here

public static function Select::processSelect in Drupal 10

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Render/Element/Select.php \Drupal\Core\Render\Element\Select::processSelect()
  2. 9 core/lib/Drupal/Core/Render/Element/Select.php \Drupal\Core\Render\Element\Select::processSelect()

Processes a select list form element.

This process callback is mandatory for select fields, since all user agents automatically preselect the first available option of single (non-multiple) select lists.

Parameters

array $element: The form element to process.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

array $complete_form: The complete form structure.

Return value

array The processed element.

See also

_form_validate()

File

core/lib/Drupal/Core/Render/Element/Select.php, line 126

Class

Select
Provides a form element for a drop-down menu or scrolling selection box.

Namespace

Drupal\Core\Render\Element

Code

public static function processSelect(&$element, FormStateInterface $form_state, &$complete_form) {

  // #multiple select fields need a special #name.
  if ($element['#multiple']) {
    $element['#attributes']['multiple'] = 'multiple';
    $element['#attributes']['name'] = $element['#name'] . '[]';
  }
  else {

    // If the element is set to #required through #states, override the
    // element's #required setting.
    $required = isset($element['#states']['required']) ? TRUE : $element['#required'];

    // If the element is required and there is no #default_value, then add an
    // empty option that will fail validation, so that the user is required to
    // make a choice. Also, if there's a value for #empty_value or
    // #empty_option, then add an option that represents emptiness.
    if ($required && !isset($element['#default_value']) || isset($element['#empty_value']) || isset($element['#empty_option'])) {
      $element += [
        '#empty_value' => '',
        '#empty_option' => $required ? t('- Select -') : t('- None -'),
      ];

      // The empty option is prepended to #options and purposively not merged
      // to prevent another option in #options mistakenly using the same value
      // as #empty_value.
      $empty_option = [
        $element['#empty_value'] => $element['#empty_option'],
      ];
      $element['#options'] = $empty_option + $element['#options'];
    }
  }

  // Provide the correct default value for #sort_start.
  $element['#sort_start'] = $element['#sort_start'] ?? (isset($element['#empty_value']) ? 1 : 0);
  return $element;
}