diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php index 6f3ce021a63..fa83359c0f7 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php @@ -160,48 +160,42 @@ class EntityReferenceEntityFormatter extends EntityReferenceFormatterBase implem $elements = array(); foreach ($this->getEntitiesToView($items, $langcode) as $delta => $entity) { - if ($entity->id()) { - // Due to render caching and delayed calls, the viewElements() method - // will be called later in the rendering process through a '#pre_render' - // callback, so we need to generate a counter that takes into account - // all the relevant information about this field and the referenced - // entity that is being rendered. - $recursive_render_id = $items->getFieldDefinition()->getTargetEntityTypeId() - . $items->getFieldDefinition()->getTargetBundle() - . $items->getName() - . $entity->id(); + // Due to render caching and delayed calls, the viewElements() method + // will be called later in the rendering process through a '#pre_render' + // callback, so we need to generate a counter that takes into account + // all the relevant information about this field and the referenced + // entity that is being rendered. + $recursive_render_id = $items->getFieldDefinition()->getTargetEntityTypeId() + . $items->getFieldDefinition()->getTargetBundle() + . $items->getName() + . $entity->id(); - if (isset(static::$recursiveRenderDepth[$recursive_render_id])) { - static::$recursiveRenderDepth[$recursive_render_id]++; - } - else { - static::$recursiveRenderDepth[$recursive_render_id] = 1; - } - - // Protect ourselves from recursive rendering. - if (static::$recursiveRenderDepth[$recursive_render_id] > static::RECURSIVE_RENDER_LIMIT) { - $this->loggerFactory->get('entity')->error('Recursive rendering detected when rendering entity %entity_type: %entity_id, using the %field_name field on the %bundle_name bundle. Aborting rendering.', [ - '%entity_type' => $entity->getEntityTypeId(), - '%entity_id' => $entity->id(), - '%field_name' => $items->getName(), - '%bundle_name' => $items->getFieldDefinition()->getTargetBundle(), - ]); - return $elements; - } - - $view_builder = $this->entityTypeManager->getViewBuilder($entity->getEntityTypeId()); - $elements[$delta] = $view_builder->view($entity, $view_mode, $entity->language()->getId()); - - // Add a resource attribute to set the mapping property's value to the - // entity's url. Since we don't know what the markup of the entity will - // be, we shouldn't rely on it for structured data such as RDFa. - if (!empty($items[$delta]->_attributes)) { - $items[$delta]->_attributes += array('resource' => $entity->url()); - } + if (isset(static::$recursiveRenderDepth[$recursive_render_id])) { + static::$recursiveRenderDepth[$recursive_render_id]++; } else { - // This is an "auto_create" item. - $elements[$delta] = array('#markup' => $entity->label()); + static::$recursiveRenderDepth[$recursive_render_id] = 1; + } + + // Protect ourselves from recursive rendering. + if (static::$recursiveRenderDepth[$recursive_render_id] > static::RECURSIVE_RENDER_LIMIT) { + $this->loggerFactory->get('entity')->error('Recursive rendering detected when rendering entity %entity_type: %entity_id, using the %field_name field on the %bundle_name bundle. Aborting rendering.', [ + '%entity_type' => $entity->getEntityTypeId(), + '%entity_id' => $entity->id(), + '%field_name' => $items->getName(), + '%bundle_name' => $items->getFieldDefinition()->getTargetBundle(), + ]); + return $elements; + } + + $view_builder = $this->entityTypeManager->getViewBuilder($entity->getEntityTypeId()); + $elements[$delta] = $view_builder->view($entity, $view_mode, $entity->language()->getId()); + + // Add a resource attribute to set the mapping property's value to the + // entity's url. Since we don't know what the markup of the entity will + // be, we shouldn't rely on it for structured data such as RDFa. + if (!empty($items[$delta]->_attributes) && !$entity->isNew() && $entity->hasLinkTemplate('canonical')) { + $items[$delta]->_attributes += array('resource' => $entity->toUrl()->toString()); } } diff --git a/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceFormatterTest.php b/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceFormatterTest.php index 6720224aebc..d4be1dadc4e 100644 --- a/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceFormatterTest.php +++ b/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceFormatterTest.php @@ -201,8 +201,18 @@ class EntityReferenceFormatterTest extends EntityKernelTestBase { $this->assertEqual($build[0]['#cache']['tags'], $expected_cache_tags, format_string('The @formatter formatter has the expected cache tags.', array('@formatter' => $formatter))); // Test the second field item. + $expected_rendered_name_field_2 = ' +
Hello, unsaved world!