При нажатии на кнопку submit перенаправляю пользователя на ту же самую страницу, но с другими параметрами.
В функции, которая вызывается при submit вставил:
$form_state->setRedirect('article.EditWorkOrder', array('ID'=>1));
Естественно на этой странице есть та самая форма, которая отправляет данные. Получается так, что вылезает ошибка на незаполенные параметры формы... хотя я всё заполнил до нажатия на submit.
Как этого избежать?
Как убрать ошибку на форме при redirect в DRUPAL 8?
Главные вкладки
Лучший ответ
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);
}
?>
На самом деле это довольно топорный и изощрённый хак, но другого решения мне не удалось найти.
Комментарии
Какая?
"Обязательное поле "Изображение" не заполнено".
Это контактная форма. Она кроме всего прочего отсылает картинку
А переадресация происходит? Если редирект убрать, форма нормально отправляется?
Если редирект убрать, то всё окей!
А при открытии ссылки с параметрами в новой вкладке тоже всё ок?
Да, косяк с картинкой появляется только при редиректе
Я вспомнил. При рендеринге формы проверяются заголовки текущего запроса, и если там есть 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);
}
?>
На самом деле это довольно топорный и изощрённый хак, но другого решения мне не удалось найти.
Картинка загружается на сервер предварительно, вообще надо юзать формстаты как в многошаговой форме см. например examples
Спасибо! Сейчас почитаю