Folosesc API-ul Form pentru a crea un formular în care am mai multe instanțe ale unui set de câmpuri. Fiecare set de câmpuri conține aceleași câmpuri, unul pentru stocarea unei adrese de e-mail și altul pentru un alt bit de informații. Dar, în esență, ambele sunt câmpuri de text care folosesc completarea automată, care funcționează bine. Dar am o problemă cu gestionarea trimiterii, descrisă sub codul meu de mai jos.
$form['authors_container']['authors_fieldset'][$i] = [
'#type' => 'fieldset',
'#attributes' => [
'class' => ['author-fieldset']
],
'email' => [
'#type' => 'câmp text',
'#title' => 'E-mailul autorului',
'#value' => $emailValue,
'#autocomplete_route_name' => 'discussion_papers.contact_email_lookup',
'#attributes' => [
'class' => ['e-mail-ul autorului']
]
],
'afiliere' => [
'#type' => 'câmp text',
'#title' => 'Afiliere',
'#value' => $affiliationValue,
'#attributes' => [
'class' => ['afiliere-autor']
]
]
];
Apoi am un buton AJAX pentru a adăuga mai multe instanțe ale setului de câmpuri de mai sus cu handlerul corespunzător:
$form['authors_container']['add_author'] = [
'#type' => 'trimite',
'#value' => 'Adăugați un alt autor',
'#submit' => ['::AddAuthor'],
'#limit_validation_errors' => [],
'#ajax' => [
'callback' => '::getAuthorsFields',
'wrapper' => 'container-autori',
'method' => 'înlocuiește',
'disable-refocus' => adevărat,
]
];
funcția publică addAuthor($form, FormStateInterface &$form_state) {
$storage = $form_state->getStorage();
dacă (gol ($storage['numOfAuthors']))
$storage['numOfAuthors'] = 1;
$storage['numOfAuthors']++;
$form_state->setStorage($storage);
$form_state->setLimitValidationErrors([]);
$form_state->setRebuild();
}
Toate acestea funcționează bine, pot adăuga oricâte instanțe de fieldset am nevoie.Problema mea este că atunci când trimit formularul, valorile doar ultimului set de câmpuri sunt întotdeauna goale în $form_state['valori']
matrice, dar pot vedea valorile din $form_state['input']
matrice. Înțeleg că matricea de intrare este o intrare brută, nevalidată și că matricea de valori este validată, deci întrebarea mea este de ce nu este validat doar ultimul set de câmpuri text? Managerul meu de validare nu elimină nicio valoare.