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\ElementCode
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;
}