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