it-swarm.asia

كيفية التحقق من صحة وإرسال نموذج باستخدام AJAX؟

لقد قمت بإنشاء نموذج ويب باستخدام Form API. أنا أستخدم #AJAX خيار الحقل لإضافة AJAX التحقق من الصحة لكل حقل.

هل من الممكن التحقق من صحة النموذج وإرساله باستخدام AJAX بدون إعادة تحميل الصفحة. إذا فشل التحقق من الصحة ، فأنا أريد إظهار رسالة خطأ وإذا نجحت عملية التحقق ، فأنا أريد إظهار رسالة (من الناحية المثالية في مربع تكبير الصورة) وإعادة تعيين حقول النموذج.

الرمز الخاص بي حتى الآن:

$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 وظيفة للتحقق ثم إعادة الرسالة أو إرسال النموذج وإعادة تعيين الحقول؟

12
Camsoft

أعلم أن هذا هو السؤال الذي كان موجودًا منذ بضع سنوات حتى الآن ، لكنني لا أشعر أن أيًا من الإجابات الأخرى تحصل حقًا على نقطة Drupal 7 ajax نموذج إرسال ، لذلك أنا سأحاول شرح ذلك.

يجب أن يعمل نموذج Sinve الخاص بك أيضًا بدون ajax وفقًا للممارسة الجيدة ، يجب ألا يقوم معالج إرسال ajax بأي شيء سوى إعادة النموذج. يجب أن يكون كل شيء آخر في وظائف التحقق من الصحة وإرسالها.

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;
}
11
OWast

أعتقد أن منشور بواسطة maxtorete في 17 أكتوبر 2011 يبدو أنه يعطي مثالاً أكمل باستخدام كل من form_validate() و form_submit()

(لم أختبره بعد.)

أيضا جواب جوشوا ستيواردسون على تجاوز سعة المكدس له مثال عملي لطيف:

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.');
}

يشير جوشوا إلى أن رسائل الخطأ تحل محل #ajax['wrapper'] عنصر تمامًا لذا يحتاج رد الاتصال إلى إعادة تزويد هذا العنصر مرة أخرى أثناء استبداله.

3
ErichBSchulz

بشكل عام ، يجب أن يتم التحقق من الصحة ومعالجة إرسال النموذج في الاستدعاءات _validate () و _submit () المعتادة. الفكرة هي أن النماذج يجب أن تعمل بدون أياكس.

إلى حد كبير الشيء الوحيد الذي يجب أن تقوم به عمليات رد #ajax هو إرجاع جزء من النموذج الذي يجب استبداله ، وفقًا للجزء المحدد.

2
Berdir

في حالتي ، أدى استخدام نوع 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;
}
0
user1359

هناك طريقتان

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

0
Drock