จะตรวจสอบและส่งแบบฟอร์มโดยใช้ AJAX ได้อย่างไร


12

ฉันสร้างฟอร์มเว็บโดยใช้ Form API ฉันใช้#AJAXตัวเลือกฟิลด์เพื่อเพิ่มการตรวจสอบ AJAX ให้กับแต่ละฟิลด์

เป็นไปได้หรือไม่ที่จะตรวจสอบและส่งแบบฟอร์มโดยใช้ AJAX โดยไม่ต้องโหลดหน้าซ้ำ หากการตรวจสอบล้มเหลวฉันต้องการแสดงข้อความแสดงข้อผิดพลาดและหากการตรวจสอบสำเร็จแล้วฉันต้องการแสดงข้อความ (นึกคิดใน lightbox) และตั้งค่าเขตข้อมูลแบบฟอร์ม

รหัสของฉัน:

$form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Name'),
    '#default_value' => '',
    '#maxlength' => '128',
    '#required' => TRUE,
    '#ajax' => array(
        'callback' => '_validate_name',
        'wrapper' => 'name-error-icon-container',
        'method' => 'html',
        'effect' => 'none',
        'progress' => array(
            'message' => NULL,
        ),
    ),
);

$form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Submit',
    '#ajax' => array(
        'callback' => '_handle_form_submit',
        'effect' => 'fade',
    ),
);

ฟังก์ชั่นการโทรกลับมีลักษณะเช่นนี้:

function _validate_name($form, $form_state) {

    if ($form_state['values']['name'] != '') {
    $output = 'OK';
    }
    else {
      $output = 'Enter a value';
    }

   return $output;

}

function _handle_form_submit($form, $form_state) {
}

แต่ฉันไม่แน่ใจว่าสิ่งที่ควรไปใน_handle_form_submitฟังก์ชั่นการตรวจสอบแล้วส่งคืนข้อความหรือส่งแบบฟอร์มและเขตข้อมูลรีเซ็ต?

คำตอบ:


-2

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


1
ขอโทษ - ฉันไม่สามารถหาตัวอย่างของ ajaxy validataion ในโมดูลตัวอย่าง
ErichBSchulz

ใช่นั่นเป็นคำตอบป่องที่นั่น ที่จริงแล้วฉันไม่เห็นการตรวจสอบใด ๆ การโทรกลับแต่ละครั้งจะส่งคืนแบบฟอร์ม
AlxVallejo

2
นี่เป็นคำตอบที่ยอมรับได้อย่างไร ไม่แม้แต่จะบอกตำแหน่งที่จะดูในลิงก์ที่ให้ไว้ (และลิงก์ไม่มีตัวอย่างการตรวจสอบความถูกต้องอยู่ดี)
robinmitra

ลิงก์ใหม่สำหรับตัวอย่างในรูปแบบ ajax: cgit.drupalcode.org/examples/tree/ajax_example/…
Brentg

ฉันตอบวิกิเนื่องจากเป็นที่ยอมรับ แต่มีคุณภาพต่ำ
rocketeerbkw

11

ฉันรู้ว่านี่เป็นคำถามที่ตั้งคำถามกันมาสองสามปีแล้ว แต่ฉันไม่รู้สึกว่าคำตอบอื่น ๆ จะได้รับการตอบแบบฟอร์ม Drupal 7 ajax ดังนั้นฉันจะพยายามอธิบาย

บาปแบบฟอร์มของคุณควรทำงานได้ดีโดยไม่ต้อง ajax ตามหลักปฏิบัติที่ดี ajax submit handler ไม่ควรทำอะไรเลยนอกจากส่งแบบฟอร์มกลับมา ทุกอย่างอื่นควรอยู่ในการตรวจสอบและส่งฟังก์ชั่นของคุณ

function ex_form($form, $form_state) {
  $form['name'] = array(
    '#type' => 'textfield',
     '#title' => t('Name'),
     '#default_value' => '',
     '#maxlength' => '128',
     '#required' => TRUE,
  );

  $form['submit'] = array(
   '#type' => 'submit',
   '#value' => 'Submit',
   '#ajax' => array(
     'callback' => 'ex_form_ajax_handler',
     'effect' => 'fade',
   ),
  );
}

function ex_form_submit(&$form, &$form_state) {
  // Submit logic - runs when validation is ok
  // You can alter the form here to be just a markup field if you want.
}

function ex_form_validate(&$form, &$form_state) {
  // Validation logic - invalidate using form_set_error() or form_error()
}

function ex_form_ajax_handler(&$form, &$form_state) {
  return $form;
}

น่าจะเป็นคำตอบที่ดีที่สุด
Andrew Kozoriz

คุณกำลังบอกว่าวิธีการตรวจสอบและส่งจะถูกเรียกโดยอัตโนมัติสำหรับการโทรกลับ AJAX ที่ปุ่มส่งหรือไม่ วิธีการที่ได้รับเรียกว่าอะไร?
Jeff

3

ฉันคิดว่าโพสต์โดย maxtorete เมื่อวันที่ 17 ตุลาคม 2011ดูเหมือนจะให้ตัวอย่างที่สมบูรณ์ยิ่งขึ้นโดยใช้ทั้งสองform_validate()และform_submit()

(ฉันยังไม่ได้ทดสอบเลย)

นอกจากนี้คำตอบของ Joshua Stewardson ที่overflow ของ stackมีตัวอย่างการทำงานที่ดี:

function dr_search_test_form($form, &$fstate) {

  $form['wrapper'] = [
    '#markup' => '<div id="test-ajax"></div>',
  ];

  $form['name'] = [
    '#type'     => 'textfield',
    '#required' => TRUE,
    '#title'    => 'Name',
  ];

  $form['submit'] = [
    '#type'  => 'submit',
    '#value' => 'Send',
    '#ajax'  => [
      'callback' => 'dr_search_test_form_callback',
      'wrapper'  => 'test-ajax',
      'effect'   => 'fade',
    ],
  ];

  return $form;
}

function dr_search_test_form_callback($form, &$fstate) {

  return '<div id="test-ajax">Wrapper Div</div>';
}

function dr_search_test_form_validate($form, &$fstate) {

  form_set_error('name', 'Some error to display.');
}

Joshua ทำให้จุดที่ข้อความแสดงข้อผิดพลาดในการตรวจสอบแทนที่#ajax['wrapper']องค์ประกอบทั้งหมดดังนั้นการติดต่อกลับของคุณจำเป็นต้องจัดหาองค์ประกอบนี้อีกครั้งในขณะที่คุณแทนที่


เมื่อลิงค์นั้นใช้การไม่ได้มันจะเป็นสัญญาณว่าคำถามนั้นไม่มีความเกี่ยวข้องกันอีกต่อไป!
ErichBSchulz

2
โหวตลงค่อนข้างรุนแรง - แม้ว่ามันจะเป็นแค่ลิงค์ - มันเป็นลิงค์ไปยังคำตอบ - ไม่ใช่แค่ลิงค์ไปยังโมดูลที่ไม่มีคำตอบ - ต่างจากคำตอบที่ยอมรับ !! ต่อไปฉันให้รหัสทำงานบางอย่างในขณะที่ฉันถูก downvoted
ErichBSchulz

ขอบคุณ @ mbomb007 - แก้ไขแล้ว
ErichBSchulz

2

โดยทั่วไปการจัดการการตรวจสอบความถูกต้องและการส่งแบบฟอร์มควรเกิดขึ้นในการเรียกกลับ _validate () และ _submit () ตามปกติ แนวคิดก็คือรูปแบบควรยังคงทำงานได้โดยไม่ต้อง ajax

สวยมากสิ่งเดียวที่ #ajax callbacks ควรทำคือคืนส่วนของแบบฟอร์มที่ควรถูกแทนที่ตาม wrapper ที่กำหนด


2
ระวังถ้อยคำของคุณ การเรียกกลับควรส่งคืนแบบฟอร์มทั้งหมดสร้างขึ้นใหม่จาก form_state การคืนส่วนของแบบฟอร์มเป็นความเข้าใจผิดที่ใหญ่ที่สุดของ Drupal / AHAH ดูkatbailey.net/blog/ahah-drupal-may-it-one-day-live-its-acronym

7
คำถามนี้เกี่ยวกับ Drupal 7 ... AHAH ไม่มีอยู่ใน Drupal อีกต่อไป ใน#ajaxฟังก์ชั่นการโทรกลับใน Drupal 7 คุณจะคืนเฉพาะส่วนที่คุณต้องการแทนที่
Clive

1
@ChrisD ดังที่ไคลฟ์กล่าวถึงนี่คือ Drupal 7 และเรามีเฟรมเวิร์ก ajax ที่ค่อนข้างดีในตอนนี้ที่อนุญาตให้ทำสิ่งแฟนซีทุกชนิดเช่นส่งคืนชิ้นส่วนแยกจากกันหลายแบบและอื่น ๆ
Berdir

@Clive ฉันเจอ ajax อีกฉบับที่เกี่ยวข้องกับปัญหาdrupal.stackexchange.com/a/142316/19205ซึ่งผู้เขียนพูดถึง "รูปแบบที่จะต้องสร้างอีกครั้งหลังจาก items_count เปลี่ยน" ซึ่งเป็น d7 ด้วย ฉันสับสนกับสิ่งที่คำสั่งที่ถูกต้อง (โดยไม่ต้องเถียงใครถูก :-)) คุณช่วยแบ่งปันข้อมูลเกี่ยวกับเรื่องนี้หน่อยได้ไหม?
kiranking

0

มีสองวิธี

1)

function abc_form_validate(&$form, &$form_state) {
  // Validation logic - invalidate using form_set_error() or form_error()
}

function abc_form_ajax_handler(&$form, &$form_state) {
  return $form;
}

2) ตัวอย่างโมดูล http://cgit.drupalcode.org/examples/tree/ajax_example/ajax_example.module?id=refs/heads;id2=7.x-1.x#l402


ตอนนี้ฉันไม่ได้แม่นยำแค่คำตอบของคุณ แต่การจัดรูปแบบนั้นต้องการการปรับปรุงอย่างแน่นอน (หากคุณไม่ต้องการให้ผู้ดูแลลบ) ตรวจสอบหน้าช่วยเหลือหากจำเป็นหรือใช้ปุ่มตัวแก้ไข wysiwyg เพื่อทำเครื่องหมายรหัสของคุณเป็นอย่างน้อย ... รหัส
Pierre.Vriens

รหัสที่จัดรูปแบบไม่ถูกต้องไม่ใช่เหตุผลในการลบคำตอบ มันแค่ต้องการผู้ใช้ที่มีสิทธิ์แก้ไขเพื่อแก้ไข
kiamlaluno

ที่นี่ฉันมาหมดหวังมองหาทางออกเพียง 2 ปีหลังจากคำตอบนี้คลิกลิงค์ที่นำฉันไปสู่ต้นไม้ / สาขาที่ไม่มีอยู่ โปรดอย่าใช้ลิงก์ในคำตอบหรือถ้าคุณวางเนื้อหาในขณะที่เขียน
MacK

0

ในกรณีของฉันโดยใช้submitชนิดที่เกิดจากรูปแบบที่มักจะส่งดังนั้นฉันเปลี่ยนมันไปbuttonกับ#ajaxที่ระบุไว้ จากนั้นฉันต้องทำการตรวจสอบความถูกต้องของฉันในการโทรกลับ ajax

ฉันกำลังทำบานหน้าต่าง ctools; ฉันไม่รู้ว่ามันเล่นหรือเปล่า

function mymodule_form($form, &$form_state) {
  ...
  $form['button'] = array(
    '#type' => 'button',
    '#value' => t('Subscribe'),
    '#ajax' => array(
      'callback' => '_mymodule_ajax',
    ),
  );
  return $form;
}

function _mymodule_ajax($form, &$form_state) {
  if ( ! valid_email_address($form_state['values']['email']) ) {
    form_set_error($form, t('Please enter a valid email address.'));
  } else {
    $form = array(
      '#markup' => t('You have subscribed.'),
    );
  }
  return $form;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.