Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 37 |
DateTimeWidgetBase | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
72 | |
0.00% |
0 / 37 |
formElement | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 19 |
|||
massageFormValues | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 18 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\datetime\Plugin\Field\FieldWidget\DateTimeWidgetBase. | |
*/ | |
namespace Drupal\datetime\Plugin\Field\FieldWidget; | |
use Drupal\Core\Datetime\DrupalDateTime; | |
use Drupal\Core\Field\FieldItemListInterface; | |
use Drupal\Core\Field\WidgetBase; | |
use Drupal\Core\Form\FormStateInterface; | |
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem; | |
/** | |
* Base class for the 'datetime_*' widgets. | |
*/ | |
class DateTimeWidgetBase extends WidgetBase { | |
/** | |
* {@inheritdoc} | |
*/ | |
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { | |
// We are nesting some sub-elements inside the parent, so we need a wrapper. | |
// We also need to add another #title attribute at the top level for ease in | |
// identifying this item in error messages. We do not want to display this | |
// title because the actual title display is handled at a higher level by | |
// the Field module. | |
$element['#theme_wrappers'][] = 'datetime_wrapper'; | |
$element['#attributes']['class'][] = 'container-inline'; | |
$element['value'] = array( | |
'#type' => 'datetime', | |
'#default_value' => NULL, | |
'#date_increment' => 1, | |
'#date_timezone' => drupal_get_user_timezone(), | |
'#required' => $element['#required'], | |
); | |
if ($items[$delta]->date) { | |
$date = $items[$delta]->date; | |
// The date was created and verified during field_load(), so it is safe to | |
// use without further inspection. | |
if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) { | |
// A date without time will pick up the current time, use the default | |
// time. | |
datetime_date_default_time($date); | |
} | |
$date->setTimezone(new \DateTimeZone($element['value']['#date_timezone'])); | |
$element['value']['#default_value'] = $date; | |
} | |
return $element; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function massageFormValues(array $values, array $form, FormStateInterface $form_state) { | |
// The widget form element type has transformed the value to a | |
// DrupalDateTime object at this point. We need to convert it back to the | |
// storage timezone and format. | |
foreach ($values as &$item) { | |
if (!empty($item['value']) && $item['value'] instanceof DrupalDateTime) { | |
$date = $item['value']; | |
switch ($this->getFieldSetting('datetime_type')) { | |
case DateTimeItem::DATETIME_TYPE_DATE: | |
// If this is a date-only field, set it to the default time so the | |
// timezone conversion can be reversed. | |
datetime_date_default_time($date); | |
$format = DATETIME_DATE_STORAGE_FORMAT; | |
break; | |
default: | |
$format = DATETIME_DATETIME_STORAGE_FORMAT; | |
break; | |
} | |
// Adjust the date for storage. | |
$date->setTimezone(new \DateTimezone(DATETIME_STORAGE_TIMEZONE)); | |
$item['value'] = $date->format($format); | |
} | |
} | |
return $values; | |
} | |
} |