diff --git a/core/modules/views/src/Plugin/views/field/Field.php b/core/modules/views/src/Plugin/views/field/Field.php index f0b40db..ff27181 100644 --- a/core/modules/views/src/Plugin/views/field/Field.php +++ b/core/modules/views/src/Plugin/views/field/Field.php @@ -956,11 +956,19 @@ protected function getTableMapping() { * {@inheritdoc} */ public function getValue(ResultRow $values, $field = NULL) { - if ($field === NULL) { - return $this->getEntity($values)->{$this->definition['field_name']}->value; + /** @var \Drupal\Core\Field\FieldItemListInterface $field_item_list */ + $field_item_list = $this->getEntity($values)->{$this->definition['field_name']}; + $field_item_definition = $field_item_list->getFieldDefinition(); + + if ($field_item_definition->getFieldStorageDefinition()->getCardinality() == 1) { + return $field ? $field_item_list->$field : $field_item_list->value; } - return $this->getEntity($values)->{$this->definition['field_name']}->$field; + $values = []; + foreach ($field_item_list as $field_item) { + $values[] = $field ? $field_item->$field : $field_item->value; + } + return $values; } } diff --git a/core/modules/views/src/Tests/Handler/FieldFieldTest.php b/core/modules/views/src/Tests/Handler/FieldFieldTest.php index 4982cdd..7d5fdd8 100644 --- a/core/modules/views/src/Tests/Handler/FieldFieldTest.php +++ b/core/modules/views/src/Tests/Handler/FieldFieldTest.php @@ -7,6 +7,7 @@ namespace Drupal\views\Tests\Handler; +use Drupal\Core\Field\FieldStorageDefinitionInterface; use Drupal\entity_test\Entity\EntityTest; use Drupal\entity_test\Entity\EntityTestRev; use Drupal\field\Entity\FieldConfig; @@ -31,7 +32,7 @@ class FieldFieldTest extends ViewUnitTestBase { /** * {@inheritdoc} */ - public static $testViews = ['test_field_field_test', 'test_field_field_revision_test']; + public static $testViews = ['test_field_field_test', 'test_field_field_complex_test', 'test_field_field_revision_test']; /** * The stored test entities. @@ -72,11 +73,28 @@ protected function setUp() { ]); $field->save(); + $field_storage_multiple = FieldStorageConfig::create([ + 'field_name' => 'field_test_multiple', + 'type' => 'integer', + 'entity_type' => 'entity_test', + 'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, + ]); + $field_storage_multiple->save(); + + $field_multiple = FieldConfig::create([ + 'field_name' => 'field_test_multiple', + 'entity_type' => 'entity_test', + 'bundle' => 'entity_test', + ]); + $field_multiple->save(); + $random_number = (string) 30856; + $random_number_multiple = (string) 1370359990; for ($i = 0; $i < 5; $i++) { $this->entities[$i] = $entity = EntityTest::create([ 'bundle' => 'entity_test', 'field_test' => $random_number[$i], + 'field_test_multiple' => [$random_number_multiple[$i * 2], $random_number_multiple[$i * 2 + 1]], ]); $entity->save(); } @@ -97,10 +115,25 @@ protected function setUp() { ]); $field->save(); + $field_storage_multiple = FieldStorageConfig::create([ + 'field_name' => 'field_test_multiple', + 'type' => 'integer', + 'entity_type' => 'entity_test_rev', + ]); + $field_storage_multiple->save(); + + $field_multiple = FieldConfig::create([ + 'field_name' => 'field_test_multiple', + 'entity_type' => 'entity_test_rev', + 'bundle' => 'entity_test_rev', + ]); + $field_multiple->save(); + $this->entityRevision = []; $this->entityRevision[0] = $entity = EntityTestRev::create([ 'name' => 'base value', 'field_test' => 1, + 'field_test_multiple' => [1, 3, 7] ]); $entity->save(); @@ -108,6 +141,7 @@ protected function setUp() { $entity->setNewRevision(TRUE); $entity->name->value = 'revision value1'; $entity->field_test->value = 2; + $entity->field_test_multiple->value = 2; $entity->save(); $this->entityRevision[1] = $entity; @@ -186,6 +220,60 @@ public function testSimpleRender() { } /** + * Tests the result of a view with complex field configuration. + * + * A complex field configuration contains multiple times the same field, with + * different delta limit / offset. + */ + public function testComplexExecute() { + $executable = Views::getView('test_field_field_complex_test'); + $executable->execute(); + + $this->assertTrue($executable->field['field_test_multiple'] instanceof Field); + $this->assertTrue($executable->field['field_test_multiple_1'] instanceof Field); + $this->assertTrue($executable->field['field_test_multiple_2'] instanceof Field); + + $this->assertIdenticalResultset($executable, + [ + ['field_test_multiple' => ['1', '3'], 'field_test_multiple_1' => ['1', '3'], 'field_test_multiple_2' => ['1', '3']], + ['field_test_multiple' => ['7', '0'], 'field_test_multiple_1' => ['7', '0'], 'field_test_multiple_2' => ['7', '0']], + ['field_test_multiple' => ['3', '5'], 'field_test_multiple_1' => ['3', '5'], 'field_test_multiple_2' => ['3', '5']], + ['field_test_multiple' => ['9', '9'], 'field_test_multiple_1' => ['9', '9'], 'field_test_multiple_2' => ['9', '9']], + ['field_test_multiple' => ['9', '0'], 'field_test_multiple_1' => ['9', '0'], 'field_test_multiple_2' => ['9', '0']], + ], + ['field_test_multiple' => 'field_test_multiple', 'field_test_multiple_1' => 'field_test_multiple_1', 'field_test_multiple_2' => 'field_test_multiple_2'] + ); + } + + /** + * Tests the output of a view with complex field configuration. + */ + public function testComplexRender() { + $executable = Views::getView('test_field_field_complex_test'); + $executable->render(); + + $this->assertEqual("1, 3", $executable->getStyle()->getField(0, 'field_test_multiple')); + $this->assertEqual("1", $executable->getStyle()->getField(0, 'field_test_multiple_1')); + $this->assertEqual("3", $executable->getStyle()->getField(0, 'field_test_multiple_2')); + + $this->assertEqual("7, 0", $executable->getStyle()->getField(1, 'field_test_multiple')); + $this->assertEqual("7", $executable->getStyle()->getField(1, 'field_test_multiple_1')); + $this->assertEqual("0", $executable->getStyle()->getField(1, 'field_test_multiple_2')); + + $this->assertEqual("3, 5", $executable->getStyle()->getField(2, 'field_test_multiple')); + $this->assertEqual("3", $executable->getStyle()->getField(2, 'field_test_multiple_1')); + $this->assertEqual("5", $executable->getStyle()->getField(2, 'field_test_multiple_2')); + + $this->assertEqual("9, 9", $executable->getStyle()->getField(3, 'field_test_multiple')); + $this->assertEqual("9", $executable->getStyle()->getField(3, 'field_test_multiple_1')); + $this->assertEqual("9", $executable->getStyle()->getField(3, 'field_test_multiple_2')); + + $this->assertEqual("9, 0", $executable->getStyle()->getField(4, 'field_test_multiple')); + $this->assertEqual("9", $executable->getStyle()->getField(4, 'field_test_multiple_1')); + $this->assertEqual("0", $executable->getStyle()->getField(4, 'field_test_multiple_2')); + } + + /** * Tests the revision result. */ public function testRevisionExecute() { @@ -211,7 +299,7 @@ public function testRevisionExecute() { */ public function testRevisionRender() { $executable = Views::getView('test_field_field_revision_test'); - $executable->execute(); + $executable->render(); $this->assertEqual(1, $executable->getStyle()->getField(0, 'id')); $this->assertEqual(1, $executable->getStyle()->getField(0, 'revision_id')); diff --git a/core/modules/views/src/Tests/ViewResultAssertionTrait.php b/core/modules/views/src/Tests/ViewResultAssertionTrait.php index 222bf25..96bdbbe 100644 --- a/core/modules/views/src/Tests/ViewResultAssertionTrait.php +++ b/core/modules/views/src/Tests/ViewResultAssertionTrait.php @@ -109,7 +109,15 @@ protected function assertIdenticalResultsetHelper($view, $expected_result, $colu $row = array(); foreach ($column_map as $expected_column) { // The comparison will be done on the string representation of the value. - $row[$expected_column] = (string) (is_object($value) ? $value->$expected_column : $value[$expected_column]); + if (is_object($value)) { + $row[$expected_column] = (string) $value->$expected_column; + } + elseif (is_array($value[$expected_column])) { + $row[$expected_column] = $value[$expected_column]; + } + else { + $row[$expected_column] = (string) $value[$expected_column]; + } } $expected_result[$key] = $row; } diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_field_complex_test.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_field_complex_test.yml new file mode 100644 index 0000000..666b1ba --- /dev/null +++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_field_complex_test.yml @@ -0,0 +1,66 @@ +langcode: und +status: true +dependencies: { } +id: test_field_field_complex_test +module: views +description: '' +tag: '' +base_table: entity_test +base_field: id +core: '8' +display: + default: + display_options: + access: + type: none + cache: + type: none + fields: + id: + id: id + table: entity_test + field: id + plugin_id: field + entity_type: entity_test + entity_field: id + field_test_multiple: + id: field_test_multiple + table: entity_test__field_test_multiple + field: field_test_multiple + plugin_id: field + entity_type: entity_test + entity_field: field_test_multiple + delta_limit: 0 + group_rows: true + field_test_multiple_1: + id: field_test_multiple_1 + table: entity_test__field_test_multiple + field: field_test_multiple + plugin_id: field + entity_type: entity_test + entity_field: field_test_multiple + delta_limit: 1 + group_rows: true + field_test_multiple_2: + id: field_test_multiple_2 + table: entity_test__field_test_multiple + field: field_test_multiple + plugin_id: field + entity_type: entity_test + entity_field: field_test_multiple + delta_limit: 0 + delta_offset: 1 + group_rows: true + sorts: + id: + id: id + table: entity_test + field: id + plugin_id: standard + order: asc + style: + type: html_list + display_plugin: default + display_title: Master + id: default + position: 0 diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_field_revision_test.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_field_revision_test.yml index 5a49a08..d85d4d1 100644 --- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_field_revision_test.yml +++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_field_revision_test.yml @@ -32,7 +32,7 @@ display: entity_field: revision_id field_test: id: field_test - table: entity_test__field_test + table: entity_test_rev__field_test field: field_test plugin_id: field entity_type: entity_test_rev