You are here

public function TranslateEntityAggregatedFieldProcessor::build in Facets 8

Runs before the renderable array is created.

Parameters

\Drupal\facets\FacetInterface $facet: The facet being changed.

\Drupal\facets\Result\ResultInterface[] $results: The results being changed.

Return value

\Drupal\facets\Result\ResultInterface[] The changed results.

Overrides BuildProcessorInterface::build

File

src/Plugin/facets/processor/TranslateEntityAggregatedFieldProcessor.php, line 118

Class

TranslateEntityAggregatedFieldProcessor
Transforms the results to show the translated entity label.

Namespace

Drupal\facets\Plugin\facets\processor

Code

public function build(FacetInterface $facet, array $results) {
  $field_identifier = $facet
    ->getFieldIdentifier();
  $entity_type_ids = [];
  $allowed_values = [];
  $language_interface = $this->languageManager
    ->getCurrentLanguage();

  // Support multiple entities when using Search API.
  if ($facet
    ->getFacetSource() instanceof SearchApiDisplay) {

    /** @var \Drupal\search_api\Entity\Index $index */
    $index = $facet
      ->getFacetSource()
      ->getIndex();

    /** @var \Drupal\search_api\Item\Field $field */
    $field = $index
      ->getField($field_identifier);
    foreach ($field
      ->getConfiguration()['fields'] as $field_configuration) {
      $parts = explode(':', $field_configuration);
      if ($parts[0] !== 'entity') {
        throw new \InvalidArgumentException('Data type must be in the form of "entity:ENTITY_TYPE/FIELD_NAME."');
      }
      $parts = explode('/', $parts[1]);
      $entity_type_id = $parts[0];
      $field = $parts[1];
      $entity_type_ids[] = $entity_type_id;
      $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
      $field_storage = $definition_update_manager
        ->getFieldStorageDefinition($field, $entity_type_id);
      if ($field_storage && $field_storage
        ->getType() === 'entity_reference') {

        /** @var \Drupal\facets\Result\ResultInterface $result */
        $ids = [];
        foreach ($results as $delta => $result) {
          $ids[$delta] = $result
            ->getRawValue();
        }
        if ($field_storage instanceof FieldStorageDefinitionInterface) {
          if ($field !== 'type') {

            // Load all indexed entities of this type.
            $entities = $this->entityTypeManager
              ->getStorage($field_storage
              ->getSettings()['target_type'])
              ->loadMultiple($ids);

            // Loop over all results.
            foreach ($results as $i => $result) {
              if (!isset($entities[$ids[$i]])) {
                continue;
              }

              /** @var \Drupal\Core\Entity\ContentEntityBase $entity */
              $entity = $entities[$ids[$i]];

              // Check for a translation of the entity and load that
              // instead if one's found.
              if ($entity instanceof TranslatableInterface && $entity
                ->hasTranslation($language_interface
                ->getId())) {
                $entity = $entity
                  ->getTranslation($language_interface
                  ->getId());
              }

              // Overwrite the result's display value.
              $results[$i]
                ->setDisplayValue($entity
                ->label());
            }
          }
        }
      }
    }

    // If no values are found for the current field, try to see if this is a
    // bundle field.
    foreach ($entity_type_ids as $entity) {
      $list_bundles = $this->entityTypeBundleInfo
        ->getBundleInfo($entity);
      if (!empty($list_bundles)) {
        foreach ($list_bundles as $key => $bundle) {
          $allowed_values[$key] = $bundle['label'];
        }
        $this
          ->overWriteDisplayValues($results, $allowed_values);
      }
    }
  }
  return $results;
}