improvements-2.x-dev/modules/improvements_form/src/Element/RangeSlider.php
modules/improvements_form/src/Element/RangeSlider.php
<?php
namespace Drupal\improvements_form\Element;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element\FormElement;
/**
* @FormElement("range_slider")
*/
class RangeSlider extends FormElement {
/**
* {@inheritDoc}
*/
public function getInfo(): array {
$class = get_class($this);
return [
'#input' => TRUE,
'#process' => [
[$class, 'processElement'],
],
'#theme_wrappers' => ['form_element'],
'#min' => NULL,
'#max' => NULL,
'#step' => NULL,
'#validate_numbers' => TRUE,
];
}
/**
* Element process callback.
*/
public static function processElement(array &$element, FormStateInterface $form_state, array &$complete_form): array {
$element['#tree'] = TRUE;
$step = $element['#step'] ?? NULL;
if ($step > 1) {
if (isset($element['#min'])) {
$element['#min'] = floor($element['#min'] / $step) * $step;
}
if (isset($element['#max'])) {
$element['#max'] = ceil($element['#max'] / $step) * $step;
}
}
$element['min'] = [
'#type' => 'number',
'#title' => t('From', [], ['context' => 'number']),
'#default_value' => $element['#default_value']['min'] ?? '',
'#min' => $element['#min'] ?? NULL,
'#max' => $element['#max'] ?? NULL,
'#step' => $step,
'#wrapper_attributes' => [
'class' => ['form-range-slider__min-item'],
],
'#attributes' => [
'class' => ['form-range-slider__min'],
],
];
$element['max'] = [
'#type' => 'number',
'#title' => t('To', [], ['context' => 'number']),
'#default_value' => $element['#default_value']['max'] ?? '',
'#min' => $element['#min'] ?? NULL,
'#max' => $element['#max'] ?? NULL,
'#step' => $step,
'#wrapper_attributes' => [
'class' => ['form-range-slider__max-item'],
],
'#attributes' => [
'class' => ['form-range-slider__max'],
],
];
if (!$element['#validate_numbers']) {
$element['min']['#element_validate'] = [];
$element['max']['#element_validate'] = [];
}
$element['slider'] = [
'#markup' => '<div class="form-range-slider__slider"></div>',
];
$element['#wrapper_attributes']['class'] = 'form-range-slider';
$element['#attached']['library'][] = 'improvements_form/range-slider';
return $element;
}
}
