View source
<?php
namespace Drupal\time_picker\Plugin\Field\FieldWidget;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Datetime\DrupalDateTime;
class TimeRangePickerWidget extends WidgetBase {
public static function defaultSettings() {
return [] + parent::defaultSettings();
}
protected function getInitialValues() {
$initial_values = [
'start' => '',
'end' => '',
];
return $initial_values;
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$elements = [];
return $elements;
}
public function settingsSummary() {
$summary = [];
return $summary;
}
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$start = isset($items[$delta]->start) ? $items[$delta]->start : '';
$end = isset($items[$delta]->end) ? $items[$delta]->end : '';
if ($this->fieldDefinition
->getFieldStorageDefinition()
->getCardinality() == 1) {
$element += [
'#type' => 'fieldset',
'#attributes' => [
'class' => [
'time_range_fieldset',
],
],
];
}
$element['start'] = [
'#type' => 'textfield',
'#title' => $this
->t('Start time'),
'#default_value' => $start,
'#attributes' => [
'class' => [
'time_range_picker',
],
],
'#size' => 10,
'#maxlength' => 10,
'#element_validate' => [
[
$this,
'validate',
],
],
];
$element['end'] = [
'#type' => 'textfield',
'#title' => $this
->t('End time'),
'#default_value' => $end,
'#attributes' => [
'class' => [
'time_range_picker',
],
],
'#size' => 10,
'#maxlength' => 10,
'#element_validate' => [
[
$this,
'validate',
],
],
];
$element['#element_validate'][] = [
$this,
'validateStartEnd',
];
$element['#attached']['library'][] = 'time_picker/time_picker';
$element['#attached']['drupalSettings']['time_range_picker'] = [
'hour_format' => $this
->getFieldSetting('hour_format'),
'theme_color' => $this
->getFieldSetting('time_picker_theme'),
];
return $element;
}
public function validate($element, FormStateInterface $form_state) {
$value = $element['#value'];
if (strlen($value) === 0) {
$form_state
->setValueForElement($element, '');
return;
}
$hour_format = $this
->getFieldSetting('hour_format');
if ($hour_format === '12h') {
if (!preg_match('/^(0?[1-9]|1[012])(:[0-5]\\d) [APap][mM]$/', $value)) {
$form_state
->setError($element, $this
->t('Please enter valid time formate.'));
}
}
elseif ($hour_format === '24h') {
if (!preg_match('/^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/', $value)) {
$form_state
->setError($element, $this
->t('Please enter valid time formate.'));
}
}
}
public function validateStartEnd(array &$element, FormStateInterface $form_state, array &$complete_form) {
$start_time = $element['start']['#value'];
$end_time = $element['end']['#value'];
if (!empty($start_time) && !empty($end_time)) {
$tz = date_default_timezone_get();
$start = new DrupalDateTime($start_time, $tz);
$end = new DrupalDateTime($end_time, $tz);
if ($start > $end) {
$form_state
->setError($element, $this
->t('Please enter valid time formate : End time greater than Start time.'));
}
}
}
}