function FormAjaxSubscriber::onException
Same name in other branches
- 9 core/lib/Drupal/Core/Form/EventSubscriber/FormAjaxSubscriber.php \Drupal\Core\Form\EventSubscriber\FormAjaxSubscriber::onException()
- 8.9.x core/lib/Drupal/Core/Form/EventSubscriber/FormAjaxSubscriber.php \Drupal\Core\Form\EventSubscriber\FormAjaxSubscriber::onException()
- 10 core/lib/Drupal/Core/Form/EventSubscriber/FormAjaxSubscriber.php \Drupal\Core\Form\EventSubscriber\FormAjaxSubscriber::onException()
Catches a form AJAX exception and build a response from it.
Parameters
\Symfony\Component\HttpKernel\Event\ExceptionEvent $event: The event to process.
File
-
core/
lib/ Drupal/ Core/ Form/ EventSubscriber/ FormAjaxSubscriber.php, line 83
Class
- FormAjaxSubscriber
- Wraps AJAX form submissions that are triggered via an exception.
Namespace
Drupal\Core\Form\EventSubscriberCode
public function onException(ExceptionEvent $event) {
$exception = $event->getThrowable();
$request = $event->getRequest();
// Render a nice error message in case we have a file upload which exceeds
// the configured upload limit.
if ($exception instanceof BrokenPostRequestException && $request->query
->has(FormBuilderInterface::AJAX_FORM_REQUEST)) {
$this->messenger
->addError($this->t('An unrecoverable error occurred. The uploaded file likely exceeded the maximum file size (@size) that this server supports.', [
'@size' => ByteSizeMarkup::create((int) $exception->getSize()),
]));
$response = new AjaxResponse(NULL, 200);
$status_messages = [
'#type' => 'status_messages',
];
$response->addCommand(new PrependCommand(NULL, $status_messages));
$event->allowCustomResponseCode();
$event->setResponse($response);
return;
}
// Extract the form AJAX exception (it may have been passed to another
// exception before reaching here).
if ($exception = $this->getFormAjaxException($exception)) {
$request = $event->getRequest();
$form = $exception->getForm();
$form_state = $exception->getFormState();
// Set the build ID from the request as the old build ID on the form.
$form['#build_id_old'] = $request->request
->get('form_build_id');
try {
$response = $this->formAjaxResponseBuilder
->buildResponse($request, $form, $form_state, []);
// Since this response is being set in place of an exception, explicitly
// mark this as a 200 status.
$response->setStatusCode(200);
$event->allowCustomResponseCode();
$event->setResponse($response);
} catch (\Exception $e) {
// Otherwise, replace the existing exception with the new one.
$event->setThrowable($e);
}
}
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.