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\processorCode
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;
}