You are here

public static function Duration::processElement in Duration Field 8

File

src/Element/Duration.php, line 57

Class

Duration
Provides a duration form element.

Namespace

Drupal\duration_field\Element

Code

public static function processElement(&$element, FormStateInterface $form_state, &$complete_form) {
  $granularity = explode(':', $element['#granularity']);
  $required_elements = explode(':', $element['#required_elements']);
  $value = FALSE;
  if (isset($element['#value']) && $element['#value']) {
    $value = new \DateInterval($element['#value']);
  }
  $time_mappings = [
    'y' => [
      'label' => t('Years'),
      'key' => 'year',
    ],
    'm' => [
      'label' => t('Months'),
      'key' => 'month',
      'format' => 'm',
    ],
    'd' => [
      'label' => t('Days'),
      'key' => 'day',
    ],
    'h' => [
      'label' => t('Hours'),
      'key' => 'hour',
    ],
    'i' => [
      'label' => t('Minutes'),
      'key' => 'minute',
    ],
    's' => [
      'label' => t('Seconds'),
      'key' => 'second',
    ],
  ];

  // Create a wrapper for the elements. This is done in this manner
  // rather than nesting the elements in a wrapper with #prefix and #suffix
  // so as to not end up with [wrapper] as part of the name attribute
  // of the elements.
  $div = '<div';
  $classes = [
    'duration-inner-wrapper',
  ];
  if (!empty($element['#states'])) {
    drupal_process_states($element);
  }
  foreach ($element['#attributes'] as $attribute => $attribute_value) {
    if (is_string($attribute_value)) {
      $div .= ' ' . $attribute . "='" . $attribute_value . "'";
    }
    elseif ($attribute == 'class') {
      $classes = array_merge($classes, $attribute_value);
    }
  }
  $div .= ' class="' . implode(' ', $classes) . '"';
  $div .= '>';
  $element['wrapper_open'] = [
    '#markup' => $div,
    '#weight' => -1,
  ];
  foreach ($time_mappings as $key => $info) {
    if (preg_grep('/' . $key . '/i', $granularity)) {
      $element[$info['key']] = [
        '#id' => $element['#id'] . '-' . $info['key'],
        '#type' => 'number',
        '#title' => $info['label'],
        '#value' => $value ? $value
          ->format('%' . $key) : 0,
        '#required' => preg_grep('/' . $key . '/i', $required_elements) ? TRUE : FALSE,
        '#weight' => 0,
        '#min' => 0,
      ];
      if (!empty($element['#ajax'])) {
        $element[$info['key']]['#ajax'] = $element['#ajax'];
      }
    }
  }
  $element['wrapper_close'] = [
    '#markup' => '</div>',
    '#weight' => 1,
  ];

  // Attach the CSS for the display of the output.
  $element['#attached']['library'][] = 'duration_field/element';
  return $element;
}