1<?php 2 3namespace Drupal\datetime\Plugin\Field\FieldWidget; 4 5use Drupal\Core\Field\FieldItemListInterface; 6use Drupal\Core\Form\FormStateInterface; 7 8/** 9 * Plugin implementation of the 'datetime_datelist' widget. 10 * 11 * @FieldWidget( 12 * id = "datetime_datelist", 13 * label = @Translation("Select list"), 14 * field_types = { 15 * "datetime" 16 * } 17 * ) 18 */ 19class DateTimeDatelistWidget extends DateTimeWidgetBase { 20 21 /** 22 * {@inheritdoc} 23 */ 24 public static function defaultSettings() { 25 return [ 26 'increment' => '15', 27 'date_order' => 'YMD', 28 'time_type' => '24', 29 ] + parent::defaultSettings(); 30 } 31 32 /** 33 * {@inheritdoc} 34 */ 35 public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { 36 $element = parent::formElement($items, $delta, $element, $form, $form_state); 37 38 // Wrap all of the select elements with a fieldset. 39 $element['#theme_wrappers'][] = 'fieldset'; 40 41 $date_order = $this->getSetting('date_order'); 42 43 if ($this->getFieldSetting('datetime_type') == 'datetime') { 44 $time_type = $this->getSetting('time_type'); 45 $increment = $this->getSetting('increment'); 46 } 47 else { 48 $time_type = ''; 49 $increment = ''; 50 } 51 52 // Set up the date part order array. 53 switch ($date_order) { 54 case 'YMD': 55 $date_part_order = ['year', 'month', 'day']; 56 break; 57 58 case 'MDY': 59 $date_part_order = ['month', 'day', 'year']; 60 break; 61 62 case 'DMY': 63 $date_part_order = ['day', 'month', 'year']; 64 break; 65 } 66 switch ($time_type) { 67 case '24': 68 $date_part_order = array_merge($date_part_order, ['hour', 'minute']); 69 break; 70 71 case '12': 72 $date_part_order = array_merge($date_part_order, ['hour', 'minute', 'ampm']); 73 break; 74 75 case 'none': 76 break; 77 } 78 79 $element['value'] = [ 80 '#type' => 'datelist', 81 '#date_increment' => $increment, 82 '#date_part_order' => $date_part_order, 83 ] + $element['value']; 84 85 return $element; 86 } 87 88 /** 89 * {@inheritdoc} 90 */ 91 public function settingsForm(array $form, FormStateInterface $form_state) { 92 $element = parent::settingsForm($form, $form_state); 93 94 $element['date_order'] = [ 95 '#type' => 'select', 96 '#title' => t('Date part order'), 97 '#default_value' => $this->getSetting('date_order'), 98 '#options' => ['MDY' => t('Month/Day/Year'), 'DMY' => t('Day/Month/Year'), 'YMD' => t('Year/Month/Day')], 99 ]; 100 101 if ($this->getFieldSetting('datetime_type') == 'datetime') { 102 $element['time_type'] = [ 103 '#type' => 'select', 104 '#title' => t('Time type'), 105 '#default_value' => $this->getSetting('time_type'), 106 '#options' => ['24' => t('24 hour time'), '12' => t('12 hour time')], 107 ]; 108 109 $element['increment'] = [ 110 '#type' => 'select', 111 '#title' => t('Time increments'), 112 '#default_value' => $this->getSetting('increment'), 113 '#options' => [ 114 1 => t('1 minute'), 115 5 => t('5 minute'), 116 10 => t('10 minute'), 117 15 => t('15 minute'), 118 30 => t('30 minute'), 119 ], 120 ]; 121 } 122 else { 123 $element['time_type'] = [ 124 '#type' => 'hidden', 125 '#value' => 'none', 126 ]; 127 128 $element['increment'] = [ 129 '#type' => 'hidden', 130 '#value' => $this->getSetting('increment'), 131 ]; 132 } 133 134 return $element; 135 } 136 137 /** 138 * {@inheritdoc} 139 */ 140 public function settingsSummary() { 141 $summary = []; 142 143 $summary[] = t('Date part order: @order', ['@order' => $this->getSetting('date_order')]); 144 if ($this->getFieldSetting('datetime_type') == 'datetime') { 145 $summary[] = t('Time type: @time_type', ['@time_type' => $this->getSetting('time_type')]); 146 $summary[] = t('Time increments: @increment', ['@increment' => $this->getSetting('increment')]); 147 } 148 149 return $summary; 150 } 151 152} 153