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.