Vallidate and ajax submit

Аватар пользователя remmor

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

<?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 &$formFormStateInterface $form_state) {
    
$form_state->setRedirect('myurl');
}
?>

При аякс отправке не работает, убираем аякс - начинает редиректить submitForm и проверяться number2.

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

Тип материала:
Версия Drupal:
0 Thanks

Комментарии

Аватар пользователя remmor
remmor 1 месяц назад

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

Аватар пользователя gun_dose
gun_dose 1 месяц назад

Никак. Нужно просто объявить этот метод и он будет всегда срабатывать перед сабмитом.

Аватар пользователя remmor
remmor 1 месяц назад

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

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

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

Аватар пользователя gun_dose
gun_dose 1 месяц назад

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

<?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 1 месяц назад

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

Аватар пользователя remmor
remmor 2 недели назад

нет, так тоже не работает
<?php $form_state->hasAnyErrors()?> всегда false;