49c4dce72a9b13aebff78d7aaf29a566ac9dcd6b
[yaffs-website] / web / core / modules / datetime_range / src / Plugin / Field / FieldType / DateRangeItem.php
1 <?php
2
3 namespace Drupal\datetime_range\Plugin\Field\FieldType;
4
5 use Drupal\Core\Field\FieldDefinitionInterface;
6 use Drupal\Core\Field\FieldStorageDefinitionInterface;
7 use Drupal\Core\Form\FormStateInterface;
8 use Drupal\Core\TypedData\DataDefinition;
9 use Drupal\datetime\DateTimeComputed;
10 use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
11
12 /**
13  * Plugin implementation of the 'daterange' field type.
14  *
15  * @FieldType(
16  *   id = "daterange",
17  *   label = @Translation("Date range"),
18  *   description = @Translation("Create and store date ranges."),
19  *   default_widget = "daterange_default",
20  *   default_formatter = "daterange_default",
21  *   list_class = "\Drupal\datetime_range\Plugin\Field\FieldType\DateRangeFieldItemList"
22  * )
23  */
24 class DateRangeItem extends DateTimeItem {
25
26   /**
27    * Value for the 'datetime_type' setting: store a date and time.
28    */
29   const DATETIME_TYPE_ALLDAY = 'allday';
30
31   /**
32    * {@inheritdoc}
33    */
34   public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
35     $properties['value'] = DataDefinition::create('datetime_iso8601')
36       ->setLabel(t('Start date value'))
37       ->setRequired(TRUE);
38
39     $properties['start_date'] = DataDefinition::create('any')
40       ->setLabel(t('Computed start date'))
41       ->setDescription(t('The computed start DateTime object.'))
42       ->setComputed(TRUE)
43       ->setClass(DateTimeComputed::class)
44       ->setSetting('date source', 'value');
45
46     $properties['end_value'] = DataDefinition::create('datetime_iso8601')
47       ->setLabel(t('End date value'))
48       ->setRequired(TRUE);
49
50     $properties['end_date'] = DataDefinition::create('any')
51       ->setLabel(t('Computed end date'))
52       ->setDescription(t('The computed end DateTime object.'))
53       ->setComputed(TRUE)
54       ->setClass(DateTimeComputed::class)
55       ->setSetting('date source', 'end_value');
56
57     return $properties;
58   }
59
60   /**
61    * {@inheritdoc}
62    */
63   public static function schema(FieldStorageDefinitionInterface $field_definition) {
64     $schema = parent::schema($field_definition);
65
66     $schema['columns']['value']['description'] = 'The start date value.';
67
68     $schema['columns']['end_value'] = [
69       'description' => 'The end date value.',
70     ] + $schema['columns']['value'];
71
72     $schema['indexes']['end_value'] = ['end_value'];
73
74     return $schema;
75   }
76
77   /**
78    * {@inheritdoc}
79    */
80   public function storageSettingsForm(array &$form, FormStateInterface $form_state, $has_data) {
81     $element = parent::storageSettingsForm($form, $form_state, $has_data);
82
83     $element['datetime_type']['#options'][static::DATETIME_TYPE_ALLDAY] = $this->t('All Day');
84
85     return $element;
86   }
87
88   /**
89    * {@inheritdoc}
90    */
91   public static function generateSampleValue(FieldDefinitionInterface $field_definition) {
92     $type = $field_definition->getSetting('datetime_type');
93
94     // Just pick a date in the past year. No guidance is provided by this Field
95     // type.
96     $start = REQUEST_TIME - mt_rand(0, 86400 * 365) - 86400;
97     $end = $start + 86400;
98     if ($type == static::DATETIME_TYPE_DATETIME) {
99       $values['value'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $start);
100       $values['end_value'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $end);
101     }
102     else {
103       $values['value'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $start);
104       $values['end_value'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $end);
105     }
106     return $values;
107   }
108
109   /**
110    * {@inheritdoc}
111    */
112   public function isEmpty() {
113     $start_value = $this->get('value')->getValue();
114     $end_value = $this->get('end_value')->getValue();
115     return ($start_value === NULL || $start_value === '') && ($end_value === NULL || $end_value === '');
116   }
117
118   /**
119    * {@inheritdoc}
120    */
121   public function onChange($property_name, $notify = TRUE) {
122     // Enforce that the computed date is recalculated.
123     if ($property_name == 'value') {
124       $this->start_date = NULL;
125     }
126     elseif ($property_name == 'end_value') {
127       $this->end_date = NULL;
128     }
129     parent::onChange($property_name, $notify);
130   }
131
132 }