3 namespace Drupal\Core\Render\Element;
5 use Drupal\Core\Form\FormStateInterface;
8 * Provides a form element for input of a weight.
10 * Weights are integers used to indicate ordering, with larger numbers later in
14 * - #delta: The range of possible weight values used. A delta of 10 would
15 * indicate possible weight values between -10 and 10.
19 * $form['weight'] = array(
20 * '#type' => 'weight',
21 * '#title' => $this->t('Weight'),
22 * '#default_value' => $edit['weight'],
27 * @FormElement("weight")
29 class Weight extends FormElement {
34 public function getInfo() {
35 $class = get_class($this);
39 '#default_value' => 0,
41 [$class, 'processWeight'],
42 [$class, 'processAjaxForm'],
48 * Expands a weight element into a select element.
50 public static function processWeight(&$element, FormStateInterface $form_state, &$complete_form) {
51 $element['#is_weight'] = TRUE;
53 $element_info_manager = \Drupal::service('element_info');
54 // If the number of options is small enough, use a select field.
55 $max_elements = \Drupal::config('system.site')->get('weight_select_max');
56 if ($element['#delta'] <= $max_elements) {
57 $element['#type'] = 'select';
59 for ($n = (-1 * $element['#delta']); $n <= $element['#delta']; $n++) {
62 $default_value = (int) $element['#default_value'];
63 if (!isset($weights[$default_value])) {
64 $weights[$default_value] = $default_value;
67 $element['#options'] = $weights;
68 $element += $element_info_manager->getInfo('select');
70 // Otherwise, use a text field.
72 $element['#type'] = 'number';
73 // Use a field big enough to fit most weights.
74 $element['#size'] = 10;
75 $element += $element_info_manager->getInfo('number');