I have implemented a computed field type, mostly modelled on PathItem
and PathFieldItemList
. The item class has no code in it just the annotation,
/** * Defines the 'tag2image' entity field type. * * @FieldType( * id = "tag2image", * label = @Translation("Tag2image reference"), * description = @Translation("tag2image."), * category = @Translation("Reference"), * default_widget = "entity_reference_autocomplete", * default_formatter = "entity_reference_label", * list_class = "Drupaltag2imagePluginFieldFieldTypeTag2ImageFieldItemList", * ) */ class Tag2ImageItem extends EntityReferenceItem { public static function getPreconfiguredOptions() { $options['taxonomy_term'] = [ 'label' => 'Taxonomy term (tag2image)', 'field_storage_config' => [ 'settings' => [ 'target_type' => 'taxonomy_term', ], ], ]; return $options; } }
The item list class has use ComputedItemListTrait;
, an appropriate computeValue
:
protected function computeValue() { /** @var Drupaltag2imageEntityTag2Image $tag2image */ foreach (array_values($this->getTag2ImageEntities()) as $delta => $tag2image) { $this->list[$delta] = $this->createItem($delta, $tag2image->getTag()); } }
I verified the $this->getTag2ImageEntities()
method returns what I expect.
And the only other method is a postSave
basically copied from PathItem
which does not affect the current item list so I will skip it as it’s not relevant for the question.
Now, unlike path, this was set up as a configurable field and as a consequence, it created a table which is great because it saves some computation … but in unknown circumstances only the first item was saved. In most cases, actually. Sometimes it did save more than delta. Not quite sure how it happened. The field storage config entity has custom storage set to FALSE
, cardinality to -1. I did see https://www.drupal.org/project/drupal/issues/2986836 but I can’t say I am any wiser here.
What’s going on?