Pull merge.
[yaffs-website] / web / core / modules / datetime_range / datetime_range.module
1 <?php
2
3 /**
4  * @file
5  * Field hooks to implement a datetime field that stores a start and end date.
6  */
7
8 use Drupal\Core\Routing\RouteMatchInterface;
9 use Drupal\views\Views;
10 use Drupal\views\ViewEntityInterface;
11
12 /**
13  * Implements hook_help().
14  */
15 function datetime_range_help($route_name, RouteMatchInterface $route_match) {
16   switch ($route_name) {
17     case 'help.page.datetime_range':
18       $output = '';
19       $output .= '<h3>' . t('About') . '</h3>';
20       $output .= '<p>' . t('The Datetime Range module provides a Date field that stores start dates and times, as well as end dates and times. See the <a href=":field">Field module help</a> and the <a href=":field_ui">Field UI module help</a> pages for general information on fields and how to create and manage them. For more information, see the <a href=":datetime_do">online documentation for the Datetime Range module</a>.', [':field' => \Drupal::url('help.page', ['name' => 'field']), ':field_ui' => (\Drupal::moduleHandler()->moduleExists('field_ui')) ? \Drupal::url('help.page', ['name' => 'field_ui']) : '#', ':datetime_do' => 'https://www.drupal.org/documentation/modules/datetime_range']) . '</p>';
21       $output .= '<h3>' . t('Uses') . '</h3>';
22       $output .= '<dl>';
23       $output .= '<dt>' . t('Managing and displaying date fields') . '</dt>';
24       $output .= '<dd>' . t('The <em>settings</em> and the <em>display</em> of the Date field can be configured separately. See the <a href=":field_ui">Field UI help</a> for more information on how to manage fields and their display.', [':field_ui' => (\Drupal::moduleHandler()->moduleExists('field_ui')) ? \Drupal::url('help.page', ['name' => 'field_ui']) : '#']) . '</dd>';
25       $output .= '<dt>' . t('Displaying dates') . '</dt>';
26       $output .= '<dd>' . t('Dates can be displayed using the <em>Plain</em> or the <em>Default</em> formatter. The <em>Plain</em> formatter displays the date in the <a href="http://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a> format. If you choose the <em>Default</em> formatter, you can choose a format from a predefined list that can be managed on the <a href=":date_format_list">Date and time formats</a> page.', [':date_format_list' => \Drupal::url('entity.date_format.collection')]) . '</dd>';
27       $output .= '</dl>';
28       return $output;
29   }
30 }
31
32 /**
33  * Implements hook_view_presave().
34  *
35  * When a view is saved using the old string or standard plugin format for
36  * Datetime Range filters or sorts, they will automatically be updated to
37  * Datetime filters or sorts. Old plugins usage must to be considered
38  * deprecated and must be converted before 9.0.0, when this updating layer will
39  * be removed.
40  *
41  * @deprecated in Drupal 8.5.x and will be removed before 9.0.0.
42  *
43  * @see https://www.drupal.org/node/2857691
44  */
45 function datetime_range_view_presave(ViewEntityInterface $view) {
46   $config_factory = \Drupal::configFactory();
47   $displays = $view->get('display');
48   $changed = FALSE;
49
50   foreach ($displays as $display_name => &$display) {
51
52     // Update datetime_range filters.
53     if (isset($display['display_options']['filters'])) {
54       foreach ($display['display_options']['filters'] as $field_name => &$filter) {
55         if ($filter['plugin_id'] === 'string') {
56           $table_data = Views::viewsData()->get($filter['table']);
57           if (!$table_data) {
58             continue;
59           }
60
61           // Get field config.
62           $filter_views_data = $table_data[$filter['field']]['filter'];
63           if (!isset($filter_views_data['entity_type']) || !isset($filter_views_data['field_name'])) {
64             continue;
65           }
66           $field_storage_name = 'field.storage.' . $filter_views_data['entity_type'] . '.' . $filter_views_data['field_name'];
67           $field_configuration = $config_factory->get($field_storage_name);
68
69           if ($field_configuration->get('type') === 'daterange') {
70
71             // Set entity_type if missing.
72             if (!isset($filter['entity_type'])) {
73               $filter['entity_type'] = $filter_views_data['entity_type'];
74             }
75
76             // Set datetime plugin_id.
77             $filter['plugin_id'] = 'datetime';
78
79             // Create datetime value array.
80             $datetime_value = [
81               'min' => '',
82               'max' => '',
83               'value' => $filter['value'],
84               'type' => 'date',
85             ];
86
87             // Map string operator/value to numeric equivalent.
88             switch ($filter['operator']) {
89               case '=':
90               case 'empty':
91               case 'not empty':
92                 $operator = $filter['operator'];
93                 break;
94
95               case '!=':
96               case 'not':
97                 $operator = '!=';
98                 break;
99
100               case 'starts':
101                 $operator = 'regular_expression';
102                 $datetime_value['value'] = '^' . preg_quote($datetime_value['value']);
103                 break;
104
105               case 'ends':
106                 $operator = 'regular_expression';
107                 $datetime_value['value'] = preg_quote($datetime_value['value']) . '$';
108                 break;
109
110               default:
111                 $operator = 'regular_expression';
112                 // Add .* to prevent blank regexes.
113                 if (empty($datetime_value['value'])) {
114                   $datetime_value['value'] = '.*';
115                 }
116                 else {
117                   $datetime_value['value'] = preg_quote($datetime_value['value']);
118                 }
119             }
120
121             // Set value and operator.
122             $filter['value'] = $datetime_value;
123             $filter['operator'] = $operator;
124             $changed = TRUE;
125             @trigger_error('Use of string filters for datetime_range fields is deprecated. Use the datetime filters instead. See https://www.drupal.org/node/2857691', E_USER_DEPRECATED);
126           }
127         }
128       }
129     }
130
131     // Update datetime_range sort handlers.
132     if (isset($display['display_options']['sorts'])) {
133       foreach ($display['display_options']['sorts'] as $field_name => &$sort) {
134         if ($sort['plugin_id'] === 'standard') {
135           $table_data = Views::viewsData()->get($sort['table']);
136           if (!$table_data) {
137             continue;
138           }
139
140           // Get field config.
141           $sort_views_data = $table_data[$sort['field']]['sort'];
142           if (!isset($sort_views_data['entity_type']) || !isset($sort_views_data['field_name'])) {
143             continue;
144           }
145           $field_storage_name = 'field.storage.' . $sort_views_data['entity_type'] . '.' . $sort_views_data['field_name'];
146           $field_configuration = $config_factory->get($field_storage_name);
147
148           if ($field_configuration->get('type') === 'daterange') {
149
150             // Set entity_type if missing.
151             if (!isset($sort['entity_type'])) {
152               $sort['entity_type'] = $sort_views_data['entity_type'];
153             }
154
155             // Set datetime plugin_id.
156             $sort['plugin_id'] = 'datetime';
157             $changed = TRUE;
158             @trigger_error('Use of standard sort handlers for datetime_range fields is deprecated. Use the datetime sort handlers instead. See https://www.drupal.org/node/2857691', E_USER_DEPRECATED);
159           }
160         }
161       }
162     }
163   }
164
165   if ($changed) {
166     $view->set('display', $displays);
167   }
168 }