Weight.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. namespace Drupal\Core\Render\Element;
  3. use Drupal\Core\Form\FormStateInterface;
  4. /**
  5. * Provides a form element for input of a weight.
  6. *
  7. * Weights are integers used to indicate ordering, with larger numbers later in
  8. * the order.
  9. *
  10. * Properties:
  11. * - #delta: The range of possible weight values used. A delta of 10 would
  12. * indicate possible weight values between -10 and 10.
  13. *
  14. * Usage example:
  15. * @code
  16. * $form['weight'] = array(
  17. * '#type' => 'weight',
  18. * '#title' => $this->t('Weight'),
  19. * '#default_value' => $edit['weight'],
  20. * '#delta' => 10,
  21. * );
  22. * @endcode
  23. *
  24. * @FormElement("weight")
  25. */
  26. class Weight extends FormElement {
  27. /**
  28. * {@inheritdoc}
  29. */
  30. public function getInfo() {
  31. $class = get_class($this);
  32. return [
  33. '#input' => TRUE,
  34. '#delta' => 10,
  35. '#default_value' => 0,
  36. '#process' => [
  37. [$class, 'processWeight'],
  38. [$class, 'processAjaxForm'],
  39. ],
  40. ];
  41. }
  42. /**
  43. * Expands a weight element into a select/number element.
  44. */
  45. public static function processWeight(&$element, FormStateInterface $form_state, &$complete_form) {
  46. // If the number of options is small enough, use a select field. Otherwise,
  47. // use a number field.
  48. $type = $element['#delta'] <= \Drupal::config('system.site')->get('weight_select_max') ? 'select' : 'number';
  49. $element = array_merge($element, \Drupal::service('element_info')->getInfo($type));
  50. $element['#is_weight'] = TRUE;
  51. if ($type === 'select') {
  52. $weights = [];
  53. for ($n = (-1 * $element['#delta']); $n <= $element['#delta']; $n++) {
  54. $weights[$n] = $n;
  55. }
  56. $default_value = (int) $element['#default_value'];
  57. if (!isset($weights[$default_value])) {
  58. $weights[$default_value] = $default_value;
  59. ksort($weights);
  60. }
  61. $element['#options'] = $weights;
  62. }
  63. else {
  64. // Use a field big enough to fit most weights.
  65. $element['#size'] = 10;
  66. }
  67. return $element;
  68. }
  69. }