diff --git a/core/modules/dblog/dblog.install b/core/modules/dblog/dblog.install index 7cdbfb3..e593e7e 100644 --- a/core/modules/dblog/dblog.install +++ b/core/modules/dblog/dblog.install @@ -97,15 +97,64 @@ function dblog_schema() { * Use standard plugin for wid and uid fields. Use dblog_types for type filter. */ function dblog_update_8400() { - // Make sure dblog_view_presave() hook is available. - \Drupal::moduleHandler()->resetImplementations(); + $config_factory = \Drupal::configFactory(); - // The fields and filters are fixed automatically in dblog_view_presave() so - // we just need to re-save all views that use watchdog as base table. - $views = View::loadMultiple(); - array_walk($views, function(View $view) { - if ($view->get('base_table') == 'watchdog') { + foreach ($config_factory->listAll('views.view.') as $view_config_name) { + $view = $config_factory->getEditable($view_config_name); + if ($view->get('base_table') != 'watchdog') { + continue; + } + + $save = FALSE; + foreach ($view->get('display') as $display_name => $display) { + // Iterate through all the fields of watchdog views based tables. + if (isset($display['display_options']['fields'])) { + foreach ($display['display_options']['fields'] as $field_name => $field) { + // We are only interested in wid and uid fields from the watchdog + // table that still use the numeric id. + if (isset($field['table']) && + $field['table'] === 'watchdog' && + $field['plugin_id'] == 'numeric' && + in_array($field['field'], ['wid', 'uid'])) { + + $save = TRUE; + $new_value = $field; + $new_value['plugin_id'] = 'standard'; + + // Delete all the attributes related to numeric fields. + unset( + $new_value['set_precision'], + $new_value['precision'], + $new_value['decimal'], + $new_value['separator'], + $new_value['format_plural'], + $new_value['format_plural_string'], + $new_value['prefix'], + $new_value['suffix'] + ); + $view->set("display.$display_name.display_options.fields.$field_name", $new_value); + } + } + } + + // Iterate all filters looking for type filters to update. + if (isset($display['display_options']['filters'])) { + foreach ($display['display_options']['filters'] as $filter_name => $filter) { + if (isset($filter['table']) && + $filter['table'] === 'watchdog' && + $filter['plugin_id'] == 'in_operator' && + $filter['field'] == 'type') { + + $save = TRUE; + $filter['plugin_id'] = 'dblog_types'; + $view->set("display.$display_name.display_options.filters.$filter_name", $filter); + } + } + } + } + + if ($save) { $view->save(); } - }); + } } diff --git a/core/modules/dblog/src/Tests/Update/DblogFiltersAndFieldsUpgradeTest.php b/core/modules/dblog/src/Tests/Update/DblogFiltersAndFieldsUpgradeTest.php index 11992b3..d988d71 100644 --- a/core/modules/dblog/src/Tests/Update/DblogFiltersAndFieldsUpgradeTest.php +++ b/core/modules/dblog/src/Tests/Update/DblogFiltersAndFieldsUpgradeTest.php @@ -4,6 +4,7 @@ use Drupal\system\Tests\Update\UpdatePathTestBase; use Drupal\views\Views; +use Drupal\Core\Serialization\Yaml; /** * Tests the upgrade path for views field and filter handlers. @@ -42,6 +43,35 @@ public function testDblogUpgradePath() { $filters = $data['display']['default']['display_options']['filters']; // The 'type' filter should use the dblog_types plugin now. $this->assertEqual('dblog_types', $filters['type']['plugin_id']); + + // Now that the view had been converted, try the same approach but using + // dblog_view_presave() + $config_factory = \Drupal::configFactory(); + $config_view = $config_factory->getEditable('views.view.dblog_2851293'); + $config_view->setData(Yaml::decode(file_get_contents('core/modules/dblog/tests/modules/dblog_test_views/test_views/views.view.dblog_2851293.yml'))); + $config_view->save(); + + // Make sure we have a not upgraded view. + $view = Views::getView('dblog_2851293'); + $data = $view->storage->toArray(); + $fields = $data['display']['default']['display_options']['fields']; + $filters = $data['display']['default']['display_options']['filters']; + + $this->assertEqual('numeric', $fields['wid']['plugin_id']); + $this->assertEqual('numeric', $fields['uid']['plugin_id']); + $this->assertEqual('in_operator', $filters['type']['plugin_id']); + + // Now save the view. This trigger dblog_view_presave(). + $view->save(); + + // Finally check the same convertion proccess ran. + $data = $view->storage->toArray(); + $fields = $data['display']['default']['display_options']['fields']; + $filters = $data['display']['default']['display_options']['filters']; + + $this->assertEqual('standard', $fields['wid']['plugin_id']); + $this->assertEqual('standard', $fields['uid']['plugin_id']); + $this->assertEqual('dblog_types', $filters['type']['plugin_id']); } }