views.install in Zircon Profile 8
Same filename and directory in other branches
Contains install and update functions for Views.
File
core/modules/views/views.installView source
<?php
/**
* @file
* Contains install and update functions for Views.
*/
/**
* Implements hook_install().
*/
function views_install() {
module_set_weight('views', 10);
}
/**
* @addtogroup updates-8.0.0-beta
* @{
*/
/**
* Update views field plugins.
*/
function views_update_8001(&$sandbox) {
$config_factory = \Drupal::configFactory();
$ids = [];
$message = NULL;
$ago_formats = [
'time ago',
'time hence',
'time span',
'raw time ago',
'raw time hence',
'raw time span',
'inverse time span',
];
foreach ($config_factory
->listAll('views.view.') as $view_config_name) {
$view = $config_factory
->getEditable($view_config_name);
$displays = $view
->get('display');
foreach ($displays as $display_name => $display) {
if (!empty($display['display_options']['fields'])) {
foreach ($display['display_options']['fields'] as $field_name => $field) {
if (isset($field['entity_type']) && $field['plugin_id'] === 'date') {
$ids[] = $view
->get('id');
// Grab the settings we need to move to a different place in the
// config schema.
$date_format = !empty($field['date_format']) ? $field['date_format'] : 'medium';
$custom_date_format = !empty($field['custom_date_format']) ? $field['custom_date_format'] : '';
$timezone = !empty($field['timezone']) ? $field['timezone'] : '';
// Save off the base part of the config path we are updating.
$base = "display.{$display_name}.display_options.fields.{$field_name}";
if (in_array($date_format, $ago_formats)) {
// Update the field to use the Field API formatter.
$view
->set($base . '.plugin_id', 'field');
$view
->set($base . '.type', 'timestamp_ago');
// Ensure the granularity is an integer, which is defined in the
// field.formatter.settings.timestamp_ago schema.
$granularity = is_numeric($custom_date_format) ? (int) $custom_date_format : 2;
// Add the new settings.
if ($date_format === 'time ago' || $date_format === 'time hence' || $date_format === 'time span') {
$view
->set($base . '.settings.future_format', '@interval hence');
$view
->set($base . '.settings.past_format', '@interval ago');
$view
->set($base . '.settings.granularity', $granularity);
}
elseif ($date_format === 'raw time ago' || $date_format === 'raw time hence') {
$view
->set($base . '.settings.future_format', '@interval');
$view
->set($base . '.settings.past_format', '@interval');
$view
->set($base . '.settings.granularity', $granularity);
}
elseif ($date_format === 'raw time span') {
$view
->set($base . '.settings.future_format', '@interval');
$view
->set($base . '.settings.past_format', '-@interval');
$view
->set($base . '.settings.granularity', $granularity);
}
elseif ($date_format === 'inverse time span') {
$view
->set($base . '.settings.future_format', '-@interval');
$view
->set($base . '.settings.past_format', '@interval');
$view
->set($base . '.settings.granularity', $granularity);
}
}
else {
// Update the field to use the Field API formatter.
$view
->set($base . '.plugin_id', 'field');
$view
->set($base . '.type', 'timestamp');
// Add the new settings, and make sure everything is a string
// to conform with the field.formatter.settings.timestamp schema.
$view
->set($base . '.settings.date_format', (string) $date_format);
$view
->set($base . '.settings.custom_date_format', (string) $custom_date_format);
$view
->set($base . '.settings.timezone', (string) $timezone);
}
// Remove the old settings.
$view
->clear($base . '.date_format');
$view
->clear($base . '.custom_date_format');
$view
->clear($base . '.timezone');
}
}
}
}
$view
->save(TRUE);
}
if (!empty($ids)) {
$message = \Drupal::translation()
->translate('Updated field plugins for views: @ids', [
'@ids' => implode(', ', array_unique($ids)),
]);
}
return $message;
}
/**
* Updates %1 and !1 tokens to argument tokens.
*/
function views_update_8002() {
$config_factory = \Drupal::configFactory();
foreach ($config_factory
->listAll('views.view.') as $view_config_name) {
$view = $config_factory
->getEditable($view_config_name);
$displays = $view
->get('display');
$argument_map_per_display = _views_update_argument_map($displays);
$changed = FALSE;
// Update all the field settings, which support tokens.
foreach ($displays as $display_name => &$display) {
if (!empty($display['display_options']['fields'])) {
$token_values = [
'path',
'alt',
'link_class',
'rel',
'target',
'query',
'fragment',
'prefix',
'suffix',
'more_link_text',
'more_link_path',
'link_attributes',
'text',
];
foreach ($display['display_options']['fields'] as $field_name => &$field) {
foreach ($token_values as $token_name) {
if (!empty($field['alter'][$token_name])) {
if (is_array($field['alter'][$token_name])) {
foreach (array_keys($field['alter'][$token_name]) as $key) {
$field['alter'][$token_name][$key] = _views_update_8002_token_update($field['alter'][$token_name][$key], $argument_map_per_display[$display_name]);
$changed = TRUE;
}
}
else {
$field['alter'][$token_name] = _views_update_8002_token_update($field['alter'][$token_name], $argument_map_per_display[$display_name]);
$changed = TRUE;
}
}
}
}
}
}
// Update the area handlers with tokens.
foreach ($displays as $display_name => &$display) {
$area_types = [
'header',
'footer',
'empty',
];
foreach ($area_types as $area_type) {
if (!empty($display['display_options'][$area_type])) {
foreach ($display['display_options'][$area_type] as &$area) {
switch ($area['plugin_id']) {
case 'title':
$area['title'] = _views_update_8002_token_update($area['title'], $argument_map_per_display[$display_name]);
$changed = TRUE;
break;
case 'result':
$area['content'] = _views_update_8002_token_update($area['content'], $argument_map_per_display[$display_name]);
$changed = TRUE;
break;
case 'text':
$area['content']['value'] = _views_update_8002_token_update($area['content']['value'], $argument_map_per_display[$display_name]);
$changed = TRUE;
break;
case 'text_custom':
$area['content'] = _views_update_8002_token_update($area['content'], $argument_map_per_display[$display_name]);
$changed = TRUE;
break;
case 'entity':
$area['target'] = _views_update_8002_token_update($area['target'], $argument_map_per_display[$display_name]);
$changed = TRUE;
break;
}
}
}
}
}
// Update the argument title settings.
foreach ($displays as $display_name => &$display) {
if (!empty($display['display_options']['arguments'])) {
foreach ($display['display_options']['arguments'] as &$argument) {
if (isset($argument['exception']['title'])) {
$argument['exception']['title'] = _views_update_8002_token_update($argument['exception']['title'], $argument_map_per_display[$display_name]);
$changed = TRUE;
}
if (isset($argument['title'])) {
$argument['title'] = _views_update_8002_token_update($argument['title'], $argument_map_per_display[$display_name]);
$changed = TRUE;
}
}
}
}
// Update the display title settings.
// Update the more link text and more link URL.
foreach ($displays as $display_name => &$display) {
if (!empty($display['display_options']['title'])) {
$display['display_options']['title'] = _views_update_8002_token_update($display['display_options']['title'], $argument_map_per_display[$display_name]);
$changed = TRUE;
}
if (!empty($display['display_options']['use_more_text'])) {
$display['display_options']['use_more_text'] = _views_update_8002_token_update($display['display_options']['use_more_text'], $argument_map_per_display[$display_name]);
$changed = TRUE;
}
if (!empty($display['display_options']['link_url'])) {
$display['display_options']['link_url'] = _views_update_8002_token_update($display['display_options']['link_url'], $argument_map_per_display[$display_name]);
$changed = TRUE;
}
}
// Update custom classes for row class + grid classes.
// Update RSS description field.
foreach ($displays as $display_name => &$display) {
if (!empty($display['display_options']['style'])) {
if (!empty($display['display_options']['style']['options']['row_class_custom'])) {
$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]);
$changed = TRUE;
}
if (!empty($display['display_options']['style']['options']['col_class_custom'])) {
$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]);
$changed = TRUE;
}
if (!empty($display['display_options']['style']['options']['description'])) {
$display['display_options']['style']['options']['description'] = _views_update_8002_token_update($display['display_options']['style']['options']['description'], $argument_map_per_display[$display_name]);
$changed = TRUE;
}
}
}
if ($changed) {
$view
->set('display', $displays);
$view
->save(TRUE);
}
}
}
/**
* Updates a views configuration string from using %/! to twig tokens.
*
* @param string $text
* Text in which to search for argument tokens and replace them with their
* twig representation.
* @param array $argument_map
* A map of argument machine names keyed by their previous index.
*
* @return string
* The updated token.
*/
function _views_update_8002_token_update($text, array $argument_map) {
$text = preg_replace_callback('/%(\\d)/', function ($match) use ($argument_map) {
return "{{ arguments.{$argument_map[$match[1]]} }}";
}, $text);
$text = preg_replace_callback('/!(\\d)/', function ($match) use ($argument_map) {
return "{{ raw_arguments.{$argument_map[$match[1]]} }}";
}, $text);
return $text;
}
/**
* Builds an argument map for each Views display.
*
* @param array $displays
* A list of Views displays.
*
* @return array
* The argument map keyed by display id.
*/
function _views_update_argument_map($displays) {
$argument_map = [];
foreach ($displays as $display_id => $display) {
$argument_map[$display_id] = [];
if (isset($display['display_options']['arguments'])) {
foreach (array_keys($display['display_options']['arguments']) as $number => $name) {
$argument_map[$display_id][$number + 1] = $name;
}
}
elseif (isset($displays['default']['display_options']['arguments'])) {
foreach (array_keys($displays['default']['display_options']['arguments']) as $number => $name) {
$argument_map[$display_id][$number + 1] = $name;
}
}
}
return $argument_map;
}
/**
* @} End of "addtogroup updates-8.0.0-beta".
*/
/**
* @addtogroup updates-8.0.0-rc
* @{
*/
/**
* Clear caches to fix entity operations field.
*/
function views_update_8003() {
// Empty update to cause a cache flush so that views data is rebuilt. Entity
// types that don't implement a list builder cannot have the entity operations
// field.
}
/**
* @} End of "addtogroup updates-8.0.0-rc".
*/
Functions
Name | Description |
---|---|
views_install | Implements hook_install(). |
views_update_8001 | Update views field plugins. |
views_update_8002 | Updates %1 and !1 tokens to argument tokens. |
views_update_8003 | Clear caches to fix entity operations field. |
_views_update_8002_token_update | Updates a views configuration string from using %/! to twig tokens. |
_views_update_argument_map | Builds an argument map for each Views display. |