diff --git a/dynamic_entity_reference.views.inc b/dynamic_entity_reference.views.inc index 45b5634..2501387 100644 --- a/dynamic_entity_reference.views.inc +++ b/dynamic_entity_reference.views.inc @@ -14,38 +14,53 @@ function dynamic_entity_reference_field_views_data(FieldStorageConfigInterface $ $data = field_views_field_default_views_data($field_storage); $entity_manager = \Drupal::entityManager(); $labels = $entity_manager->getEntityTypeLabels(TRUE); - $options = $labels['Content']; - $entity_type_ids = $field_storage->getSetting('entity_type_ids'); - if ($field_storage->getSetting('exclude_entity_types')) { - $target_entity_type_ids = array_diff_key($options, $entity_type_ids ?: array()); + $options = array_keys($labels['Content']); + $settings = $field_storage->getSettings(); + if ($settings['exclude_entity_types']) { + $target_entity_type_ids = array_diff($options, $settings['entity_type_ids'] ?: array()); } else { - $target_entity_type_ids = array_intersect_key($options, $entity_type_ids ?: array()); + $target_entity_type_ids = array_intersect($options, $settings['entity_type_ids'] ?: array()); } foreach ($data as $table_name => $table_data) { // Add a relationship to the target entity types. - foreach (array_keys($target_entity_type_ids) as $target_entity_type_id) { + foreach ($target_entity_type_ids as $target_entity_type_id) { $target_entity_type = $entity_manager->getDefinition($target_entity_type_id); + $entity_type_id = $field_storage->getTargetEntityTypeId(); + $entity_type = $entity_manager->getDefinition($entity_type_id); $target_base_table = $target_entity_type->getBaseTable(); + // Provide a relationship for the entity type with the dynamic entity // reference field. $args = array( '@label' => $target_entity_type->getLabel(), '@field_name' => $field_storage->getName(), ); - $data[$table_name][$field_storage->getName()]['relationship'] = array( + $data[$table_name][$target_entity_type_id . '__' . $field_storage->getName()]['relationship'] = array( 'id' => 'standard', 'base' => $target_base_table, 'entity type' => $target_entity_type_id, 'base field' => $target_entity_type->getKey('id'), 'relationship field' => $field_storage->getName() . '_target_id', + // \Drupal\views\Plugin\views\join\Standard only supports the + // 'left_field' to 'field' in 'extra' join condition but we need + // 'left_field' to 'value' in 'extra' join condition to add the + // target_type property to the join. +// 'join_id' => 'standard_extra', + 'extra' => array( + 0 => array( + 'left_field' => $field_storage->getName() . '_target_type', + 'value' => $target_entity_type_id, + ), + ), 'title' => t('@label referenced from @field_name', $args), 'label' => t('@field_name: @label', $args), + 'group' => $entity_type->getLabel(), + 'help' => t('Appears in: @bundles.', array('@bundles' => implode(', ', $field_storage->getBundles()))), ); // Provide a reverse relationship for the entity type that is referenced // by the field. - $entity_type_id = $field_storage->getTargetEntityTypeId(); $pseudo_field_name = 'reverse__' . $entity_type_id . '__' . $field_storage->getName(); /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */ $table_mapping = $entity_manager->getStorage($entity_type_id)->getTableMapping(); @@ -58,7 +73,19 @@ function dynamic_entity_reference_field_views_data(FieldStorageConfigInterface $ 'field field' => $field_storage->getName() . '_target_id', 'base' => $target_base_table, 'base field' => $target_entity_type->getKey('id'), + // \Drupal\views\Plugin\views\join\Standard only supports the + // 'left_field' to 'field' in 'extra' join condition but we need + // 'left_field' to 'value' in 'extra' join condition to add the + // target_type property to the join. +// 'join_id' => 'standard_extra', + 'join_extra' => array( + 0 => array( + 'field' => $field_storage->getName() . '_target_type', + 'value' => $target_entity_type_id, + ), + ), 'label' => t('@field_name', array('@field_name' => $field_storage->getName())), + 'group' => $target_entity_type->getLabel(), ); } } diff --git a/src/Tests/Views/DynamicEntityReferenceRelationshipTest.php b/src/Tests/Views/DynamicEntityReferenceRelationshipTest.php index 4316039..bbace68 100644 --- a/src/Tests/Views/DynamicEntityReferenceRelationshipTest.php +++ b/src/Tests/Views/DynamicEntityReferenceRelationshipTest.php @@ -8,6 +8,7 @@ namespace Drupal\dynamic_entity_reference\Tests\Views; use Drupal\Core\Field\FieldStorageDefinitionInterface; +use Drupal\entity_test\Entity\EntityTest; use Drupal\field\Entity\FieldStorageConfig; use Drupal\field\Entity\FieldConfig; use Drupal\views\Tests\ViewTestData; @@ -34,7 +35,7 @@ class DynamicEntityReferenceRelationshipTest extends ViewUnitTestBase { * * @var array */ - public static $modules = array('user', 'field', 'entity_test', 'options', 'entity_reference', 'dynamic_entity_reference', 'views', 'dynamic_entity_reference_test_views'); + public static $modules = array('user', 'field', 'entity_test', 'options', 'entity_reference', 'dynamic_entity_reference', 'dynamic_entity_reference_test_views'); /** * The entity_test entities used by the test. @@ -75,22 +76,23 @@ class DynamicEntityReferenceRelationshipTest extends ViewUnitTestBase { $field->save(); // Create some test entities which link each other. - $entity_storage= \Drupal::entityManager()->getStorage('entity_test'); - $referenced_entity = $entity_storage->create(array()); + $referenced_entity = EntityTest::create(); $referenced_entity->save(); $this->entities[$referenced_entity->id()] = $referenced_entity; - $entity = $entity_storage->create(array()); + $entity = EntityTest::create(); $entity->field_test->entity = $referenced_entity; $entity->save(); $this->assertEqual($entity->field_test[0]->entity->id(), $referenced_entity->id()); $this->entities[$entity->id()] = $entity; - $entity = $entity_storage->create(array()); + $entity = EntityTest::create(); $entity->field_test->entity = $referenced_entity; $entity->save(); $this->assertEqual($entity->field_test[0]->entity->id(), $referenced_entity->id()); $this->entities[$entity->id()] = $entity; + + Views::viewsData()->clear(); } /** @@ -99,10 +101,12 @@ class DynamicEntityReferenceRelationshipTest extends ViewUnitTestBase { public function testRelationship() { // Check just the generated views data. $views_data_field_test = Views::viewsData()->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'); + $this->assertEqual($views_data_field_test['entity_test__field_test']['relationship']['id'], 'standard'); + $this->assertEqual($views_data_field_test['entity_test__field_test']['relationship']['base'], 'entity_test'); + $this->assertEqual($views_data_field_test['entity_test__field_test']['relationship']['base field'], 'id'); + $this->assertEqual($views_data_field_test['entity_test__field_test']['relationship']['relationship field'], 'field_test_target_id'); + $this->assertEqual($views_data_field_test['entity_test__field_test']['relationship']['extra'][0]['left_field'], 'field_test_target_type'); + $this->assertEqual($views_data_field_test['entity_test__field_test']['relationship']['extra'][0]['value'], 'entity_test'); // Check the backwards reference. $views_data_entity_test = Views::viewsData()->get('entity_test'); @@ -111,6 +115,8 @@ class DynamicEntityReferenceRelationshipTest extends ViewUnitTestBase { $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'); + $this->assertEqual($views_data_entity_test['reverse__entity_test__field_test']['relationship']['join_extra'][0]['field'], 'field_test_target_type'); + $this->assertEqual($views_data_entity_test['reverse__entity_test__field_test']['relationship']['join_extra'][0]['value'], 'entity_test'); // Check an actual test view. diff --git a/tests/modules/dynamic_entity_reference_test_views/test_views/views.view.test_dynamic_entity_reference_view.yml b/tests/modules/dynamic_entity_reference_test_views/test_views/views.view.test_dynamic_entity_reference_view.yml index ab67472..9789d85 100644 --- a/tests/modules/dynamic_entity_reference_test_views/test_views/views.view.test_dynamic_entity_reference_view.yml +++ b/tests/modules/dynamic_entity_reference_test_views/test_views/views.view.test_dynamic_entity_reference_view.yml @@ -1,16 +1,26 @@ +langcode: und +status: true +dependencies: + module: + - entity_test + - field +id: test_dynamic_entity_reference_view +label: null +module: views +description: '' +tag: '' base_table: entity_test +base_field: id core: '8' -description: '' -status: '1' display: default: display_options: defaults: - fields: '0' - relationships: '0' - pager: '0' - pager_options: '0' - sorts: '0' + fields: false + relationships: false + pager: false + pager_options: false + sorts: false fields: id: field: id @@ -27,7 +37,7 @@ display: plugin_id: numeric pager: options: - offset: '0' + offset: 0 type: none pager_options: { } sorts: @@ -42,27 +52,32 @@ display: test_relationship: id: field_test table: entity_test__field_test - field: field_test + field: entity_test__field_test relationship: none plugin_id: standard + field_langcode: '***LANGUAGE_language_content***' + field_langcode_add_to_query: null display_plugin: default display_title: Master id: default - position: '0' + position: 0 embed_1: display_options: defaults: - relationships: '0' + relationships: false relationships: test_relationship: - id: reverse_field_test + id: field_test table: entity_test - field: reverse_field_test + field: reverse__entity_test__field_test relationship: none - plugin_id: standard + group_type: group + admin_label: field_test + required: false + plugin_id: entity_reverse + field_langcode: '***LANGUAGE_language_content***' + field_langcode_add_to_query: null display_plugin: embed display_title: Embed id: embed_1 -human_name: '' -id: test_dynamic_entity_reference_view -tag: '' + position: null