Как убрать ошибку на форме при redirect в DRUPAL 8?

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

Аватар пользователя pingvin156 pingvin156 26 октября 2018 в 9:10

При нажатии на кнопку submit перенаправляю пользователя на ту же самую страницу, но с другими параметрами.
В функции, которая вызывается при submit вставил:
$form_state->setRedirect('article.EditWorkOrder', array('ID'=>1));
Естественно на этой странице есть та самая форма, которая отправляет данные. Получается так, что вылезает ошибка на незаполенные параметры формы... хотя я всё заполнил до нажатия на submit.
Как этого избежать?

Лучший ответ

Аватар пользователя gun_dose gun_dose 26 октября 2018 в 15:51
1

Я вспомнил. При рендеринге формы проверяются заголовки текущего запроса, и если там есть form_id, совпадающий с айдишником текущей формы, то предпринимается попытка её отправки. А поскольку форма пустая, то все обязательные поля кидают ошибку. Чтобы этого не происходило, можно из стека запросов удалить всё лишнее. Я делал это так:

<?php
$request 
= \Drupal::service('request_stack')->getCurrentRequest();
    if (!empty(
$request->request->all())) {
      
$new_request $request->duplicate([], []);
      while (\
Drupal::service('request_stack')->getCurrentRequest()) {
        \
Drupal::service('request_stack')->pop();
      }
      \
Drupal::service('request_stack')->push($new_request);
    }
?>

На самом деле это довольно топорный и изощрённый хак, но другого решения мне не удалось найти.

Комментарии

Аватар пользователя pingvin156 pingvin156 26 октября 2018 в 9:44

"Обязательное поле "Изображение" не заполнено".
Это контактная форма. Она кроме всего прочего отсылает картинку

Аватар пользователя gun_dose gun_dose 26 октября 2018 в 15:51
1

Я вспомнил. При рендеринге формы проверяются заголовки текущего запроса, и если там есть form_id, совпадающий с айдишником текущей формы, то предпринимается попытка её отправки. А поскольку форма пустая, то все обязательные поля кидают ошибку. Чтобы этого не происходило, можно из стека запросов удалить всё лишнее. Я делал это так:

<?php
$request 
= \Drupal::service('request_stack')->getCurrentRequest();
    if (!empty(
$request->request->all())) {
      
$new_request $request->duplicate([], []);
      while (\
Drupal::service('request_stack')->getCurrentRequest()) {
        \
Drupal::service('request_stack')->pop();
      }
      \
Drupal::service('request_stack')->push($new_request);
    }
?>

На самом деле это довольно топорный и изощрённый хак, но другого решения мне не удалось найти.