1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- <?php
- namespace Drupal\Core\Render\Element;
- use Drupal\Core\Form\FormStateInterface;
- /**
- * Provides a form element for input of a weight.
- *
- * Weights are integers used to indicate ordering, with larger numbers later in
- * the order.
- *
- * Properties:
- * - #delta: The range of possible weight values used. A delta of 10 would
- * indicate possible weight values between -10 and 10.
- *
- * Usage example:
- * @code
- * $form['weight'] = array(
- * '#type' => 'weight',
- * '#title' => $this->t('Weight'),
- * '#default_value' => $edit['weight'],
- * '#delta' => 10,
- * );
- * @endcode
- *
- * @FormElement("weight")
- */
- class Weight extends FormElement {
- /**
- * {@inheritdoc}
- */
- public function getInfo() {
- $class = get_class($this);
- return [
- '#input' => TRUE,
- '#delta' => 10,
- '#default_value' => 0,
- '#process' => [
- [$class, 'processWeight'],
- [$class, 'processAjaxForm'],
- ],
- ];
- }
- /**
- * Expands a weight element into a select/number element.
- */
- public static function processWeight(&$element, FormStateInterface $form_state, &$complete_form) {
- // If the number of options is small enough, use a select field. Otherwise,
- // use a number field.
- $type = $element['#delta'] <= \Drupal::config('system.site')->get('weight_select_max') ? 'select' : 'number';
- $element = array_merge($element, \Drupal::service('element_info')->getInfo($type));
- $element['#is_weight'] = TRUE;
- if ($type === 'select') {
- $weights = [];
- for ($n = (-1 * $element['#delta']); $n <= $element['#delta']; $n++) {
- $weights[$n] = $n;
- }
- $default_value = (int) $element['#default_value'];
- if (!isset($weights[$default_value])) {
- $weights[$default_value] = $default_value;
- ksort($weights);
- }
- $element['#options'] = $weights;
- }
- else {
- // Use a field big enough to fit most weights.
- $element['#size'] = 10;
- }
- return $element;
- }
- }
|