diff --git a/core/modules/views/src/Entity/Render/EntityFieldRenderer.php b/core/modules/views/src/Entity/Render/EntityFieldRenderer.php index 513ed2a..d19e105 100644 --- a/core/modules/views/src/Entity/Render/EntityFieldRenderer.php +++ b/core/modules/views/src/Entity/Render/EntityFieldRenderer.php @@ -126,50 +126,45 @@ public function query(QueryPluginBase $query, $relationship = NULL) { protected function buildFields(array $values) { $build = &$this->build; - /** @var \Drupal\Core\Entity\FieldableEntityInterface[][] $entities */ - $entities = []; - /** @var \Drupal\Core\Entity\Entity\EntityViewDisplay[] $displays */ - $displays = []; - - foreach ($this->getRenderableFieldIds() as $field_id) { - /** @var \Drupal\views\Plugin\views\field\Field $field */ - $field = $this->view->field[$field_id]; - $result_row = reset($values); - $entity_type_id = $field->getEntity($result_row)->getEntityTypeId(); - - // Retrieve entity translations to be processed. - if (!isset($entities[$entity_type_id])) { - foreach ($values as $result_row) { - $entity = $field->getEntity($result_row); - $entities[$entity_type_id][$entity->bundle()][$result_row->index] = $this->getEntityTranslation($entity, $result_row); - } + if ($renderable_fields = $this->getRenderableFieldIds()) { + // Retrieve entity translations to be processed, and group them by bundle. + /** @var \Drupal\Core\Entity\FieldableEntityInterface[][] $entities */ + $entities = []; + $field = $this->view->field[reset($renderable_fields)]; + foreach ($values as $result_row) { + $entity = $field->getEntity($result_row); + $entities[$entity->bundle()][$result_row->index] = $this->getEntityTranslation($entity, $result_row); } - // Prepare the display object to be used for this entity type. // @todo Note : given the current code in EVD->buildFieldMultiple(), we don't - // actually need to create an EVD dor each bundle (in fact we could even reuse the - // same single EVD for all entity types). This shows that EVD->buildFieldMultiple() - // belongs somewhere else, since it does in fact not depend on the values in the EVD. - if (!isset($displays[$entity_type_id])) { - $display_values = [ - 'targetEntityType' => $entity_type_id, - 'bundle' => FALSE, - 'status' => TRUE, - ]; - $displays[$entity_type_id] = new EntityViewDisplay($display_values, $entity_type_id); - } + // actually need to create an EVD for each entity_type / bundle. This shows + // that EVD->buildFieldMultiple() should rather go in a stateless service, + // since it does in fact not depend on the values in the EVD. + $display = new EntityViewDisplay([ + 'targetEntityType' => $this->getEntityTypeId(), + 'bundle' => FALSE, + 'status' => TRUE, + ], 'entity_view_display'); - // Build field render array for each bundle. - foreach ($entities[$entity_type_id] as $bundle => $bundle_entities) { - // At this point, we can use the "real" field definition for this - // specific bundle. - $field_definition = $this->entityManager->getFieldDefinitions($entity_type_id, $bundle)[$field->definition['field_name']]; - $field_build = $displays[$entity_type_id]->buildFieldMultiple($bundle_entities, $field_definition, $field->options['type'], $field->options['settings']); - array_walk($field_build, function ($value, $index) use (&$build, $field_id) { - $build[$index][$field_id] = $value; - }); + // Render each field + foreach ($renderable_fields as $field_id) { + /** @var \Drupal\views\Plugin\views\field\Field $field */ + $field = $this->view->field[$field_id]; + + // Build field render array for each bundle. + foreach ($entities as $bundle => $bundle_entities) { + // At this point, we can use the "real" field definition for the bundle + // we are rendering. + $field_definition = $this->entityManager->getFieldDefinitions($this->getEntityTypeId(), $bundle)[$field->definition['field_name']]; + $field_build = $display->buildFieldMultiple($bundle_entities, $field_definition, $field->options['type'], $field->options['settings']); + array_walk($field_build, function ($value, $index) use (&$build, $field_id) { + $build[$index][$field_id] = $value; + }); + } } } + + } /** @@ -182,7 +177,7 @@ protected function getRenderableFieldIds() { if (!isset($this->renderableFieldIds)) { $this->renderableFieldIds = []; foreach ($this->view->field as $field_id => $field) { - if ($field instanceof Field) { + if ($field instanceof Field && $field->getEntityType() == $this->getEntityTypeId()) { $this->renderableFieldIds[] = $field_id; } }