diff -u b/core/modules/views/src/EntityViewsData.php b/core/modules/views/src/EntityViewsData.php --- b/core/modules/views/src/EntityViewsData.php +++ b/core/modules/views/src/EntityViewsData.php @@ -4,7 +4,6 @@ use Drupal\Component\Plugin\PluginManagerInterface; use Drupal\Component\Utility\NestedArray; -use Drupal\Core\Entity\ContentEntityType; use Drupal\Core\Entity\EntityHandlerInterface; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Entity\EntityTypeInterface; @@ -60,13 +59,6 @@ protected $fieldStorageDefinitions; /** - * The field type views data. - * - * @var \Drupal\Component\Plugin\PluginManagerInterface - */ - protected $fieldTypeViewsData; - - /** * Constructs an EntityViewsData object. * * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type @@ -74,6 +66,13 @@ protected $entityManager; /** + * The field type views data. + * + * @var \Drupal\Component\Plugin\PluginManagerInterface + */ + protected $fieldTypeViewsData; + + /** * Constructs an EntityViewsData object. * * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type @@ -86,6 +85,8 @@ * The module handler. * @param \Drupal\Core\StringTranslation\TranslationInterface $translation_manager * The translation manager. + * @param PluginManagerInterface $field_type_views_data + * The field type views data manager. */ function __construct(EntityTypeInterface $entity_type, SqlEntityStorageInterface $storage_controller, EntityManagerInterface $entity_manager, ModuleHandlerInterface $module_handler, TranslationInterface $translation_manager, PluginManagerInterface $field_type_views_data) { $this->entityType = $entity_type; @@ -106,7 +107,6 @@ $container->get('entity.manager'), $container->get('module_handler'), $container->get('string_translation'), - $container->get('typed_data_manager'), $container->get('plugin.manager.views.field_type_views_data') ); } @@ -335,8 +335,7 @@ protected function mapFieldDefinition($table, $field_name, FieldDefinitionInterface $field_definition, TableMappingInterface $table_mapping, &$table_data) { // Create a dummy instance to retrieve property definitions. $field_column_mapping = $table_mapping->getColumnNames($field_name); - $field_storage_definition = $this->getFieldStorageDefinitions()[$field_name]; - $field_schema = $field_storage_definition->getSchema(); + $field_schema = $this->getFieldStorageDefinitions()[$field_name]->getSchema(); $field_definition_type = $field_definition->getType(); // Add all properties to views table data. We need an entry for each @@ -346,27 +345,13 @@ // mapSingleFieldViewsData() method does with $first. $multiple = (count($field_column_mapping) > 1); $first = TRUE; - - $data = []; - /** @var \Drupal\views\Plugin\views\FieldTypeViewsDataInterface $field_type_views_data_plugin */ - $field_type_views_data_plugin = $this->fieldTypeViewsData->createInstance($field_definition_type); foreach ($field_column_mapping as $field_column_name => $schema_field_name) { $views_field_name = ($multiple) ? $field_name . '__' . $field_column_name : $field_name; + $table_data[$views_field_name] = $this->mapSingleFieldViewsData($table, $field_name, $field_definition_type, $field_column_name, $field_schema['columns'][$field_column_name]['type'], $first, $field_definition); - if ($field_type_views_data_plugin) { - $data[$views_field_name] = $field_type_views_data_plugin->getViewsData($field_storage_definition, $field_column_name); - } - else { - $data[$views_field_name] = $this->mapSingleFieldViewsData($table, $field_name, $field_definition_type, $field_column_name, $field_schema['columns'][$field_column_name]['type'], $first, $field_definition); - } - - $data[$views_field_name]['entity field'] = $field_name; + $table_data[$views_field_name]['entity field'] = $field_name; $first = FALSE; } - - $this->moduleHandler->alter('field_type_views_data_alter', $data, $field_definition, $field_storage_definition); - - $table_data = NestedArray::mergeDeep($table_data, $data); } /** @@ -389,7 +374,8 @@ protected function mapFieldDefinition($table, $field_name, FieldDefinitionInterface $field_definition, TableMappingInterface $table_mapping, &$table_data) { // Create a dummy instance to retrieve property definitions. $field_column_mapping = $table_mapping->getColumnNames($field_name); - $field_schema = $this->getFieldStorageDefinitions()[$field_name]->getSchema(); + $field_storage_definition = $this->getFieldStorageDefinitions()[$field_name]; + $field_schema = $field_storage_definition->getSchema(); $field_definition_type = $field_definition->getType(); // Add all properties to views table data. We need an entry for each @@ -399,13 +385,25 @@ // mapSingleFieldViewsData() method does with $first. $multiple = (count($field_column_mapping) > 1); $first = TRUE; + + $data = []; foreach ($field_column_mapping as $field_column_name => $schema_field_name) { $views_field_name = ($multiple) ? $field_name . '__' . $field_column_name : $field_name; - $table_data[$views_field_name] = $this->mapSingleFieldViewsData($table, $field_name, $field_definition_type, $field_column_name, $field_schema['columns'][$field_column_name]['type'], $first, $field_definition); + /** @var \Drupal\views\Plugin\views\FieldTypeViewsDataInterface $field_type_views_data_plugin */ + if ($this->fieldTypeViewsData->hasDefinition($field_definition_type) && ($field_type_views_data_plugin = $this->fieldTypeViewsData->createInstance($field_definition_type))) { + $data[$views_field_name] = $field_type_views_data_plugin->getViewsData($field_storage_definition, $field_column_name); + } + else { + $data[$views_field_name] = $this->mapSingleFieldViewsData($table, $field_name, $field_definition_type, $field_column_name, $field_schema['columns'][$field_column_name]['type'], $first, $field_definition); + } - $table_data[$views_field_name]['entity field'] = $field_name; + $data[$views_field_name]['entity field'] = $field_name; $first = FALSE; } + + $this->moduleHandler->alter('field_type_views_data_alter', $data, $field_definition, $field_storage_definition); + + $table_data = NestedArray::mergeDeep($table_data, $data); } /** @@ -429,6 +427,13 @@ $views_field['sort']['id'] = 'standard'; break; + case 'boolean': + $views_field['field']['id'] = 'field'; + $views_field['argument']['id'] = 'numeric'; + $views_field['filter']['id'] = 'boolean'; + $views_field['sort']['id'] = 'standard'; + break; + case 'uri': // Let's render URIs as URIs by default, not links. $views_field['field']['id'] = 'field'; @@ -454,36 +459,6 @@ $views_field['sort']['id'] = 'date'; break; - case 'language': - $views_field['field']['id'] = 'field'; - $views_field['argument']['id'] = 'language'; - $views_field['filter']['id'] = 'language'; - $views_field['sort']['id'] = 'standard'; - break; - - case 'boolean': - $views_field['field']['id'] = 'field'; - $views_field['argument']['id'] = 'numeric'; - $views_field['filter']['id'] = 'boolean'; - $views_field['sort']['id'] = 'standard'; - break; - - case 'uri': - // Let's render URIs as URIs by default, not links. - $views_field['field']['id'] = 'field'; - $views_field['field']['default_formatter'] = 'string'; - - $views_field['argument']['id'] = 'string'; - $views_field['filter']['id'] = 'string'; - $views_field['sort']['id'] = 'standard'; - break; - - case 'text': - case 'text_with_summary': - // Treat these three long text fields the same. - $field_type = 'text_long'; - // Intentional fall-through here to the default processing! - default: // For most fields, the field type is generic enough to just use // the column type to determine the filters etc. @@ -536,67 +511,6 @@ } /** - * Processes the views data for a language field. - * - * @param string $table - * The table the language field is added to. - * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition - * The field definition. - * @param array $views_field - * The views field data. - * @param string $field_column_name - * The field column being processed. - */ - protected function processViewsDataForLanguage($table, FieldDefinitionInterface $field_definition, array &$views_field, $field_column_name) { - // Apply special titles for the langcode field. - if ($field_definition->getName() == $this->entityType->getKey('langcode')) { - if ($table == $this->entityType->getDataTable() || $table == $this->entityType->getRevisionDataTable()) { - $views_field['title'] = $this->t('Translation language'); - } - if ($table == $this->entityType->getBaseTable() || $table == $this->entityType->getRevisionTable()) { - $views_field['title'] = $this->t('Original language'); - } - } - } - - /** - * Processes the views data for a text field with formatting. - * - * @param string $table - * The table the field is added to. - * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition - * The field definition. - * @param array $views_field - * The views field data. - * @param string $field_column_name - * The field column being processed. - */ - protected function processViewsDataForTextLong($table, FieldDefinitionInterface $field_definition, array &$views_field, $field_column_name) { - // Connect the text field to its formatter. - if ($field_column_name == 'value') { - $views_field['field']['format'] = $field_definition->getName() . '__format'; - $views_field['field']['id'] = 'field'; - } - } - - /** - * Processes the views data for a UUID field. - * - * @param string $table - * The table the field is added to. - * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition - * The field definition. - * @param array $views_field - * The views field data. - * @param string $field_column_name - * The field column being processed. - */ - protected function processViewsDataForUuid($table, FieldDefinitionInterface $field_definition, array &$views_field, $field_column_name) { - // It does not make sense for UUID fields to be click sortable. - $views_field['field']['click sortable'] = FALSE; - } - - /** * {@inheritdoc} */ public function getViewsTableForEntityType(EntityTypeInterface $entity_type) { diff -u b/core/modules/views/src/Plugin/views/FieldTypeViewsData/Boolean.php b/core/modules/views/src/Plugin/views/FieldTypeViewsData/Boolean.php --- b/core/modules/views/src/Plugin/views/FieldTypeViewsData/Boolean.php +++ b/core/modules/views/src/Plugin/views/FieldTypeViewsData/Boolean.php @@ -3,39 +3,20 @@ namespace Drupal\views\Plugin\views\FieldTypeViewsData; -use Drupal\Core\Field\FieldStorageDefinitionInterface; -use Drupal\views\Plugin\views\FieldTypeViewsDataInterface; +use Drupal\views\FieldTypeViewsData; /** - * @Plugin( - * "id" = "boolean", + * Defines views data for fields of type "boolean". + * + * @ViewsFieldData( + * id = "boolean", + * argument = { + * "id" = "numeric", + * }, + * filter = { + * "id" = "boolean", + * } * ) */ -class Boolean implements FieldTypeViewsDataInterface { - - /** - * {@inheritdoc} - */ - public function getViewsData(FieldStorageDefinitionInterface $field_storage, $column_name) { - $views_field = []; - - // Provide a nicer, less verbose label for the first column within a field. - if ($field_storage->getMainPropertyName() == $column_name) { - $views_field['title'] = $field_storage->getLabel(); - } - else { - $views_field['title'] = $field_storage->getLabel() . " ($column_name)"; - } - - if ($description = $field_storage->getDescription()) { - $views_field['help'] = $description; - } - - $views_field['field']['id'] = 'field'; - $views_field['argument']['id'] = 'numeric'; - $views_field['filter']['id'] = 'boolean'; - $views_field['sort']['id'] = 'standard'; - - return $views_field; - } +class Boolean extends FieldTypeViewsData { } diff -u b/core/modules/views/src/Plugin/views/FieldTypeViewsData/EntityReference.php b/core/modules/views/src/Plugin/views/FieldTypeViewsData/EntityReference.php --- b/core/modules/views/src/Plugin/views/FieldTypeViewsData/EntityReference.php +++ b/core/modules/views/src/Plugin/views/FieldTypeViewsData/EntityReference.php @@ -5,17 +5,23 @@ use Drupal\Core\Entity\ContentEntityType; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Field\FieldStorageDefinitionInterface; -use Drupal\Core\Plugin\ContainerFactoryPluginInterface; -use Drupal\views\Plugin\views\FieldTypeViewsDataInterface; +use Drupal\views\FieldTypeViewsData; use Symfony\Component\DependencyInjection\ContainerInterface; - /** - * @Plugin( - * "id" = "entity_reference", + * Defines views data for fields of type "entity_reference". + * + * @ViewsFieldData( + * id = "entity_reference", + * argument = { + * "id" = "string", + * }, + * filter = { + * "id" = "string", + * } * ) */ -class EntityReference implements FieldTypeViewsDataInterface, ContainerFactoryPluginInterface { +class EntityReference extends FieldTypeViewsData { /** @var \Drupal\Core\Entity\EntityTypeManagerInterface */ protected $entityTypeManager; @@ -26,7 +32,8 @@ * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager * The entity type manager. */ - public function __construct(EntityTypeManagerInterface $entityTypeManager) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entityTypeManager) { + parent::__construct($configuration, $plugin_id, $plugin_definition); $this->entityTypeManager = $entityTypeManager; } @@ -35,6 +42,9 @@ */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static( + $configuration, + $plugin_id, + $plugin_definition, $container->get('entity_type.manager') ); } @@ -48,7 +58,7 @@ // @todo Create an optional entity field handler, that can render the // entity. // @see https://www.drupal.org/node/2322949 - $views_field = []; + $views_field = parent::getViewsData($field_storage, $column_name); /** @var \Drupal\views\EntityViewsDataInterface $views_data */ $views_data = $this->entityTypeManager->getHandler($field_storage->getTargetEntityTypeId(), 'views_data'); @@ -63,16 +73,8 @@ 'title' => $entity_type->getLabel(), 'id' => 'standard', ]; - $views_field['field']['id'] = 'field'; $views_field['argument']['id'] = 'numeric'; $views_field['filter']['id'] = 'numeric'; - $views_field['sort']['id'] = 'standard'; - } - else { - $views_field['field']['id'] = 'field'; - $views_field['argument']['id'] = 'string'; - $views_field['filter']['id'] = 'string'; - $views_field['sort']['id'] = 'standard'; } }