Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 /**
|
Chris@0
|
4 * @file
|
Chris@0
|
5 * Contains install and update functions for Views.
|
Chris@0
|
6 */
|
Chris@0
|
7
|
Chris@0
|
8 /**
|
Chris@0
|
9 * Implements hook_install().
|
Chris@0
|
10 */
|
Chris@0
|
11 function views_install() {
|
Chris@0
|
12 module_set_weight('views', 10);
|
Chris@0
|
13 }
|
Chris@0
|
14
|
Chris@0
|
15 /**
|
Chris@0
|
16 * Update views field plugins.
|
Chris@0
|
17 */
|
Chris@0
|
18 function views_update_8001(&$sandbox) {
|
Chris@0
|
19 $config_factory = \Drupal::configFactory();
|
Chris@0
|
20 $ids = [];
|
Chris@0
|
21 $message = NULL;
|
Chris@0
|
22 $ago_formats = [
|
Chris@0
|
23 'time ago',
|
Chris@0
|
24 'time hence',
|
Chris@0
|
25 'time span',
|
Chris@0
|
26 'raw time ago',
|
Chris@0
|
27 'raw time hence',
|
Chris@0
|
28 'raw time span',
|
Chris@0
|
29 'inverse time span',
|
Chris@0
|
30 ];
|
Chris@0
|
31
|
Chris@0
|
32 foreach ($config_factory->listAll('views.view.') as $view_config_name) {
|
Chris@0
|
33 $view = $config_factory->getEditable($view_config_name);
|
Chris@0
|
34
|
Chris@0
|
35 $displays = $view->get('display');
|
Chris@0
|
36
|
Chris@0
|
37 foreach ($displays as $display_name => $display) {
|
Chris@0
|
38 if (!empty($display['display_options']['fields'])) {
|
Chris@0
|
39 foreach ($display['display_options']['fields'] as $field_name => $field) {
|
Chris@0
|
40 if (isset($field['entity_type']) && $field['plugin_id'] === 'date') {
|
Chris@0
|
41 $ids[] = $view->get('id');
|
Chris@0
|
42
|
Chris@0
|
43 // Grab the settings we need to move to a different place in the
|
Chris@0
|
44 // config schema.
|
Chris@0
|
45 $date_format = !empty($field['date_format']) ? $field['date_format'] : 'medium';
|
Chris@0
|
46 $custom_date_format = !empty($field['custom_date_format']) ? $field['custom_date_format'] : '';
|
Chris@0
|
47 $timezone = !empty($field['timezone']) ? $field['timezone'] : '';
|
Chris@0
|
48
|
Chris@0
|
49 // Save off the base part of the config path we are updating.
|
Chris@0
|
50 $base = "display.$display_name.display_options.fields.$field_name";
|
Chris@0
|
51
|
Chris@0
|
52 if (in_array($date_format, $ago_formats)) {
|
Chris@0
|
53 // Update the field to use the Field API formatter.
|
Chris@0
|
54 $view->set($base . '.plugin_id', 'field');
|
Chris@0
|
55 $view->set($base . '.type', 'timestamp_ago');
|
Chris@0
|
56
|
Chris@0
|
57 // Ensure the granularity is an integer, which is defined in the
|
Chris@0
|
58 // field.formatter.settings.timestamp_ago schema.
|
Chris@0
|
59 $granularity = is_numeric($custom_date_format) ? (int) $custom_date_format : 2;
|
Chris@0
|
60
|
Chris@0
|
61 // Add the new settings.
|
Chris@0
|
62 if ($date_format === 'time ago' || $date_format === 'time hence' || $date_format === 'time span') {
|
Chris@0
|
63 $view->set($base . '.settings.future_format', '@interval hence');
|
Chris@0
|
64 $view->set($base . '.settings.past_format', '@interval ago');
|
Chris@0
|
65 $view->set($base . '.settings.granularity', $granularity);
|
Chris@0
|
66 }
|
Chris@0
|
67 elseif ($date_format === 'raw time ago' || $date_format === 'raw time hence') {
|
Chris@0
|
68 $view->set($base . '.settings.future_format', '@interval');
|
Chris@0
|
69 $view->set($base . '.settings.past_format', '@interval');
|
Chris@0
|
70 $view->set($base . '.settings.granularity', $granularity);
|
Chris@0
|
71 }
|
Chris@0
|
72 elseif ($date_format === 'raw time span') {
|
Chris@0
|
73 $view->set($base . '.settings.future_format', '@interval');
|
Chris@0
|
74 $view->set($base . '.settings.past_format', '-@interval');
|
Chris@0
|
75 $view->set($base . '.settings.granularity', $granularity);
|
Chris@0
|
76 }
|
Chris@0
|
77 elseif ($date_format === 'inverse time span') {
|
Chris@0
|
78 $view->set($base . '.settings.future_format', '-@interval');
|
Chris@0
|
79 $view->set($base . '.settings.past_format', '@interval');
|
Chris@0
|
80 $view->set($base . '.settings.granularity', $granularity);
|
Chris@0
|
81 }
|
Chris@0
|
82 }
|
Chris@0
|
83 else {
|
Chris@0
|
84 // Update the field to use the Field API formatter.
|
Chris@0
|
85 $view->set($base . '.plugin_id', 'field');
|
Chris@0
|
86 $view->set($base . '.type', 'timestamp');
|
Chris@0
|
87
|
Chris@0
|
88 // Add the new settings, and make sure everything is a string
|
Chris@0
|
89 // to conform with the field.formatter.settings.timestamp schema.
|
Chris@0
|
90 $view->set($base . '.settings.date_format', (string) $date_format);
|
Chris@0
|
91 $view->set($base . '.settings.custom_date_format', (string) $custom_date_format);
|
Chris@0
|
92 $view->set($base . '.settings.timezone', (string) $timezone);
|
Chris@0
|
93 }
|
Chris@0
|
94
|
Chris@0
|
95 // Remove the old settings.
|
Chris@0
|
96 $view->clear($base . '.date_format');
|
Chris@0
|
97 $view->clear($base . '.custom_date_format');
|
Chris@0
|
98 $view->clear($base . '.timezone');
|
Chris@0
|
99 }
|
Chris@0
|
100 }
|
Chris@0
|
101 }
|
Chris@0
|
102 }
|
Chris@0
|
103
|
Chris@0
|
104 $view->save(TRUE);
|
Chris@0
|
105 }
|
Chris@0
|
106
|
Chris@0
|
107 if (!empty($ids)) {
|
Chris@0
|
108 $message = \Drupal::translation()->translate('Updated field plugins for views: @ids', ['@ids' => implode(', ', array_unique($ids))]);
|
Chris@0
|
109 }
|
Chris@0
|
110
|
Chris@0
|
111 return $message;
|
Chris@0
|
112 }
|
Chris@0
|
113
|
Chris@0
|
114 /**
|
Chris@0
|
115 * Updates %1 and !1 tokens to argument tokens.
|
Chris@0
|
116 */
|
Chris@0
|
117 function views_update_8002() {
|
Chris@0
|
118 $config_factory = \Drupal::configFactory();
|
Chris@0
|
119 foreach ($config_factory->listAll('views.view.') as $view_config_name) {
|
Chris@0
|
120 $view = $config_factory->getEditable($view_config_name);
|
Chris@0
|
121
|
Chris@0
|
122 $displays = $view->get('display');
|
Chris@0
|
123 $argument_map_per_display = _views_update_argument_map($displays);
|
Chris@0
|
124
|
Chris@0
|
125 $changed = FALSE;
|
Chris@0
|
126
|
Chris@0
|
127 // Update all the field settings, which support tokens.
|
Chris@0
|
128 foreach ($displays as $display_name => &$display) {
|
Chris@0
|
129 if (!empty($display['display_options']['fields'])) {
|
Chris@0
|
130 $token_values = [
|
Chris@0
|
131 'path',
|
Chris@0
|
132 'alt',
|
Chris@0
|
133 'link_class',
|
Chris@0
|
134 'rel',
|
Chris@0
|
135 'target',
|
Chris@0
|
136 'query',
|
Chris@0
|
137 'fragment',
|
Chris@0
|
138 'prefix',
|
Chris@0
|
139 'suffix',
|
Chris@0
|
140 'more_link_text',
|
Chris@0
|
141 'more_link_path',
|
Chris@0
|
142 'link_attributes',
|
Chris@0
|
143 'text',
|
Chris@0
|
144 ];
|
Chris@0
|
145
|
Chris@0
|
146 foreach ($display['display_options']['fields'] as $field_name => &$field) {
|
Chris@0
|
147 foreach ($token_values as $token_name) {
|
Chris@0
|
148 if (!empty($field['alter'][$token_name])) {
|
Chris@0
|
149 if (is_array($field['alter'][$token_name])) {
|
Chris@0
|
150 foreach (array_keys($field['alter'][$token_name]) as $key) {
|
Chris@0
|
151 $field['alter'][$token_name][$key] = _views_update_8002_token_update($field['alter'][$token_name][$key], $argument_map_per_display[$display_name]);
|
Chris@0
|
152 $changed = TRUE;
|
Chris@0
|
153 }
|
Chris@0
|
154 }
|
Chris@0
|
155 else {
|
Chris@0
|
156 $field['alter'][$token_name] = _views_update_8002_token_update($field['alter'][$token_name], $argument_map_per_display[$display_name]);
|
Chris@0
|
157 $changed = TRUE;
|
Chris@0
|
158 }
|
Chris@0
|
159 }
|
Chris@0
|
160 }
|
Chris@0
|
161 }
|
Chris@0
|
162 }
|
Chris@0
|
163 }
|
Chris@0
|
164
|
Chris@0
|
165 // Update the area handlers with tokens.
|
Chris@0
|
166 foreach ($displays as $display_name => &$display) {
|
Chris@0
|
167 $area_types = ['header', 'footer', 'empty'];
|
Chris@0
|
168 foreach ($area_types as $area_type) {
|
Chris@0
|
169 if (!empty($display['display_options'][$area_type])) {
|
Chris@0
|
170 foreach ($display['display_options'][$area_type] as &$area) {
|
Chris@0
|
171 switch ($area['plugin_id']) {
|
Chris@0
|
172 case 'title':
|
Chris@0
|
173 $area['title'] = _views_update_8002_token_update($area['title'], $argument_map_per_display[$display_name]);
|
Chris@0
|
174 $changed = TRUE;
|
Chris@0
|
175 break;
|
Chris@0
|
176 case 'result':
|
Chris@0
|
177 $area['content'] = _views_update_8002_token_update($area['content'], $argument_map_per_display[$display_name]);
|
Chris@0
|
178 $changed = TRUE;
|
Chris@0
|
179 break;
|
Chris@0
|
180 case 'text':
|
Chris@0
|
181 $area['content']['value'] = _views_update_8002_token_update($area['content']['value'], $argument_map_per_display[$display_name]);
|
Chris@0
|
182 $changed = TRUE;
|
Chris@0
|
183 break;
|
Chris@0
|
184 case 'text_custom':
|
Chris@0
|
185 $area['content'] = _views_update_8002_token_update($area['content'], $argument_map_per_display[$display_name]);
|
Chris@0
|
186 $changed = TRUE;
|
Chris@0
|
187 break;
|
Chris@0
|
188 case 'entity':
|
Chris@0
|
189 $area['target'] = _views_update_8002_token_update($area['target'], $argument_map_per_display[$display_name]);
|
Chris@0
|
190 $changed = TRUE;
|
Chris@0
|
191 break;
|
Chris@0
|
192 }
|
Chris@0
|
193 }
|
Chris@0
|
194 }
|
Chris@0
|
195 }
|
Chris@0
|
196 }
|
Chris@0
|
197
|
Chris@0
|
198 // Update the argument title settings.
|
Chris@0
|
199 foreach ($displays as $display_name => &$display) {
|
Chris@0
|
200 if (!empty($display['display_options']['arguments'])) {
|
Chris@0
|
201 foreach ($display['display_options']['arguments'] as &$argument) {
|
Chris@0
|
202 if (isset($argument['exception']['title'])) {
|
Chris@0
|
203 $argument['exception']['title'] = _views_update_8002_token_update($argument['exception']['title'], $argument_map_per_display[$display_name]);
|
Chris@0
|
204 $changed = TRUE;
|
Chris@0
|
205 }
|
Chris@0
|
206 if (isset($argument['title'])) {
|
Chris@0
|
207 $argument['title'] = _views_update_8002_token_update($argument['title'], $argument_map_per_display[$display_name]);
|
Chris@0
|
208 $changed = TRUE;
|
Chris@0
|
209 }
|
Chris@0
|
210 }
|
Chris@0
|
211 }
|
Chris@0
|
212 }
|
Chris@0
|
213
|
Chris@0
|
214 // Update the display title settings.
|
Chris@0
|
215 // Update the more link text and more link URL.
|
Chris@0
|
216 foreach ($displays as $display_name => &$display) {
|
Chris@0
|
217 if (!empty($display['display_options']['title'])) {
|
Chris@0
|
218 $display['display_options']['title'] = _views_update_8002_token_update($display['display_options']['title'], $argument_map_per_display[$display_name]);
|
Chris@0
|
219 $changed = TRUE;
|
Chris@0
|
220 }
|
Chris@0
|
221 if (!empty($display['display_options']['use_more_text'])) {
|
Chris@0
|
222 $display['display_options']['use_more_text'] = _views_update_8002_token_update($display['display_options']['use_more_text'], $argument_map_per_display[$display_name]);
|
Chris@0
|
223 $changed = TRUE;
|
Chris@0
|
224 }
|
Chris@0
|
225 if (!empty($display['display_options']['link_url'])) {
|
Chris@0
|
226 $display['display_options']['link_url'] = _views_update_8002_token_update($display['display_options']['link_url'], $argument_map_per_display[$display_name]);
|
Chris@0
|
227 $changed = TRUE;
|
Chris@0
|
228 }
|
Chris@0
|
229 }
|
Chris@0
|
230
|
Chris@0
|
231 // Update custom classes for row class + grid classes.
|
Chris@0
|
232 // Update RSS description field.
|
Chris@0
|
233 foreach ($displays as $display_name => &$display) {
|
Chris@0
|
234 if (!empty($display['display_options']['style'])) {
|
Chris@0
|
235 if (!empty($display['display_options']['style']['options']['row_class_custom'])) {
|
Chris@0
|
236 $display['display_options']['style']['options']['row_class_custom'] = _views_update_8002_token_update($display['display_options']['style']['options']['row_class_custom'], $argument_map_per_display[$display_name]);
|
Chris@0
|
237 $changed = TRUE;
|
Chris@0
|
238 }
|
Chris@0
|
239 if (!empty($display['display_options']['style']['options']['col_class_custom'])) {
|
Chris@0
|
240 $display['display_options']['style']['options']['col_class_custom'] = _views_update_8002_token_update($display['display_options']['style']['options']['col_class_custom'], $argument_map_per_display[$display_name]);
|
Chris@0
|
241 $changed = TRUE;
|
Chris@0
|
242 }
|
Chris@0
|
243 if (!empty($display['display_options']['style']['options']['description'])) {
|
Chris@0
|
244 $display['display_options']['style']['options']['description'] = _views_update_8002_token_update($display['display_options']['style']['options']['description'], $argument_map_per_display[$display_name]);
|
Chris@0
|
245 $changed = TRUE;
|
Chris@0
|
246 }
|
Chris@0
|
247 }
|
Chris@0
|
248 }
|
Chris@0
|
249
|
Chris@0
|
250 if ($changed) {
|
Chris@0
|
251 $view->set('display', $displays);
|
Chris@0
|
252 $view->save(TRUE);
|
Chris@0
|
253 }
|
Chris@0
|
254 }
|
Chris@0
|
255 }
|
Chris@0
|
256
|
Chris@0
|
257 /**
|
Chris@0
|
258 * Updates a views configuration string from using %/! to twig tokens.
|
Chris@0
|
259 *
|
Chris@0
|
260 * @param string $text
|
Chris@0
|
261 * Text in which to search for argument tokens and replace them with their
|
Chris@0
|
262 * twig representation.
|
Chris@0
|
263 * @param array $argument_map
|
Chris@0
|
264 * A map of argument machine names keyed by their previous index.
|
Chris@0
|
265 *
|
Chris@0
|
266 * @return string
|
Chris@0
|
267 * The updated token.
|
Chris@0
|
268 */
|
Chris@0
|
269 function _views_update_8002_token_update($text, array $argument_map) {
|
Chris@0
|
270 $text = preg_replace_callback('/%(\d)/', function ($match) use ($argument_map) {
|
Chris@0
|
271 return "{{ arguments.{$argument_map[$match[1]]} }}";
|
Chris@0
|
272 }, $text);
|
Chris@0
|
273 $text = preg_replace_callback('/!(\d)/', function ($match) use ($argument_map) {
|
Chris@0
|
274 return "{{ raw_arguments.{$argument_map[$match[1]]} }}";
|
Chris@0
|
275 }, $text);
|
Chris@0
|
276
|
Chris@0
|
277 return $text;
|
Chris@0
|
278 }
|
Chris@0
|
279
|
Chris@0
|
280 /**
|
Chris@0
|
281 * Builds an argument map for each Views display.
|
Chris@0
|
282 *
|
Chris@0
|
283 * @param array $displays
|
Chris@0
|
284 * A list of Views displays.
|
Chris@0
|
285 *
|
Chris@0
|
286 * @return array
|
Chris@0
|
287 * The argument map keyed by display id.
|
Chris@0
|
288 */
|
Chris@0
|
289 function _views_update_argument_map($displays) {
|
Chris@0
|
290 $argument_map = [];
|
Chris@0
|
291 foreach ($displays as $display_id => $display) {
|
Chris@0
|
292 $argument_map[$display_id] = [];
|
Chris@0
|
293 if (isset($display['display_options']['arguments'])) {
|
Chris@0
|
294 foreach (array_keys($display['display_options']['arguments']) as $number => $name) {
|
Chris@0
|
295 $argument_map[$display_id][$number + 1] = $name;
|
Chris@0
|
296 }
|
Chris@0
|
297 }
|
Chris@0
|
298 elseif (isset($displays['default']['display_options']['arguments'])) {
|
Chris@0
|
299 foreach (array_keys($displays['default']['display_options']['arguments']) as $number => $name) {
|
Chris@0
|
300 $argument_map[$display_id][$number + 1] = $name;
|
Chris@0
|
301 }
|
Chris@0
|
302 }
|
Chris@0
|
303 }
|
Chris@0
|
304
|
Chris@0
|
305 return $argument_map;
|
Chris@0
|
306 }
|
Chris@0
|
307
|
Chris@0
|
308 /**
|
Chris@0
|
309 * Clear caches to fix entity operations field.
|
Chris@0
|
310 */
|
Chris@0
|
311 function views_update_8003() {
|
Chris@0
|
312 // Empty update to cause a cache flush so that views data is rebuilt. Entity
|
Chris@0
|
313 // types that don't implement a list builder cannot have the entity operations
|
Chris@0
|
314 // field.
|
Chris@0
|
315 }
|
Chris@0
|
316
|
Chris@0
|
317 /**
|
Chris@0
|
318 * Clear caches due to updated entity views data.
|
Chris@0
|
319 */
|
Chris@0
|
320 function views_update_8004() {
|
Chris@0
|
321 // Empty update to cause a cache flush so that views data is rebuilt.
|
Chris@0
|
322 }
|
Chris@0
|
323
|
Chris@0
|
324 /**
|
Chris@0
|
325 * Clear views data cache.
|
Chris@0
|
326 */
|
Chris@0
|
327 function views_update_8005() {
|
Chris@0
|
328 // Empty update function to rebuild the views data.
|
Chris@0
|
329 }
|
Chris@0
|
330
|
Chris@0
|
331 /**
|
Chris@0
|
332 * Clear caches due to updated entity views data.
|
Chris@0
|
333 */
|
Chris@0
|
334 function views_update_8100() {
|
Chris@0
|
335 // Empty update to cause a cache flush so that views data is rebuilt.
|
Chris@0
|
336 }
|
Chris@0
|
337
|
Chris@0
|
338 /**
|
Chris@0
|
339 * Set default values for enabled/expanded flag on page displays.
|
Chris@0
|
340 */
|
Chris@0
|
341 function views_update_8101() {
|
Chris@0
|
342 $config_factory = \Drupal::configFactory();
|
Chris@0
|
343 foreach ($config_factory->listAll('views.view.') as $view_config_name) {
|
Chris@0
|
344 $view = $config_factory->getEditable($view_config_name);
|
Chris@0
|
345 $save = FALSE;
|
Chris@0
|
346 foreach ($view->get('display') as $display_id => $display) {
|
Chris@0
|
347 if ($display['display_plugin'] == 'page') {
|
Chris@0
|
348 $display['display_options']['menu']['enabled'] = TRUE;
|
Chris@0
|
349 $display['display_options']['menu']['expanded'] = FALSE;
|
Chris@0
|
350 $view->set("display.$display_id", $display);
|
Chris@0
|
351 $save = TRUE;
|
Chris@0
|
352 }
|
Chris@0
|
353 }
|
Chris@0
|
354 if ($save) {
|
Chris@0
|
355 $view->save();
|
Chris@0
|
356 }
|
Chris@0
|
357 }
|
Chris@0
|
358 }
|
Chris@0
|
359
|
Chris@0
|
360 /**
|
Chris@0
|
361 * Rebuild the container to add a new container parameter.
|
Chris@0
|
362 */
|
Chris@0
|
363 function views_update_8200() {
|
Chris@0
|
364 // Empty update to cause a cache rebuild so that the container is rebuilt.
|
Chris@0
|
365 }
|
Chris@0
|
366
|
Chris@0
|
367 /**
|
Chris@0
|
368 * Rebuild cache to refresh the views config schema.
|
Chris@0
|
369 */
|
Chris@0
|
370 function views_update_8201() {
|
Chris@0
|
371 // Empty update to cause a cache rebuild so that config schema get refreshed.
|
Chris@0
|
372 }
|