diff --git a/core/modules/datetime/datetime.views.inc b/core/modules/datetime/datetime.views.inc index d3b0d18..e6b2eb7 100644 --- a/core/modules/datetime/datetime.views.inc +++ b/core/modules/datetime/datetime.views.inc @@ -11,18 +11,40 @@ * Implements hook_field_views_data(). */ function datetime_field_views_data(FieldStorageConfigInterface $field_storage) { + return _datetime_type_field_views_data($field_storage); +} + +/** + * Helper for datetime based fields. + * + * Override the default Views data for a datetime based fields, + * adding datetime views plugins. + * + * @param FieldStorageConfigInterface $field_storage + * The field storage config entity. + * @param array $data + * Field view data or views_field_default_views_data($field_storage) if empty. + * @param string $column_name + * The schema column name with the datetime value or 'value' if empty. + * + * @return array + * The array of field views data with the datetime plugin. + * + * @internal + */ +function _datetime_type_field_views_data(FieldStorageConfigInterface $field_storage, $data = [], $column_name = 'value') { // @todo This code only covers configurable fields, handle base table fields // in https://www.drupal.org/node/2489476. - $data = views_field_default_views_data($field_storage); + $data = (empty($data)) ? views_field_default_views_data($field_storage) : $data; foreach ($data as $table_name => $table_data) { // Set the 'datetime' filter type. - $data[$table_name][$field_storage->getName() . '_value']['filter']['id'] = 'datetime'; + $data[$table_name][$field_storage->getName() . '_' . $column_name]['filter']['id'] = 'datetime'; // Set the 'datetime' argument type. - $data[$table_name][$field_storage->getName() . '_value']['argument']['id'] = 'datetime'; + $data[$table_name][$field_storage->getName() . '_' . $column_name]['argument']['id'] = 'datetime'; // Create year, month, and day arguments. - $group = $data[$table_name][$field_storage->getName() . '_value']['group']; + $group = $data[$table_name][$field_storage->getName() . '_' . $column_name]['group']; $arguments = [ // Argument type => help text. 'year' => t('Date in the form of YYYY.'), @@ -33,11 +55,11 @@ function datetime_field_views_data(FieldStorageConfigInterface $field_storage) { 'full_date' => t('Date in the form of CCYYMMDD.'), ]; foreach ($arguments as $argument_type => $help_text) { - $data[$table_name][$field_storage->getName() . '_value_' . $argument_type] = [ + $data[$table_name][$field_storage->getName() . '_' . $column_name . '_' . $argument_type] = [ 'title' => $field_storage->getLabel() . ' (' . $argument_type . ')', 'help' => $help_text, 'argument' => [ - 'field' => $field_storage->getName() . '_value', + 'field' => $field_storage->getName() . '_' . $column_name, 'id' => 'datetime_' . $argument_type, ], 'group' => $group, @@ -45,7 +67,7 @@ function datetime_field_views_data(FieldStorageConfigInterface $field_storage) { } // Set the 'datetime' sort handler. - $data[$table_name][$field_storage->getName() . '_value']['sort']['id'] = 'datetime'; + $data[$table_name][$field_storage->getName() . '_' . $column_name]['sort']['id'] = 'datetime'; } return $data; diff --git a/core/modules/datetime_range/datetime_range.install b/core/modules/datetime_range/datetime_range.install new file mode 100644 index 0000000..89bddef --- /dev/null +++ b/core/modules/datetime_range/datetime_range.install @@ -0,0 +1,115 @@ +listAll('views.view.') as $view_config_name) { + $view = $config_factory->getEditable($view_config_name); + $displays = $view->get('display'); + + foreach ($displays as $display_name => $display) { + + // Update datetime_range filters. + if (isset($display['display_options']['filters'])) { + foreach ($display['display_options']['filters'] as $field_name => $filter) { + if ($filter['plugin_id'] == 'string') { + + // Get field config. + $filter_views_data = \Drupal\views\Views::viewsData()->get($filter['table'])[$filter['field']]['filter']; + $field_storage_name = 'field.storage.' . $filter_views_data['entity_type'] . '.' . $filter_views_data['field_name']; + $field_configuration = $config_factory->get($field_storage_name); + + if ($field_configuration->get('type') == 'daterange') { + $ids[] = $view->get('id'); + + // Save off the base part of the config path we are updating. + $base = "display.$display_name.display_options.filters.$field_name"; + + // Set entity_type and field_name if missing. + if (!isset($filter['entity_type'])) { + $view->set($base . '.entity_type', $filter_views_data['entity_type']); + } + if (!isset($filter['field_name'])) { + $view->set($base . '.field_name', $filter_views_data['field_name']); + } + + // Set datetime plugin_id. + $view->set($base . '.plugin_id', 'datetime'); + + // Make sure we retrieve the right value, even if the user + // already updated the filter. + $value = isset($filter['value']['value']) + ? $filter['value']['value'] + : $filter['value']; + + // Set datetime value. + $datetime_value = [ + 'min' => '', + 'max' => '', + 'value' => $value, + 'type' => 'offset', + ]; + $view->set($base . '.value', $datetime_value); + + // Store the changes. + $view->save(TRUE); + } + } + } + } + + // Update datetime_range filters. + if (isset($display['display_options']['sorts'])) { + foreach ($display['display_options']['sorts'] as $field_name => $sort) { + if ($sort['plugin_id'] == 'standard') { + + // Get field config. + $sort_views_data = \Drupal\views\Views::viewsData()->get($sort['table'])[$sort['field']]['sort']; + $field_storage_name = 'field.storage.' . $sort_views_data['entity_type'] . '.' . $sort_views_data['field_name']; + $field_configuration = $config_factory->get($field_storage_name); + + if ($field_configuration->get('type') == 'daterange') { + $ids[] = $view->get('id'); + + // Save off the base part of the config path we are updating. + $base = "display.$display_name.display_options.sorts.$field_name"; + + // Set entity_type and field_name if missing. + if (!isset($sort['entity_type'])) { + $view->set($base . '.entity_type', $sort_views_data['entity_type']); + } + if (!isset($sort['field_name'])) { + $view->set($base . '.field_name', $sort_views_data['field_name']); + } + + // Set datetime plugin_id. + $view->set($base . '.plugin_id', 'datetime'); + + // Set granularity. + $view->set($base . '.granularity', 'seconds'); + + // Store the changes. + $view->save(TRUE); + } + } + } + } + } + } + + if (!empty($ids)) { + $message = \Drupal::translation()->translate('Updated datetime_range filter/sort plugins for views: @ids', ['@ids' => implode(', ', array_unique($ids))]); + } + + return $message; +} diff --git a/core/modules/datetime_range/datetime_range.views.inc b/core/modules/datetime_range/datetime_range.views.inc new file mode 100644 index 0000000..f07d60f --- /dev/null +++ b/core/modules/datetime_range/datetime_range.views.inc @@ -0,0 +1,18 @@ +