improvements-2.x-dev/src/Plugin/Field/ComputedMapFieldItemList.php
src/Plugin/Field/ComputedMapFieldItemList.php
<?php namespace Drupal\improvements\Plugin\Field; use Drupal\Component\Utility\NestedArray; use Drupal\Core\Field\FieldItemList; use Drupal\Core\TypedData\ComputedItemListTrait; /** * Class for computed fields for extract data from "map" fields. * * $fields['example_map_field'] = BaseFieldDefinition::create('map')->setLabel('ExampleMapField'); * * $fields['example_computed_field'] = BaseFieldDefinition::create('string') * ->setLabel('Example computed field') * ->setComputed(TRUE) * ->setClass(ComputedMapFieldItemList::class) * ->setSettings([ * 'source_field_name' => 'example_map_field', * 'array_path' => 'path.to.value', // Equivalent to $field_value['path']['to']['value'] * ]); * * $fields['second_computed_field'] = BaseFieldDefinition::create('string') * ->setLabel('Second computed field') * ->setComputed(TRUE) * ->setClass(ComputedMapFieldItemList::class) * ->setSettings([ * 'source_field_name' => 'example_map_field', * 'array_path' => [ * 0 => 'path.to.value', // Equivalent to $field_value['path']['to']['value'] * 1 => 'other.value.path', // Equivalent to $field_value['other']['value']['path'] * ] * 'value_template' => '@0-@1', * ]); */ class ComputedMapFieldItemList extends FieldItemList { use ComputedItemListTrait; /** * {@inheritdoc} */ protected function computeValue(): void { $field_settings = $this->getSettings(); $entity = $this->getEntity(); if ($source_field_values = $entity->get($field_settings['source_field_name'])->getValue()) { // Single array_path if (is_string($field_settings['array_path'])) { $array_path = explode('.', $field_settings['array_path']); foreach ($source_field_values as $delta => $source_field_value) { $this->list[$delta] = $this->createItem($delta, NestedArray::getValue($source_field_value, $array_path)); } } // Multiple array_path elseif (is_array($field_settings['array_path']) && !empty($field_settings['value_template'])) { $array_paths = []; foreach ($field_settings['array_path'] as $array_path) { $array_paths[] = explode('.', $array_path); } foreach ($source_field_values as $delta => $source_field_value) { $field_value_args = []; foreach ($array_paths as $array_path_delta => $array_path) { $field_value_args['@' . $array_path_delta] = NestedArray::getValue($source_field_value, $array_path); } $this->list[$delta] = $this->createItem($delta, strtr($field_settings['value_template'], $field_value_args)); } } } } }