Я создал веб-форму, используя 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
функцию для проверки, а затем либо вернуть сообщение или отправить форму и сбросить поля?
Я знаю, что этот вопрос лежит уже несколько лет, но я не чувствую, что другие ответы действительно дают смысл представления формы ajax в Drupal 7, поэтому я попытаюсь объяснить это.
Sinve ваша форма должна работать без ajax, в соответствии с хорошей практикой, ваш обработчик отправки ajax ничего не должен делать, кроме как вернуть форму. Все остальное должно быть в вашей проверке и отправке функций.
источник
Я думаю, что пост maxtorete от 17 октября 2011 года, кажется, дает более полный пример, используя
form_validate()
иform_submit()
(Я еще не проверял это.)
Также ответ Джошуа Стюардсона при переполнении стека имеет хороший рабочий пример:
Джошуа подчеркивает, что сообщения об ошибках валидации
#ajax['wrapper']
полностью заменяют элемент, поэтому ваш обратный вызов должен снова пополнить этот элемент при его замене.источник
В общем, проверка и обработка отправки формы должны происходить в обычных обратных вызовах _validate () и _submit (). Идея состоит в том, что формы все еще должны работать без ajax.
Практически единственное, что должны делать обратные вызовы #ajax, это возвращать часть формы, которая должна быть заменена, в соответствии с определенной оболочкой.
источник
#ajax
функции обратного вызова в Drupal 7 вы возвращаете только ту часть формы, которую хотите заменить.Есть два способа
1)
2) Пример модуля http://cgit.drupalcode.org/examples/tree/ajax_example/ajax_example.module?id=refs/heads;id2=7.x-1.x#l402
источник
В моем случае использование
submit
типа приводило к тому, что форма всегда отправлялась, поэтому я изменил ее наbutton
с#ajax
указанным. Затем я должен был выполнить проверку в обратном вызове Ajax.Я делал панель ctools; Я не знаю, играет ли это на этом.
источник