Vallidate and ajax submit

Главные вкладки

Аватар пользователя remmor remmor 14 ноября 2018 в 17:02

Есть простая форма

<?php  public function buildForm(array $formFormStateInterface $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 &$formFormStateInterface $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.

Как исправить проблему, куда редирект засунуть при аяксе? Как проверить, что в форме стандартных ошибок нет?

Комментарии

Аватар пользователя gun_dose gun_dose 14 ноября 2018 в 21:32

Не нужно валидировать в сабмите. Для этого есть отдельный метод https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21Fo...

Он всегда срабатывает перед сабмитом и не даёт форме отправиться, если что-то не так.

Аватар пользователя remmor remmor 15 ноября 2018 в 1:43

Так как сделать так, что бы он сработал после или до запроса через аякс? В сабмите валидации и нет - идет проверка на сервер, это не валидация.
Почему валидация не срабатывает, вот в чем проблема. И как её принудительно вызвать или хотя бы проверить, есть ошибки в отправленной форме? Пробовал проверять как <?php $form_state->hasAnyErrors()?> - не срабатывает

Аватар пользователя remmor remmor 15 ноября 2018 в 8:37

Он объявлен, вот так, как и было до введения аякса.

<?php   public function validateForm(array &$formFormStateInterface $form_state) {
    
parent::validateForm($form$form_state);
  }
?>

Надо как-то по иному? Без аякса работает

Аватар пользователя gun_dose gun_dose 15 ноября 2018 в 9:47

Да, точно, забыл, аяксом же не вызывается валидация. В таком случае я бы попробовал так:

<?php
public function ajaxSubmitCallback(array &$formFormStateInterface $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 с нужным айдишником.

Аватар пользователя remmor remmor 15 ноября 2018 в 13:49

Спасибо, попробую. Про враппер - сейчас там всплывающие окошки выскакивают, будем надеяться так же и продолжат выскакивать, без изменений с wrapper.