Same filename and directory in other branches
- 8.9.x core/lib/Drupal/Core/Form/EventSubscriber/FormAjaxSubscriber.php
- 9 core/lib/Drupal/Core/Form/EventSubscriber/FormAjaxSubscriber.php
Namespace
Drupal\Core\Form\EventSubscriber
File
core/lib/Drupal/Core/Form/EventSubscriber/FormAjaxSubscriber.php
View source
<?php
namespace Drupal\Core\Form\EventSubscriber;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\PrependCommand;
use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
use Drupal\Core\Form\Exception\BrokenPostRequestException;
use Drupal\Core\Form\FormAjaxException;
use Drupal\Core\Form\FormAjaxResponseBuilderInterface;
use Drupal\Core\Form\FormBuilderInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\StringTranslation\ByteSizeMarkup;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class FormAjaxSubscriber implements EventSubscriberInterface {
use StringTranslationTrait;
protected $formAjaxResponseBuilder;
protected $messenger;
public function __construct(FormAjaxResponseBuilderInterface $form_ajax_response_builder, TranslationInterface $string_translation, MessengerInterface $messenger) {
$this->formAjaxResponseBuilder = $form_ajax_response_builder;
$this->stringTranslation = $string_translation;
$this->messenger = $messenger;
}
public function onView(ViewEvent $event) {
$request = $event
->getRequest();
if ($request->query
->has(FormBuilderInterface::AJAX_FORM_REQUEST)) {
$request->query
->set(MainContentViewSubscriber::WRAPPER_FORMAT, 'html');
}
}
public function onException(ExceptionEvent $event) {
$exception = $event
->getThrowable();
$request = $event
->getRequest();
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;
}
if ($exception = $this
->getFormAjaxException($exception)) {
$request = $event
->getRequest();
$form = $exception
->getForm();
$form_state = $exception
->getFormState();
$form['#build_id_old'] = $request->request
->get('form_build_id');
try {
$response = $this->formAjaxResponseBuilder
->buildResponse($request, $form, $form_state, []);
$response
->setStatusCode(200);
$event
->allowCustomResponseCode();
$event
->setResponse($response);
} catch (\Exception $e) {
$event
->setThrowable($e);
}
}
}
protected function getFormAjaxException(\Throwable $e) {
$exception = NULL;
while ($e) {
if ($e instanceof FormAjaxException) {
$exception = $e;
break;
}
$e = $e
->getPrevious();
}
return $exception;
}
protected function formatSize($size) {
@trigger_error(__METHOD__ . '() is deprecated in drupal:10.2.0 and is removed from drupal:11.0.0. Use \\Drupal\\Core\\StringTranslation\\ByteSizeMarkup::create() instead. See https://www.drupal.org/node/2999981', E_USER_DEPRECATED);
return format_size($size);
}
public static function getSubscribedEvents() : array {
$events[KernelEvents::EXCEPTION] = [
'onException',
51,
];
$events[KernelEvents::VIEW][] = [
'onView',
1,
];
return $events;
}
}
Classes