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..aa27ef3 --- /dev/null +++ b/core/modules/entity_reference/entity_reference.views.inc @@ -0,0 +1,63 @@ + $table_data) { + // Add a relationship to the target entity type. + $target_type = $field->settings['target_type']; + $target_entity_info = $entity_manager->getDefinition($target_type); + $target_base_table = $target_entity_info->getBaseTable(); + + // Provide a relationship from field entity type to the referenced entity + // type. + $args = array( + '@label' => $target_entity_info->getLabel(), + '@field_name' => $field->name + ); + $data[$table_name][$field->name]['relationship'] = array( + 'id' => 'standard', + 'base' => $target_base_table, + 'entity type' => $target_type, + 'base field' => $target_entity_info->getKey('id'), + 'relationship field' => $field->name . '_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->name; + $data[$target_base_table][$pseudo_field_name]['relationship'] = array( + 'title' => t('@label using @field_name', array( + '@label' => $target_entity_info->getLabel(), + '@field_name' => $field->name + )), + 'help' => t('Relate each @label with a @field_name.', array( + '@label' => $target_entity_info->getLabel(), + '@field_name' => $field->name + )), + 'id' => 'entity_reverse', + 'field_name' => $field->name, + 'field table' => FieldableDatabaseStorageController::_fieldTableName($field), + 'field field' => $field->name . '_target_id', + 'base' => $target_entity_info->getBaseTable(), + 'base field' => $target_entity_info->getKey('id'), + 'label' => t('@field_name', array('@field_name' => $field->name)), + ); + } + + return $data; +} diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/Views/EntityReferenceRelationshipTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/Views/EntityReferenceRelationshipTest.php new file mode 100644 index 0000000..52a61af --- /dev/null +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/Views/EntityReferenceRelationshipTest.php @@ -0,0 +1,147 @@ + 'Entity Reference: Relationship handler', + 'description' => 'Tests entity reference relationship handler.', + 'group' => 'Views module integration', + ); + } + + protected function setUp() { + parent::setUp(); + + ViewTestData::importTestViews(get_class($this), array('entity_reference_test_views')); + + $field = array( + 'translatable' => FALSE, + 'entity_types' => array(), + 'settings' => array( + 'target_type' => 'entity_test', + ), + 'field_name' => 'field_test', + 'type' => 'entity_reference', + 'cardinality' => FIELD_CARDINALITY_UNLIMITED, + ); + + field_create_field($field); + + $instance = array( + 'entity_type' => 'entity_test', + 'field_name' => 'field_test', + 'bundle' => 'entity_test', + 'widget' => array( + 'type' => 'options_select', + ), + 'settings' => array( + 'handler' => 'default', + 'handler_settings' => array(), + ), + ); + field_create_instance($instance); + + // Create some test entities which link each other. + $storage_controller= $this->container->get('plugin.manager.entity')->getStorageController('entity_test'); + $entity_0 = $storage_controller->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 = $storage_controller->create(array()); + $entity->field_test->target_id = $entity_0->id(); + $entity->save(); + $this->entities[$entity->id()] = $entity; + + $entity = $storage_controller->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('field_data_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_field_test']['relationship']['id'], 'entity_reverse'); + $this->assertEqual($views_data_entity_test['reverse_field_test']['relationship']['base'], 'entity_test'); + $this->assertEqual($views_data_entity_test['reverse_field_test']['relationship']['base field'], 'id'); + $this->assertEqual($views_data_entity_test['reverse_field_test']['relationship']['field table'], 'field_data_field_test'); + $this->assertEqual($views_data_entity_test['reverse_field_test']['relationship']['field field'], 'field_test_target_id'); + + + // Check an actually test view. + $view = views_get_view('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->get_field($index, 'id'), $this->entities[$index + 1]->id()); + // Test the foward relationsnip. + // The second and third entity refer to the first one. + $this->assertEqual($view->style_plugin->get_field($index, 'id_1'), $index == 0 ? 0 : 1); + } + + $view->destroy(); + $this->executeView($view, 'embed_1'); + $view->initStyle(); + + foreach (array_keys($view->result) as $index) { + debug($view->style_plugin->get_field($index, 'id')); + debug($view->style_plugin->get_field($index, 'id_1')); +// $this->assertEqual($view->style_plugin->get_field($index, 'id'), $this->entities[$index + 1]->id()); +// The second and third entity refer to the first one. +// $this->assertEqual($view->style_plugin->get_field($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..529ed2d --- /dev/null +++ b/core/modules/entity_reference/tests/modules/entity_reference_test_views/entity_reference_test_views.info.yml @@ -0,0 +1,10 @@ +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 +hidden: TRUE diff --git a/core/modules/entity_reference/tests/modules/entity_reference_test_views/entity_reference_test_views.module b/core/modules/entity_reference/tests/modules/entity_reference_test_views/entity_reference_test_views.module new file mode 100644 index 0000000..b3d9bbc --- /dev/null +++ b/core/modules/entity_reference/tests/modules/entity_reference_test_views/entity_reference_test_views.module @@ -0,0 +1 @@ +