I'm using the Form API to create a form where I have multiple instances of a fieldset. Each fieldset contains the same fields, one for storing an email address and another for another bit of information. But essentially they're both textfields that use autocomplete which works fine. But I'm having an issue in the submission handler, described underneath my code below.
$form['authors_container']['authors_fieldset'][$i] = [
'#type' => 'fieldset',
'#attributes' => [
'class' => ['author-fieldset']
],
'email' => [
'#type' => 'textfield',
'#title' => 'Author email',
'#value' => $emailValue,
'#autocomplete_route_name' => 'discussion_papers.contact_email_lookup',
'#attributes' => [
'class' => ['author-email']
]
],
'affiliation' => [
'#type' => 'textfield',
'#title' => 'Affiliation',
'#value' => $affiliationValue,
'#attributes' => [
'class' => ['author-affiliation']
]
]
];
I then have an AJAX button for adding more instances of the above fieldset with its corresponding handler:
$form['authors_container']['add_author'] = [
'#type' => 'submit',
'#value' => 'Add another author',
'#submit' => ['::AddAuthor'],
'#limit_validation_errors' => [],
'#ajax' => [
'callback' => '::getAuthorsFields',
'wrapper' => 'authors-container',
'method' => 'replace',
'disable-refocus' => true,
]
];
public function addAuthor($form, FormStateInterface &$form_state) {
$storage = $form_state->getStorage();
if (empty($storage['numOfAuthors']))
$storage['numOfAuthors'] = 1;
$storage['numOfAuthors']++;
$form_state->setStorage($storage);
$form_state->setLimitValidationErrors([]);
$form_state->setRebuild();
}
All this works fine, I can add as many instance of the fieldset as I need. My issue is that when I submit the form, the values of only the very last fieldset are always empty in the $form_state['values']
array, yet I can see the values in the $form_state['input']
array. I understand that the input array is raw, unvalidated input and that the values array is validated, so my question is why are only the last set of textfields not validated? My validation handler doesn't remove any values.