diff --git a/core/modules/views/src/EntityViewsData.php b/core/modules/views/src/EntityViewsData.php index 649cbb8..9a86f77 100644 --- a/core/modules/views/src/EntityViewsData.php +++ b/core/modules/views/src/EntityViewsData.php @@ -7,6 +7,8 @@ namespace Drupal\views; +use Drupal\Core\Entity\ContentEntityInterface; +use Drupal\Core\Entity\ContentEntityType; use Drupal\Core\Entity\EntityHandlerInterface; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Entity\EntityTypeInterface; @@ -330,24 +332,13 @@ protected function mapSingleFieldViewsData($table, $field_name, $data_type, $sch $views_field['sort']['id'] = 'date'; break; case 'entity_reference': - // @todo No idea to determine how to find out whether the field is a number/string ID. // @todo Should the actual field handler respect that this is just renders a number // @todo Create an optional entity field handler, that can render the // entity. - $views_field['field']['id'] = 'numeric'; - $views_field['argument']['id'] = 'numeric'; - $views_field['filter']['id'] = 'numeric'; + $views_field['field']['id'] = 'standard'; + $views_field['argument']['id'] = 'standard'; + $views_field['filter']['id'] = 'standard'; $views_field['sort']['id'] = 'standard'; - if ($entity_type_id = $field_definition->getItemDefinition()->getSetting('target_type')) { - $entity_type = $this->entityManager->getDefinition($entity_type_id); - $views_field['relationship'] = [ - 'base' => $this->getViewsTableForEntityType($entity_type), - 'base field' => $entity_type->getKey('id'), - 'label' => $entity_type->getLabel(), - 'title' => $entity_type->getLabel(), - 'id' => 'standard', - ]; - } break; case 'uri': $views_field['field']['id'] = 'standard'; @@ -364,7 +355,7 @@ protected function mapSingleFieldViewsData($table, $field_name, $data_type, $sch $process_method = 'processViewsDataFor' . Container::camelize($data_type); if (method_exists($this, $process_method)) { - $this->{$process_method}($table, $field_name, $views_field); + $this->{$process_method}($table, $field_name, $field_definition, $views_field); } return $views_field; @@ -380,7 +371,7 @@ protected function mapSingleFieldViewsData($table, $field_name, $data_type, $sch * @param array $views_field * The views field data. */ - protected function processViewsDataForLanguage($table, $field_name, array &$views_field) { + protected function processViewsDataForLanguage($table, $field_name, FieldDefinitionInterface $field_definition, array &$views_field) { // Apply special titles for the langcode field. if ($field_name == 'langcode') { if ($table == $this->entityType->getDataTable() || $table == $this->entityType->getBaseTable()) { @@ -393,7 +384,7 @@ protected function processViewsDataForLanguage($table, $field_name, array &$view } /** - * Processes the views data for a language field. + * Processes the views data for an entity reference field. * * @param string $table * The table the language field is added to. @@ -402,7 +393,30 @@ protected function processViewsDataForLanguage($table, $field_name, array &$view * @param array $views_field * The views field data. */ - protected function processViewsDataForEntityReference($table, $field_name, array &$views_field) { + protected function processViewsDataForEntityReference($table, $field_name, FieldDefinitionInterface $field_definition, array &$views_field) { + if ($entity_type_id = $field_definition->getItemDefinition()->getSetting('target_type')) { + $entity_type = $this->entityManager->getDefinition($entity_type_id); + if ($entity_type instanceof ContentEntityType) { + $views_field['relationship'] = [ + 'base' => $this->getViewsTableForEntityType($entity_type), + 'base field' => $entity_type->getKey('id'), + 'label' => $entity_type->getLabel(), + 'title' => $entity_type->getLabel(), + 'id' => 'standard', + ]; + $views_field['field']['id'] = 'numeric'; + $views_field['argument']['id'] = 'numeric'; + $views_field['filter']['id'] = 'numeric'; + $views_field['sort']['id'] = 'standard'; + } + else { + $views_field['field']['id'] = 'standard'; + $views_field['argument']['id'] = 'string'; + $views_field['filter']['id'] = 'string'; + $views_field['sort']['id'] = 'standard'; + } + } + if ($field_name == $this->entityType->getKey('bundle')) { // @todo Use the other bundle handlers, once // https://www.drupal.org/node/2322949 is in. diff --git a/core/modules/views/tests/Drupal/views/Tests/EntityViewsDataTest.php b/core/modules/views/tests/Drupal/views/Tests/EntityViewsDataTest.php index 0d1fd0e..4d6c8c8 100644 --- a/core/modules/views/tests/Drupal/views/Tests/EntityViewsDataTest.php +++ b/core/modules/views/tests/Drupal/views/Tests/EntityViewsDataTest.php @@ -7,9 +7,11 @@ namespace Drupal\views\Tests { +use Drupal\Core\Config\Entity\ConfigEntityType; use Drupal\Core\Entity\ContentEntityType; use Drupal\Core\Entity\EntityType; use Drupal\Core\Entity\EntityTypeInterface; +use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem; use Drupal\Core\Field\Plugin\Field\FieldType\IntegerItem; use Drupal\Core\Field\Plugin\Field\FieldType\LanguageItem; @@ -310,6 +312,19 @@ public function testDataTableFields() { ->setKey('bundle', 'type') ; $base_field_definitions = EntityTestMul::baseFieldDefinitions($this->baseEntityType); + $base_field_definitions['type'] = BaseFieldDefinition::create('entity_reference') + ->setLabel('entity test type') + ->setSettings(array('target_type' => 'entity_test_bundle')) + ->setTranslatable(TRUE); + $entity_test_type = new ConfigEntityType(['id' => 'entity_test_bundle']); + $user_entity_type = new ContentEntityType(['id' => 'user', 'base_table' => 'users', 'entity_keys' => ['id' => 'uid']]); + $this->entityManager->expects($this->any()) + ->method('getDefinition') + ->willReturnMap([ + ['entity_test_bundle', TRUE, $entity_test_type], + ['user', TRUE, $user_entity_type], + ]); + $this->entityManager->expects($this->once()) ->method('getBaseFieldDefinitions') ->with('entity_test_mul') @@ -356,7 +371,10 @@ public function testDataTableFields() { // Check the base fields. $this->assertNumericField($data['entity_test_mul']['id']); $this->assertUuidField($data['entity_test_mul']['uuid']); + $this->assertBundleField($data['entity_test_mul']['type']); + $this->assertFalse(isset($data['entity_test_mul']['type']['relationship'])); + $this->assertLanguageField($data['entity_test_mul']['langcode']); // Also ensure that field_data only fields don't appear on the base table. $this->assertFalse(isset($data['entity_test_mul']['name']));