I’m trying to programmatically add a field to a custom bundle, and have it appear on the custom entity type. I’m using a BaseForm
extended class, and have acquired an entityManager
elsewhere using dependency injection.
Below is the submitForm()
code I modelled, on how FieldStorageAddForm::configureEntityFormDisplay()
etc. works:
$field_storage_values = [ 'field_name' => 'field_phone', 'entity_type' => 'contact', 'type' => 'string', 'translatable' => false, ]; $field_values = [ 'field_name' => 'field_phone', 'entity_type' => 'contact', 'bundle' => 'organization', 'label' => 'Phone', 'translatable' => false, ]; $this->entityManager->getStorage('field_storage_config') ->create($field_storage_values)->save(); $this->entityManager->getStorage('field_config') ->create($field_values)->save(); entity_get_form_display('contact', 'organization', 'default') ->setComponent('field_phone', ['type' => 'string_textfield']) ->save(); entity_get_display('contact', 'organization', 'default') ->setComponent('field_phone', ['type' => 'string_textfield']) ->save();
This works fine for adding the field storage, and for associating the field instance with the bundle.
However, when it gets to the entity_get_form_display()->setComponent()->save()
, the following exception is thrown:
Uncaught PHP Exception Drupal\Component\Plugin\Exception\PluginNotFoundException: "The "string_string_textfield" plugin does not exist." at /var/www/web/core/lib/Drupal/Component/Plugin/Discovery/DiscoveryTrait.php line 60
What’s strange is that the same exception, quoting ‘string’, is seen for both 'type' => 'string_textfield'
and 'type' => 'text_text_with_summary'
(which doesn’t even contain the word ‘string’!) On the other hand, a nonsense value (e.g. ‘string_string_textfield’ or ‘stringz_textfield’) yields the exception with the nonsense value in full, no parsing. So there’s some kind of detection/lookup going on, but it still can’t find the relevant plugin.
What am I missing? What should the value of 'type'
be? I’m aware of e.g. https://drupal.stackexchange.com/questions/177913/the-string-plugin-does-not-exist but as you can see the value suggested there doesn’t seem to work in this situation.