Entity reference field hidden widget or edit disabled on custom form
I have a custom node creation form I am rendering within a views preprocess hook. In that form I have two entity reference fields. I am setting the [#value] and [#default_value] of those reference fields programmatically.
On form submit the values I've set are created, but only if the fields are "editable" by the user. I want to make the fields "disabled" and/or "hidden" from the user. Not just hidden with CSS but with the entire autocomplete widget being made inaccessible. The field needs to be type "hidden".
How can I make an autocomplete entity reference disabled and/or inaccessible to the user creating the content?
Or another way of putting it, how can I add entity reference values programmatically on form submit without the user being able to interact with the fields?
Here are some things I've tried that do not work:
- $form['field_entity_reference']['#access'] = false; // Setting #access to false seems as though it should work because the form fields still exist when debugging $form, but it does not work as it prevents the value from being submitted.
- Adding ['#attributes']['readonly'], changing ['#type'] to hidden or another widget type, adding ['#attributed']['disabled']. None work
- Entity prepopulate - This does not work for this particular situation as some values cannot be provided by tokens
Code for reference
function <theme>_preprocess_views_view_field(&$variables) { $view = $variables['view']; if ($view->id() == '<view>') { $field = $variables['field']; switch($field->options['id']) { case '<view_field>': $node = \Drupal::entityTypeManager() ->getStorage('node') ->create(['type' => '<node_type>']); $form = \Drupal::service('entity.form_builder')->getForm($node, 'secondary'); // Set default_value and value $form['field_entity_reference']['widget']['#default_value'] = (int)$cid; // Note this is using the "select list" widget for the entity reference field $form['field_entity_reference']['widget']['#value'] = (int)$cid; // Same as above // Stuff that doesn't work. Values do not submit unless field is editable by user, or the field is not hidden/disabled $form['field_entity_reference']['#access'] = false; // Value does not submit $form['field_entity_reference']['widget'][0]['#attributes']['readonly'] = 'readonly'; // Doesn't make field read only $form['field_entity_reference']['widget'][0]['value']['#type'] = 'hidden'; // Seems autocomplete widget and select widget do not have a "hidden" type $form['field_entity_reference']['widget'][0]['target_id']['#type'] = 'textfield'; // Seems one cannot change the type to textfield // Change view field output to the form $variables['output'] = $form; break; } } }