diff --git a/core/modules/entity_reference/entity_reference.views.inc b/core/modules/entity_reference/entity_reference.views.inc new file mode 100644 index 0000000..9d1f14f --- /dev/null +++ b/core/modules/entity_reference/entity_reference.views.inc @@ -0,0 +1,62 @@ + $table_data) { + // Add a relationship to the target entity type. + $target_type = $field->getSetting('target_type'); + $target_entity_type = $entity_manager->getDefinition($target_type); + $target_base_table = $target_entity_type->getBaseTable(); + + // Provide a relationship from field entity type to the referenced entity + // type. + $args = array( + '@label' => $target_entity_type->getLabel(), + '@field_name' => $field->getName() + ); + $data[$table_name][$field->getName()]['relationship'] = array( + 'id' => 'standard', + 'base' => $target_base_table, + 'entity type' => $target_type, + 'base field' => $target_entity_type->getKey('id'), + 'relationship field' => $field->getName() . '_target_id', + 'title' => t('@label referenced from @field_name', $args), + 'label' => t('@field_name: @label', $args), + ); + + // Provide a relationship from the referenced entity type to the field + // entity type. + $pseudo_field_name = 'reverse_' . $field->getTargetEntityTypeId() . '__' . $field->getName(); + $data[$target_base_table][$pseudo_field_name]['relationship'] = array( + 'title' => t('@label using @field_name', array( + '@label' => $target_entity_type->getLabel(), + '@field_name' => $field->getName(), + )), + 'help' => t('Relate each @label with a @field_name.', array( + '@label' => $target_entity_type->getLabel(), + '@field_name' => $field->getName(), + )), + 'id' => 'entity_reverse', + 'field_name' => $field->getName(), + 'field table' => ContentEntityDatabaseStorage::_fieldTableName($field), + 'field field' => $field->getName() . '_target_id', + 'base' => $target_entity_type->getBaseTable(), + 'base field' => $target_entity_type->getKey('id'), + 'label' => t('@field_name', array('@field_name' => $field->getName())), + ); + } + + return $data; +} diff --git a/core/modules/entity_reference/src/Tests/Views/EntityReferenceRelationshipTest.php b/core/modules/entity_reference/src/Tests/Views/EntityReferenceRelationshipTest.php new file mode 100644 index 0000000..320da76 --- /dev/null +++ b/core/modules/entity_reference/src/Tests/Views/EntityReferenceRelationshipTest.php @@ -0,0 +1,145 @@ + 'Entity Reference: Relationship handler', + 'description' => 'Tests entity reference relationship handler.', + 'group' => 'Views module integration', + ); + } + + protected function setUp() { + parent::setUp(); + + ViewTestData::createTestViews(get_class($this), array('entity_reference_test_views')); + + $field = FieldConfig::create(array( + 'settings' => array( + 'target_type' => 'entity_test', + ), + 'entity_type' => 'entity_test', + 'name' => 'field_test', + 'type' => 'entity_reference', + 'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, + )); + $field->save(); + + $instance = FieldInstanceConfig::create(array( + 'entity_type' => 'entity_test', + 'field_name' => 'field_test', + 'bundle' => 'entity_test', + 'settings' => array( + 'handler' => 'default', + 'handler_settings' => array(), + ), + )); + $instance->save(); + + // Create some test entities which link each other. + $entity_storage= \Drupal::entityManager()->getStorage('entity_test'); + $entity_0 = $entity_storage->create(array()); + // @todo Add a value in order to avoid: "Column 'field_test_target_id' + // cannot be null". + //$entity_0->field_test->target_id = 1000; + $entity_0->save(); + $this->entities[$entity_0->id()] = $entity_0; + + $entity = $entity_storage->create(array()); + $entity->field_test->target_id = $entity_0->id(); + $entity->save(); + $this->entities[$entity->id()] = $entity; + + $entity = $entity_storage->create(array('field_test' => $entity->id())); + $entity->field_test->target_id = $entity_0->id(); + $entity->save(); + $this->entities[$entity->id()] = $entity; + } + + /** + * Tests using the views relationship. + */ + public function testRelationship() { + // Check just the generated views data. + $views_data_field_test = $this->container->get('views.views_data')->get('entity_test__field_test'); + $this->assertEqual($views_data_field_test['field_test']['relationship']['id'], 'standard'); + $this->assertEqual($views_data_field_test['field_test']['relationship']['base'], 'entity_test'); + $this->assertEqual($views_data_field_test['field_test']['relationship']['base field'], 'id'); + $this->assertEqual($views_data_field_test['field_test']['relationship']['relationship field'], 'field_test_target_id'); + + // Check the backwards reference. + $views_data_entity_test = $this->container->get('views.views_data')->get('entity_test'); + $this->assertEqual($views_data_entity_test['reverse_entity_test__field_test']['relationship']['id'], 'entity_reverse'); + $this->assertEqual($views_data_entity_test['reverse_entity_test__field_test']['relationship']['base'], 'entity_test'); + $this->assertEqual($views_data_entity_test['reverse_entity_test__field_test']['relationship']['base field'], 'id'); + $this->assertEqual($views_data_entity_test['reverse_entity_test__field_test']['relationship']['field table'], 'entity_test__field_test'); + $this->assertEqual($views_data_entity_test['reverse_entity_test__field_test']['relationship']['field field'], 'field_test_target_id'); + + + // Check an actually test view. + $view = Views::getView('test_entity_reference_view'); + $this->executeView($view, 'default'); + $view->initStyle(); + + foreach (array_keys($view->result) as $index) { + // Just check that the actual ID of the entity is the expected one. + $this->assertEqual($view->style_plugin->getField($index, 'id'), $this->entities[$index + 1]->id()); + // Test the forward relationship. + // The second and third entity refer to the first one. + $this->assertEqual($view->style_plugin->getField($index, 'id_1'), $index == 0 ? 0 : 1); + } + + $view->destroy(); + $this->executeView($view, 'embed_1'); + $view->initStyle(); + + foreach (array_keys($view->result) as $index) { + $this->assertEqual($view->style_plugin->getField($index, 'id'), $this->entities[$index + 1]->id()); + // The second and third entity refer to the first one. + $this->assertEqual($view->style_plugin->getField($index, 'id_1'), $index == 0 ? 0 : 1); + } + } + +} diff --git a/core/modules/entity_reference/tests/modules/entity_reference_test_views/entity_reference_test_views.info.yml b/core/modules/entity_reference/tests/modules/entity_reference_test_views/entity_reference_test_views.info.yml new file mode 100644 index 0000000..04fb33b --- /dev/null +++ b/core/modules/entity_reference/tests/modules/entity_reference_test_views/entity_reference_test_views.info.yml @@ -0,0 +1,9 @@ +name: 'Entity reference test views' +type: module +description: 'Provides default views for views entity reference tests.' +package: Testing +version: VERSION +core: 8.x +dependencies: + - entity_reference + - views diff --git a/core/modules/entity_reference/tests/modules/entity_reference_test_views/test_views/views.view.test_entity_reference_view.yml b/core/modules/entity_reference/tests/modules/entity_reference_test_views/test_views/views.view.test_entity_reference_view.yml new file mode 100644 index 0000000..549e91d --- /dev/null +++ b/core/modules/entity_reference/tests/modules/entity_reference_test_views/test_views/views.view.test_entity_reference_view.yml @@ -0,0 +1,68 @@ +base_table: entity_test +core: '8' +description: '' +status: '1' +display: + default: + display_options: + defaults: + fields: '0' + relationships: '0' + pager: '0' + pager_options: '0' + sorts: '0' + fields: + id: + field: id + id: id + relationship: none + table: entity_test + plugin_id: numeric + id_1: + field: id + id: id_1 + order: ASC + relationship: test_relationship + table: entity_test + plugin_id: numeric + pager: + options: + offset: '0' + type: none + pager_options: { } + sorts: + id: + field: id + id: id + order: ASC + relationship: none + table: entity_test + plugin_id: standard + relationships: + test_relationship: + id: field_test + table: entity_test__field_test + field: field_test + relationship: none + plugin_id: standard + display_plugin: default + display_title: Master + id: default + position: '0' + embed_1: + display_options: + defaults: + relationships: '0' + relationships: + test_relationship: + id: reverse_field_test + table: entity_test + field: reverse_field_test + relationship: none + plugin_id: standard + display_plugin: embed + display_title: Embed + id: embed_1 +human_name: '' +id: test_entity_reference_view +tag: ''