You are here

public function EntityReferenceFieldDiffParser::build in Entity Share 8.3

Builds an array of strings.

This method is responsible for transforming a FieldItemListInterface object into an array of strings. The resulted array of strings is then compared by the Diff component with another such array of strings and the result represents the difference between two entity fields.

Example of FieldItemListInterface built into an array of strings:

array(
  0 => "This is an example string",
  1 => "Field values or properties",
);

Parameters

\Drupal\Core\Field\FieldItemListInterface $field_items: Represents an entity field.

Return value

mixed An array of strings to be compared. If an empty array is returned it means that a field is either empty or no properties need to be compared for that field.

Overrides DiffGeneratorInterface::build

See also

\Drupal\entity_share_diff\Plugin\DiffGenerator\CoreFieldDiffParser

1 method overrides EntityReferenceFieldDiffParser::build()
DynamicEntityReferenceFieldDiffParser::build in modules/entity_share_diff/src/Plugin/DiffGenerator/DynamicEntityReferenceFieldDiffParser.php
Builds an array of strings.

File

modules/entity_share_diff/src/Plugin/DiffGenerator/EntityReferenceFieldDiffParser.php, line 28

Class

EntityReferenceFieldDiffParser
Plugin to diff entity reference fields.

Namespace

Drupal\entity_share_diff\Plugin\DiffGenerator

Code

public function build(FieldItemListInterface $field_items, array $remote_field_data = []) {
  $result = [];

  // Case of local entity:
  // Every item from $field_items is of type FieldItemInterface.
  if (!$this
    ->getRemote()) {
    foreach ($field_items as $field_key => $field_item) {
      if (!$field_item
        ->isEmpty()) {

        // Compare entity label.
        if ($field_item->entity) {
          $entity = $field_item->entity;

          // Should we go into recursion and embed the referenced entity?
          // If the entity has already been processed, don't embed,
          // to avoid infinite loop.
          // If the referenced entity type is not Paragraph or Media,
          // don't embed.
          if ($this->entityParser
            ->referenceEmbeddable($entity
            ->getEntityTypeId()) && $this->entityParser
            ->validateNeedToProcess($entity
            ->uuid(), FALSE)) {
            $result[$field_key] = $this->entityParser
              ->prepareLocalEntity($entity);
          }
          else {
            $result[$field_key] = $entity
              ->label() . ' (' . $entity
              ->uuid() . ')';
          }
        }
      }
    }
  }
  elseif (!empty($remote_field_data['data'])) {
    $detailed_response = $this->remoteManager
      ->jsonApiRequest($this
      ->getRemote(), 'GET', $remote_field_data['links']['related']['href']);
    $entities_json = Json::decode((string) $detailed_response
      ->getBody());
    if (!empty($entities_json['data'])) {
      $data = EntityShareUtility::prepareData($entities_json['data']);
    }
    else {
      $data = [];
    }
    foreach ($remote_field_data['data'] as $field_key => $remote_item_data) {
      $uuid = $data[$field_key]['id'];
      list($referenced_entity_type, ) = explode('--', $remote_item_data['type']);
      if ($this->entityParser
        ->referenceEmbeddable($referenced_entity_type) && $this->entityParser
        ->validateNeedToProcess($uuid, TRUE)) {
        $result[$field_key] = $this->entityParser
          ->prepareRemoteEntity($data[$field_key], $this
          ->getRemote());
      }
      elseif (isset($data[$field_key])) {
        $public_title_key = $this->entityParser
          ->getPublicFieldName('title', $data[$field_key]);
        $title = $data[$field_key]['attributes'][$public_title_key] ?? '';
        $uuid = $remote_item_data['id'];
        $result[$field_key] = "{$title} ({$uuid})";
      }
    }
  }
  return $result;
}