เปลี่ยน $ form_state ในการโทรกลับ AJAX


16

ฉันกำลังสร้างแบบฟอร์มที่ใช้'#ajax'แอตทริบิวต์API แบบฟอร์มและฉันต้องทำการเปลี่ยนแปลง$form_stateเมื่อกดปุ่มเปิดใช้งาน AJAX นี่คือสิ่งที่ฉันได้รับ:

ภายในฟังก์ชันตัวสร้างแบบฟอร์มของฉัน:

...
$form['some_fieldset']['add_more'] = array(
      '#type' => 'button',
      '#value' => t('Add more rows'),
      '#ajax' => array(
        'wrapper' => 'some-fieldset',
        'callback' => 'my_module_settings_ajax',
        'method' => 'replace',
        'effect' => 'fade',
      ),
    );

...

และนี่คือฟังก์ชันการเรียกกลับ:

function my_module_settings_ajax($form, $form_state) { 
  // Make a change to $form_state
  if ($form_state['some_fieldset']['add_more']) {
    $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
  }

  return $form['some_fieldset'];
}

การเปลี่ยนแปลงที่ฉันทำ$form_stateดูเหมือนจะหายไปเมื่อการโทรกลับเสร็จสิ้น มีวิธีใดบ้างที่จะเปลี่ยนแปลง$form_stateในฟังก์ชั่นนี้หรือมีฟังก์ชั่นอื่นที่ฉันควรใช้แทนสิ่งนี้?

แก้ไข

เมื่อปรากฎว่าการโทรกลับเป็นสถานที่ที่ผิดในการทำตรรกะนี้ ที่ด้านบนของฟังก์ชั่นตัวสร้างฟอร์มฉันเพิ่มสิ่งนี้แทน:

// Respond to AJAX-triggger:
// Add new row
if ($form_state['triggering_element']['#name'] == 'add_more') {
  $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
}

แน่นอนฉันต้องให้ชื่อปุ่ม:

$form['some_fieldset']['add_more'] = array(
  '#type' => 'button',
  '#name' => 'add_more', // <-- Right here
  '#value' => t('Add more rows'),
  '#ajax' => array(
    'wrapper' => 'some-fieldset',
    'callback' => 'my_module_settings_ajax',
    'method' => 'replace',
    'effect' => 'fade',
  ),
);

และตอนนี้มันใช้งานได้!

คำตอบ:


3

คุณต้องผ่าน$form_stateการอ้างอิง; จำเป็นต้องกำหนดฟังก์ชัน AJAX ตามตัวอย่างต่อไปนี้:

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 

ในการชี้แจงคุณต้อง & & ส่งผ่านโดยอ้างอิงมากกว่าตามค่า ไม่ว่าคุณจะแก้ไขสำเนาของ $ form_state เท่านั้น
มัลค์

ใช่ถ้าคุณไม่ทำเช่นนี้คุณเพียงแก้ไขตัวแปรโลคอล
nourcy

1
แน่นอนไม่คิดอย่างนั้น น่าเสียดายที่ไม่มีผลใด ๆ - การเปลี่ยนแปลงใด ๆ ที่ทำกับ $ form_state จะถูกละเว้นในตัวสร้างแบบฟอร์มและในครั้งต่อไปที่มีการเรียก AJAX ระบบจะทำการคืนค่า $ form_state เป็นไปได้หรือไม่ว่าแบบฟอร์มนั้นถูกสร้างขึ้นเมื่อเวลาที่ callback ดำเนินการ มีวิธีเรียกใช้ตัวจัดการการส่งแบบกำหนดเองสำหรับปุ่มนี้แทนหรือไม่?
เมกะวัตต์

ลองเปลี่ยนประเภทจากปุ่มเพื่อส่ง
nourcy

0

ฉันไม่แน่ใจว่าเป็นคำตอบสำหรับคำถามของคุณโดยตรง แต่อาจใช้กับกรณีของคุณได้: แทนที่จะเปลี่ยน $ form_state เพิ่มค่าให้เป็น $ form ของคุณ #hiddenหากคุณไม่ต้องการให้พวกเขาแสดงให้เห็นการใช้งานเพียงแค่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.