لقد قمت بإنشاء نموذج ويب باستخدام 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
وظيفة للتحقق ثم إعادة الرسالة أو إرسال النموذج وإعادة تعيين الحقول؟
أعلم أن هذا هو السؤال الذي كان موجودًا منذ بضع سنوات حتى الآن ، لكنني لا أشعر أن أيًا من الإجابات الأخرى تحصل حقًا على نقطة 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;
}
أعتقد أن منشور بواسطة 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']
عنصر تمامًا لذا يحتاج رد الاتصال إلى إعادة تزويد هذا العنصر مرة أخرى أثناء استبداله.
بشكل عام ، يجب أن يتم التحقق من الصحة ومعالجة إرسال النموذج في الاستدعاءات _validate () و _submit () المعتادة. الفكرة هي أن النماذج يجب أن تعمل بدون أياكس.
إلى حد كبير الشيء الوحيد الذي يجب أن تقوم به عمليات رد #ajax هو إرجاع جزء من النموذج الذي يجب استبداله ، وفقًا للجزء المحدد.
في حالتي ، أدى استخدام نوع 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;
}
هناك طريقتان
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