2015-10-08 18:40:12 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @file
|
|
|
|
* Post update functions for Views.
|
|
|
|
*/
|
|
|
|
|
2015-11-19 15:04:44 +00:00
|
|
|
use Drupal\Core\StringTranslation\TranslatableMarkup;
|
|
|
|
use Drupal\views\Views;
|
|
|
|
|
2015-10-08 18:40:12 +00:00
|
|
|
/**
|
|
|
|
* @addtogroup updates-8.0.0-beta
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update the cacheability metadata for all views.
|
|
|
|
*/
|
|
|
|
function views_post_update_update_cacheability_metadata() {
|
|
|
|
// Load all views.
|
|
|
|
$views = \Drupal::entityManager()->getStorage('view')->loadMultiple();
|
|
|
|
|
|
|
|
/* @var \Drupal\views\Entity\View[] $views */
|
|
|
|
foreach ($views as $view) {
|
|
|
|
$displays = $view->get('display');
|
|
|
|
foreach (array_keys($displays) as $display_id) {
|
|
|
|
$display =& $view->getDisplay($display_id);
|
|
|
|
// Unset the cache_metadata key, so all cacheability metadata for the
|
|
|
|
// display is recalculated.
|
|
|
|
unset($display['cache_metadata']);
|
|
|
|
}
|
|
|
|
$view->save();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-12-02 19:38:43 +00:00
|
|
|
/**
|
|
|
|
* @} End of "addtogroup updates-8.0.0-beta".
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @addtogroup updates-8.0.0-rc
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
2015-11-19 15:04:44 +00:00
|
|
|
/**
|
|
|
|
* Update some views fields that were previously duplicated.
|
|
|
|
*/
|
|
|
|
function views_post_update_cleanup_duplicate_views_data() {
|
|
|
|
$config_factory = \Drupal::configFactory();
|
|
|
|
$ids = [];
|
|
|
|
$message = NULL;
|
|
|
|
$data_tables = [];
|
|
|
|
$base_tables = [];
|
|
|
|
$revision_tables = [];
|
|
|
|
$entities_by_table = [];
|
|
|
|
$duplicate_fields = [];
|
|
|
|
$handler_types = Views::getHandlerTypes();
|
|
|
|
|
|
|
|
/** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */
|
|
|
|
$entity_type_manager = \Drupal::service('entity_type.manager');
|
|
|
|
// This will allow us to create an index of all entity types of the site.
|
|
|
|
foreach ($entity_type_manager->getDefinitions() as $entity_type_id => $entity_type) {
|
|
|
|
// Store the entity keyed by base table. If it has a data table, use that as
|
|
|
|
// well.
|
|
|
|
if ($data_table = $entity_type->getDataTable()) {
|
|
|
|
$entities_by_table[$data_table] = $entity_type;
|
|
|
|
}
|
|
|
|
if ($base_table = $entity_type->getBaseTable()) {
|
|
|
|
$entities_by_table[$base_table] = $entity_type;
|
|
|
|
}
|
|
|
|
|
|
|
|
// The following code basically contains the same kind of logic as
|
|
|
|
// \Drupal\Core\Entity\Sql\SqlContentEntityStorage::initTableLayout() to
|
|
|
|
// prefetch all tables (base, data, revision, and revision data).
|
|
|
|
$base_tables[$entity_type_id] = $entity_type->getBaseTable() ?: $entity_type->id();
|
|
|
|
$revisionable = $entity_type->isRevisionable();
|
|
|
|
|
|
|
|
$revision_table = '';
|
|
|
|
if ($revisionable) {
|
|
|
|
$revision_table = $entity_type->getRevisionTable() ?: $entity_type->id() . '_revision';
|
|
|
|
}
|
|
|
|
$revision_tables[$entity_type_id] = $revision_table;
|
|
|
|
|
|
|
|
$translatable = $entity_type->isTranslatable();
|
|
|
|
$data_table = '';
|
|
|
|
// For example the data table just exists, when the entity type is
|
|
|
|
// translatable.
|
|
|
|
if ($translatable) {
|
|
|
|
$data_table = $entity_type->getDataTable() ?: $entity_type->id() . '_field_data';
|
|
|
|
}
|
|
|
|
$data_tables[$entity_type_id] = $data_table;
|
|
|
|
|
|
|
|
$duplicate_fields[$entity_type_id] = array_intersect_key($entity_type->getKeys(), array_flip(['id', 'revision', 'bundle']));
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($config_factory->listAll('views.view.') as $view_config_name) {
|
|
|
|
$changed = FALSE;
|
|
|
|
$view = $config_factory->getEditable($view_config_name);
|
|
|
|
|
|
|
|
$displays = $view->get('display');
|
|
|
|
if (isset($entities_by_table[$view->get('base_table')])) {
|
|
|
|
$entity_type = $entities_by_table[$view->get('base_table')];
|
|
|
|
$entity_type_id = $entity_type->id();
|
|
|
|
$data_table = $data_tables[$entity_type_id];
|
|
|
|
$base_table = $base_tables[$entity_type_id];
|
|
|
|
$revision_table = $revision_tables[$entity_type_id];
|
|
|
|
|
|
|
|
if ($data_table) {
|
|
|
|
foreach ($displays as $display_name => &$display) {
|
|
|
|
foreach ($handler_types as $handler_type) {
|
|
|
|
if (!empty($display['display_options'][$handler_type['plural']])) {
|
|
|
|
foreach ($display['display_options'][$handler_type['plural']] as $field_name => &$field) {
|
|
|
|
$table = $field['table'];
|
|
|
|
if (($table === $base_table || $table === $revision_table) && in_array($field_name, $duplicate_fields[$entity_type_id])) {
|
|
|
|
$field['table'] = $data_table;
|
|
|
|
$changed = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($changed) {
|
|
|
|
$view->set('display', $displays);
|
|
|
|
$view->save();
|
|
|
|
$ids[] = $view->get('id');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!empty($ids)) {
|
|
|
|
$message = new TranslatableMarkup('Updated tables for field handlers for views: @ids', ['@ids' => implode(', ', array_unique($ids))]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $message;
|
|
|
|
}
|
|
|
|
|
2015-10-08 18:40:12 +00:00
|
|
|
/**
|
2015-12-02 19:38:43 +00:00
|
|
|
* @} End of "addtogroup updates-8.0.0-rc".
|
2015-10-08 18:40:12 +00:00
|
|
|
*/
|