Commit 3aba956a authored by alexpott's avatar alexpott

Issue #2666166 by jsst, Lendude, Andrej Galuf: View with not required...

Issue #2666166 by jsst, Lendude, Andrej Galuf: View with not required relationship and aggregation enabled fails to execute
parent 772edb3b
......@@ -3,6 +3,7 @@
namespace Drupal\Tests\field\Kernel\EntityReference\Views;
use Drupal\entity_test\Entity\EntityTestMulChanged;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\field\Tests\EntityReference\EntityReferenceTestTrait;
use Drupal\entity_test\Entity\EntityTest;
use Drupal\entity_test\Entity\EntityTestMul;
......@@ -32,6 +33,7 @@ class EntityReferenceRelationshipTest extends ViewsKernelTestBase {
'test_entity_reference_reverse_entity_test_view',
'test_entity_reference_entity_test_mul_view',
'test_entity_reference_reverse_entity_test_mul_view',
'test_entity_reference_group_by_empty_relationships',
);
/**
......@@ -71,6 +73,9 @@ protected function setUp($import_test_views = TRUE) {
// @see \Drupal\Core\Entity\Sql\DefaultTableMapping::generateFieldTableName()
$this->createEntityReferenceField('entity_test_mul_changed', 'entity_test_mul_changed', 'field_test_data_with_a_long_name', 'field_test_data_with_a_long_name', 'entity_test');
// Create reference from entity_test_mul to entity_test cardinality: infinite.
$this->createEntityReferenceField('entity_test_mul', 'entity_test_mul', 'field_data_test_unlimited', 'field_data_test_unlimited', 'entity_test', 'default', array(), FieldStorageConfig::CARDINALITY_UNLIMITED);
ViewTestData::createTestViews(get_class($this), array('entity_reference_test_views'));
}
......@@ -276,4 +281,56 @@ public function testDataTableRelationshipWithLongFieldName() {
}
}
/**
* Tests group by with optional and empty relationship.
*/
public function testGroupByWithEmptyRelationships() {
$entities = [];
// Create 4 entities with name1 and 3 entities with name2.
for ($i = 1; $i <= 4; $i++) {
$entity = [
'name' => 'name' . $i,
];
$entity = EntityTest::create($entity);
$entities[] = $entity;
$entity->save();
}
$entity = EntityTestMul::create([
'name' => 'name1',
]);
$entity->field_data_test_unlimited = [
['target_id' => $entities[0]->id()],
['target_id' => $entities[1]->id()],
['target_id' => $entities[2]->id()],
];
$entity->save();
$entity = EntityTestMul::create([
'name' => 'name2',
]);
$entity->field_data_test_unlimited = [
['target_id' => $entities[0]->id()],
['target_id' => $entities[1]->id()],
];
$entity->save();
$entity = EntityTestMul::create([
'name' => 'name3',
]);
$entity->field_data_test_unlimited->target_id = $entities[0]->id();
$entity->save();
$view = Views::getView('test_entity_reference_group_by_empty_relationships');
$this->executeView($view);
$this->assertCount(4, $view->result);
// First three results should contain a reference from EntityTestMul.
$this->assertNotEmpty($view->getStyle()->getField(0, 'name_2'));
$this->assertNotEmpty($view->getStyle()->getField(1, 'name_2'));
$this->assertNotEmpty($view->getStyle()->getField(2, 'name_2'));
// Fourth result has no reference from EntityTestMul hence the output for
// should be empty.
$this->assertEqual('', $view->getStyle()->getField(3, 'name_2'));
}
}
langcode: en
status: true
dependencies: { }
id: test_entity_reference_group_by_empty_relationships
label: ''
module: views
description: ''
tag: ''
base_table: entity_test
base_field: id
core: '8'
display:
default:
display_options:
access:
type: none
cache:
type: tag
exposed_form:
type: basic
query:
type: views_query
options:
disable_sql_rewrite: false
distinct: false
replica: false
query_comment: ''
query_tags: { }
fields:
name_1:
id: name_1
table: entity_test
field: name
entity_type: entity_test
entity_field: name
plugin_id: field
relationship: none
group_type: group
group_column: value
group_columns: { }
group_rows: true
exclude: false
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
name_2:
id: name_2
table: entity_test_mul_property_data
field: name
entity_type: entity_test_mul
entity_field: name
plugin_id: field
relationship: reverse__entity_test_mul__field_data_test_unlimited
group_type: group
group_column: entity_id
group_columns: { }
group_rows: false
exclude: false
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
sorts:
name:
table: entity_test
field: name
id: name
entity_type: entity_test
entity_field: field_test
order: ASC
plugin_id: standard
pager:
type: some
style:
type: table
options:
grouping: { }
row_class: ''
default_row_class: true
override: true
sticky: false
caption: ''
summary: ''
description: ''
columns:
name_1: name_1
name_2: name_2
info:
name_1:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: ''
name_2:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: ''
default: '-1'
empty_table: false
row:
type: fields
options:
inline: { }
separator: ''
hide_empty: false
default_field_elements: true
relationships:
reverse__entity_test_mul__field_data_test_unlimited:
id: reverse__entity_test_mul__field_data_test_unlimited
table: entity_test
field: reverse__entity_test_mul__field_data_test_unlimited
entity_type: entity_test
plugin_id: entity_reverse
group_type: group
required: false
group_by: true
display_plugin: block
display_title: Master
id: default
position: 0
......@@ -818,10 +818,17 @@ public function getItems(ResultRow $values) {
'settings' => $this->options['settings'],
'label' => 'hidden',
];
// Some bundles might not have a specific field, in which case the faked
// entity doesn't have it either.
$entity = $this->createEntityForGroupBy($this->getEntity($values), $values);
$build_list = isset($entity->{$this->definition['field_name']}) ? $entity->{$this->definition['field_name']}->view($display) : NULL;
// Optional relationships may not provide an entity at all. So we can't
// use createEntityForGroupBy() for those rows.
if ($entity = $this->getEntity($values)) {
$entity = $this->createEntityForGroupBy($entity, $values);
// Some bundles might not have a specific field, in which case the faked
// entity doesn't have it either.
$build_list = isset($entity->{$this->definition['field_name']}) ? $entity->{$this->definition['field_name']}->view($display) : NULL;
}
else {
$build_list = NULL;
}
}
if (!$build_list) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment