Score:0

FormAPI - ค่าของ AJAX เพิ่มฟิลด์ที่ขาดหายไปจากอาร์เรย์ค่าเมื่อส่ง

ธง vn

ฉันใช้ 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['อินพุต'] อาร์เรย์ ฉันเข้าใจว่าอินพุตอาร์เรย์เป็นข้อมูลดิบ อินพุตที่ไม่ผ่านการตรวจสอบ และอาร์เรย์ของค่าได้รับการตรวจสอบแล้ว ดังนั้นคำถามของฉันคือเหตุใดจึงมีเพียงชุดสุดท้ายของช่องข้อความเท่านั้นที่ไม่ผ่านการตรวจสอบ ตัวจัดการการตรวจสอบความถูกต้องของฉันไม่ได้ลบค่าใดๆ

Score:0
ธง de

สองความเป็นไปได้:

  1. คุณได้เพิ่มฟิลด์เพิ่มเติมในฟังก์ชันการโทรกลับ #ajax เนื่องจากคุณไม่ได้แสดงว่าฟิลด์ของคุณถูกกำหนดไว้ในฟังก์ชันใด จึงไม่สามารถเห็นได้จากรหัสของคุณ Drupal แคชฟอร์มเมื่อสร้าง จากนั้นเมื่อส่งฟอร์ม มันจะดึงค่าใดๆ ที่ไม่ได้เป็นส่วนหนึ่งของคำจำกัดความของฟอร์มดั้งเดิมออกเพื่อวัตถุประสงค์ด้านความปลอดภัย ปัญหาของการเพิ่มฟิลด์ในฟังก์ชันการโทรกลับ #ajax คือ แบบฟอร์มถูกแคชไว้ก่อนหน้าฟังก์ชันการโทรกลับ ดังนั้น Drupal จึงละทิ้งค่าที่ส่งของฟิลด์

  2. หากการประกาศองค์ประกอบฟอร์มเป็นจริงภายในฟังก์ชันตัวสร้างฟอร์ม และไม่ใช่ส่วนหนึ่งของฟังก์ชันการโทรกลับ #ajax คุณอาจต้องเพิ่ม #ต้นไม้ ไปยัง fieldset เพื่อสร้างอาร์เรย์ของค่า:

    $form['authors_container']['authors_fieldset'][$i] = [
      '#tree' => จริง,
      '#type' => 'ชุดฟิลด์',
      ...
    

    ซึ่งจะบันทึกแต่ละค่าที่ส่งไปยังองค์ประกอบแยกต่างหากของอาร์เรย์ค่า

AlbionBrown avatar
vn flag
ขอบคุณสำหรับการตอบกลับ ฉันจะพยายามแก้ไขคำถามของฉันเพื่อรวมรหัสเพิ่มเติม ฟิลด์เพิ่มเติมจะถูกเพิ่มในเมธอด buildForm เท่านั้น การเรียกกลับ AJAX จะเพิ่มจำนวนที่ควรแสดง จากนั้นในการสร้างฟอร์มใหม่ จะเพิ่มจำนวนเท่าใดก็ตามที่เก็บไว้ในที่จัดเก็บสถานะของฟอร์ม ฉันได้ลองเพิ่มทรีคีย์และปิดใช้งานแคชแล้ว แต่ก็ไม่ได้ช่วยอะไร คีย์ทรียังใช้ในพาเรนต์คอนเทนเนอร์ของชุดฟิลด์ ฉันคิดว่าฉันต้องดีบักตั้งแต่เริ่มต้นคำขอส่ง เพื่อดูว่าเหตุใด Drupal จึงลบออก
Jaypan avatar
de flag
หากคุณกำลังเปลี่ยนค่าใน form state ใน ajax callback ค่าเหล่านั้นจะหายไป สถานะของฟอร์มถูกแคชไว้แล้วก่อนที่จะเรียกกลับ ajax คุณจะต้องทำส่วนเพิ่มในตัวจัดการการส่ง ไม่ใช่การโทรกลับ ajax ถ้าคุณต้องการให้คงอยู่ Ajax callbacks คือ _only_ สำหรับกำหนดองค์ประกอบที่จะส่งคืน ไม่ใช่สำหรับ "ทำ" อะไรกับข้อมูล

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา