You are here

public function DynamicEntityReferenceEntityFormatter::viewElements in Dynamic Entity Reference 8

Same name and namespace in other branches
  1. 8.2 src/Plugin/Field/FieldFormatter/DynamicEntityReferenceEntityFormatter.php \Drupal\dynamic_entity_reference\Plugin\Field\FieldFormatter\DynamicEntityReferenceEntityFormatter::viewElements()

Builds a renderable array for a field value.

Parameters

\Drupal\Core\Field\FieldItemListInterface $items: The field values to be rendered.

string $langcode: The language that should be used to render the field.

Return value

array A renderable array for $items, as an array of child elements keyed by consecutive numeric indexes starting from 0.

Overrides EntityReferenceEntityFormatter::viewElements

File

src/Plugin/Field/FieldFormatter/DynamicEntityReferenceEntityFormatter.php, line 101

Class

DynamicEntityReferenceEntityFormatter
Plugin implementation of the 'rendered entity' formatter.

Namespace

Drupal\dynamic_entity_reference\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {
  $elements = [];
  foreach ($this
    ->getEntitiesToView($items, $langcode) as $delta => $entity) {

    // 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() . $items
      ->getEntity()
      ->id() . $entity
      ->getEntityTypeId() . $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;
    }
    $entity_type_id = $entity
      ->getEntityTypeId();
    $view_builder = $this->entityTypeManager
      ->getViewBuilder($entity_type_id);
    $elements[$delta] = $view_builder
      ->view($entity, $this
      ->getSetting($entity_type_id)['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 += [
        'resource' => $entity
          ->toUrl()
          ->toString(),
      ];
    }
  }
  return $elements;
}