ฉันใช้ Form API เพื่อสร้างฟอร์มที่ฉันมีหลายอินสแตนซ์ของ fieldset แต่ละชุดฟิลด์ประกอบด้วยฟิลด์เดียวกัน ฟิลด์หนึ่งสำหรับจัดเก็บที่อยู่อีเมล และอีกฟิลด์หนึ่งสำหรับข้อมูลอื่น แต่โดยพื้นฐานแล้วมันเป็นทั้งฟิลด์ข้อความที่ใช้การเติมข้อความอัตโนมัติซึ่งใช้งานได้ดี แต่ฉันมีปัญหาในตัวจัดการการส่งซึ่งอธิบายไว้ใต้รหัสของฉันด้านล่าง
$form['authors_container']['authors_fieldset'][$i] = [
'#type' => 'ชุดฟิลด์',
'#attributes' => [
'คลาส' => ['ผู้เขียนฟิลด์เซ็ต']
]
'อีเมล' => [
'#type' => 'ช่องข้อความ',
'#title' => 'อีเมลผู้เขียน',
'#value' => $emailValue,
'#autocomplete_route_name' => 'discussion_papers.contact_email_lookup',
'#attributes' => [
'คลาส' => ['ผู้เขียนอีเมล']
]
]
'สังกัด' => [
'#type' => 'ช่องข้อความ',
'#title' => 'สังกัด',
'#value' => $affiliationValue,
'#attributes' => [
'คลาส' => ['ผู้เขียน-สังกัด']
]
]
];
ฉันมีปุ่ม AJAX สำหรับเพิ่มอินสแตนซ์ของชุดฟิลด์ด้านบนด้วยตัวจัดการที่เกี่ยวข้อง:
$form['authors_container']['add_author'] = [
'#type' => 'ส่ง',
'#value' => 'เพิ่มผู้เขียน',
'#submit' => ['::AddAuthor'],
'#limit_validation_errors' => [],
'#อาแจ็กซ์' => [
'callback' => '::getAuthorsFields',
'wrapper' => 'ผู้เขียนคอนเทนเนอร์',
'วิธีการ' => 'แทนที่',
'disable-refocus' => จริง,
]
];
ฟังก์ชันสาธารณะ addAuthor ($form, FormStateInterface &$form_state) {
$storage = $form_state->getStorage();
ถ้า (ว่าง ($ ที่เก็บข้อมูล ['จำนวนผู้แต่ง']))
$storage['จำนวนผู้เขียน'] = 1;
$storage['numOfAuthors']++;
$form_state->setStorage($storage);
$form_state->setLimitValidationErrors([]);
$form_state->setRebuild();
}
ทั้งหมดนี้ใช้ได้ดี ฉันสามารถเพิ่มอินสแตนซ์ของ fieldset ได้มากเท่าที่ต้องการปัญหาของฉันคือเมื่อฉันส่งแบบฟอร์ม ค่าของเฉพาะชุดฟิลด์สุดท้ายจะว่างเปล่าเสมอใน $form_state['ค่า']
อาร์เรย์ แต่ฉันสามารถเห็นค่าใน $form_state['อินพุต']
อาร์เรย์ ฉันเข้าใจว่าอินพุตอาร์เรย์เป็นข้อมูลดิบ อินพุตที่ไม่ผ่านการตรวจสอบ และอาร์เรย์ของค่าได้รับการตรวจสอบแล้ว ดังนั้นคำถามของฉันคือเหตุใดจึงมีเพียงชุดสุดท้ายของช่องข้อความเท่านั้นที่ไม่ผ่านการตรวจสอบ ตัวจัดการการตรวจสอบความถูกต้องของฉันไม่ได้ลบค่าใดๆ