Есть простая форма
<?php public function buildForm(array $form, FormStateInterface $form_state) {
$form['number1'] = array(
'#type' => 'textfield',
'#title' => $this->t('number1'),
'#required' => TRUE
);
$form['number2'] = array(
'#type' => 'textfield',
'#title' => $this->t('number2')
);
$form['submit'] = [
'#type' => 'submit',
'#name' => 'submit',
'#value' => 'Submit this form',
'#ajax' => [
'callback' => '::ajaxSubmitCallback',
'event' => 'click',
],
];
return $form;
}?>
В ней обязательное поле number1 и необязательное number2, которое нужно проверить чрез ajax и если все ок - отослать форму и редиректнуть на другую страницу.
<?php public function ajaxSubmitCallback(array &$form, FormStateInterface $form_state) {
$all_good = functionValidate(); // тут некая функция для проверки
$response = new AjaxResponse();
if ($all_good) { // тут ошибка
$content['#markup'] = 'wrong fileld number1';
$response->addCommand(new OpenModalDialogCommand('', $content, ['width' => '100', 'height' => '100']));
}
else {//Здесь редиректим
response->addCommand(new RedirectCommand('myurl'));
}
return $response;
}?>
Проблема в том, что в случае успеха проверки стандартной проверки поля number 1 ('#required' => TRUE) нету - даже если оно пустое пойдет редирект.
Как сделать так, чтобы была и стандартная проверка поля number1 и аяксовая проверка поля number2? Пробовал в сабмит редирект писать
<?phppublic function submitForm(array &$form, FormStateInterface $form_state) {
$form_state->setRedirect('myurl');
}?>
При аякс отправке не работает, убираем аякс - начинает редиректить submitForm и проверяться number2.
Как исправить проблему, куда редирект засунуть при аяксе? Как проверить, что в форме стандартных ошибок нет?
Комментарии
Не нужно валидировать в сабмите. Для этого есть отдельный метод https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21Fo...
Он всегда срабатывает перед сабмитом и не даёт форме отправиться, если что-то не так.
Так как сделать так, что бы он сработал после или до запроса через аякс? В сабмите валидации и нет - идет проверка на сервер, это не валидация.
Почему валидация не срабатывает, вот в чем проблема. И как её принудительно вызвать или хотя бы проверить, есть ошибки в отправленной форме? Пробовал проверять как
<?php $form_state->hasAnyErrors()?>
- не срабатываетНикак. Нужно просто объявить этот метод и он будет всегда срабатывать перед сабмитом.
Он объявлен, вот так, как и было до введения аякса.
<?php public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
}?>
Надо как-то по иному? Без аякса работает
Да, точно, забыл, аяксом же не вызывается валидация. В таком случае я бы попробовал так:
<?php
public function ajaxSubmitCallback(array &$form, FormStateInterface $form_state) {
// Вызываем стандартную форму.
$this->validateForm($form, $form_state);
if ($form_state->hasAnyErrors()) {
// Если введены неверные данные, возвращаем форму назад.
// В форме должны быть подсвечены неверные поля.
return $form;
}
$all_good = functionValidate(); // тут некая функция для проверки
$response = new AjaxResponse();
if ($all_good) { // тут ошибка
$content['#markup'] = 'wrong fileld number1';
$response->addCommand(new OpenModalDialogCommand('', $content, ['width' => '100', 'height' => '100']));
}
else {//Здесь редиректим
response->addCommand(new RedirectCommand('myurl'));
}
return $response;
?>
Только надо не забыть добавить в аякс wrapper. И к форме в префиксе и суффиксе добавить div с нужным айдишником.
Спасибо, попробую. Про враппер - сейчас там всплывающие окошки выскакивают, будем надеяться так же и продолжат выскакивать, без изменений с wrapper.
нет, так тоже не работает
<?php $form_state->hasAnyErrors()?>
всегда false;