diff --git a/core/modules/views/src/Plugin/views/field/Field.php b/core/modules/views/src/Plugin/views/field/Field.php index 997ce54..6fb5603 100644 --- a/core/modules/views/src/Plugin/views/field/Field.php +++ b/core/modules/views/src/Plugin/views/field/Field.php @@ -802,7 +802,16 @@ protected function getEntityFieldRenderer() { * An array of items for the field. */ public function getItems(ResultRow $values) { - $build_list = $this->getEntityFieldRenderer()->render($values, $this); + if (!$this->displayHandler->useGroupBy()) { + $build_list = $this->getEntityFieldRenderer()->render($values, $this); + } + else { + // For grouped results use the process entity functionality, as this + // allows us to ensure that grouped by values, especially with multiple + // cardinality works, see + // \Drupal\views\Tests\QueryGroupByTest::testGroupByFieldWithCardinality + $build_list = $this->processEntity($values, $this->getEntity($values))->{$this->definition['field_name']}->view(); + } if (!$build_list) { return []; diff --git a/core/modules/views/src/Tests/QueryGroupByTest.php b/core/modules/views/src/Tests/QueryGroupByTest.php index b580e0a..c82aa6c 100644 --- a/core/modules/views/src/Tests/QueryGroupByTest.php +++ b/core/modules/views/src/Tests/QueryGroupByTest.php @@ -7,6 +7,9 @@ namespace Drupal\views\Tests; +use Drupal\entity_test\Entity\EntityTest; +use Drupal\field\Entity\FieldConfig; +use Drupal\field\Entity\FieldStorageConfig; use Drupal\views\Views; /** @@ -21,7 +24,7 @@ class QueryGroupByTest extends ViewUnitTestBase { * * @var array */ - public static $testViews = array('test_group_by_in_filters', 'test_aggregate_count', 'test_group_by_count'); + public static $testViews = array('test_group_by_in_filters', 'test_aggregate_count', 'test_group_by_count', 'test_group_by_count_multicardinality'); /** * Modules to enable. @@ -205,4 +208,71 @@ public function testGroupByBaseField() { $this->assertTrue(strpos($view->build_info['query'], 'GROUP BY entity_test.id'), 'GROUP BY field includes the base table name when grouping on the base field.'); } + /** + * Tests grouping a field with cardinality > 1. + */ + public function testGroupByFieldWithCardinality() { + $field_storage = FieldStorageConfig::create([ + 'type' => 'integer', + 'field_name' => 'field_test', + 'cardinality' => 4, + 'entity_type' => 'entity_test', + ]); + $field_storage->save(); + $field = FieldConfig::create([ + 'field_name' => 'field_test', + 'entity_type' => 'entity_test', + 'bundle' => 'entity_test', + ]); + $field->save(); + + $entities = []; + $entity = EntityTest::create([ + 'field_test' => [1, 1, 1], + ]); + $entity->save(); + $entities[] = $entity; + + $entity = EntityTest::create([ + 'field_test' => [2, 2, 2], + ]); + $entity->save(); + $entities[] = $entity; + + $entity = EntityTest::create([ + 'field_test' => [2, 2, 2], + ]); + $entity->save(); + $entities[] = $entity; + + $view = Views::getView('test_group_by_count_multicardinality'); + $this->executeView($view); + $this->assertEqual(2, count($view->result)); + + $this->assertEqual(3, $view->getStyle()->getField(0, 'id')); + $this->assertEqual('1', $view->getStyle()->getField(0, 'field_test')); + $this->assertEqual(6, $view->getStyle()->getField(1, 'id')); + $this->assertEqual('2', $view->getStyle()->getField(1, 'field_test')); + + $entities[2]->field_test[0]->value = 3; + $entities[2]->field_test[1]->value = 4; + $entities[2]->field_test[2]->value = 5; + $entities[2]->save(); + + $view = Views::getView('test_group_by_count_multicardinality'); + $this->executeView($view); + $this->assertEqual(5, count($view->result)); + + $this->assertEqual(3, $view->getStyle()->getField(0, 'id')); + $this->assertEqual('1', $view->getStyle()->getField(0, 'field_test')); + $this->assertEqual(3, $view->getStyle()->getField(1, 'id')); + $this->assertEqual('2', $view->getStyle()->getField(1, 'field_test')); + $this->assertEqual(1, $view->getStyle()->getField(2, 'id')); + $this->assertEqual('3', $view->getStyle()->getField(2, 'field_test')); + $this->assertEqual(1, $view->getStyle()->getField(3, 'id')); + $this->assertEqual('4', $view->getStyle()->getField(3, 'field_test')); + $this->assertEqual(1, $view->getStyle()->getField(4, 'id')); + $this->assertEqual('5', $view->getStyle()->getField(4, 'field_test')); + } + }