Рейтинг:1

Ajax form inside custom system.404 route controller doesn't work

флаг in

I need to display custom logic in 404 pages so I have overridden the route controller of the system.404 route like this:

class RouteSubscriber extends RouteSubscriberBase {

  protected function alterRoutes(RouteCollection $collection) {
    if ($route = $collection->get('system.404')) {
      $route->setDefault('_controller', '\Drupal\mymodule\Controller\myController::on404');
    }
  }
}

So let's say I am currently at the path /non-existing-path and the on404 callback renders my custom content just fine. Problem is I am also rendering a form that contains an Ajax element (a button), which doesn't work because apparently the Ajax request is made towards the following path:

/system/404?q=non-existing-path&destination=non-existing-path&_exception_statuscode=404&ajax_form=1&_wrapper_format=drupal_ajax

which, not unexpectedly, returns a Status Code: 404 Not Found

What am I missing?

--

So far I've tried intercepting the NotFoundHttpException with my own listener and changing it to a HttpException(200) in hopes I could turn a 404 page into a 200 but I am at a loss after that and it seems like an overkill.

4uk4 avatar
флаг cn
Если вы хотите попытаться изменить 404 на 200, установите ответ перенаправления в прослушивателе событий.
Chris Roditis avatar
флаг in
спасибо, но это перенаправит меня на другой путь, я хочу остаться на текущем пути (которого не существует) и отображать мой контент вместе с формой ajax
4uk4 avatar
флаг cn
Хорошо, тогда я неправильно прочитал ваше последнее предложение. Касательно основной темы. `/system/404` не возвращает код состояния 404 при использовании вне исключения. Он возвращает содержимое system.404 в ответе 200 и работает с Ajax. Только что проверил это, установив форму как содержимое 404.
Chris Roditis avatar
флаг in
Спасибо за внимание, но чтобы было понятнее, я пытаюсь отобразить форму (с кнопкой ajax) на странице 404 по умолчанию. Поэтому всякий раз, когда кто-то нажимает на несуществующую страницу, появляется сообщение «Страница не найдена», а под ним форма. Проблема в том, что кнопка ajax не работает.
4uk4 avatar
флаг cn
Как объяснено, я не могу воспроизвести проблему. Маршрут system/404 возвращает 200 (а не 404, как вы упомянули), и действия Ajax по этому маршруту работают без проблем в моих тестах с двумя разными формами: пользовательской формой и основной формой (форма редактирования узла).
Chris Roditis avatar
флаг in
Путь, который меня интересует, - это не system/404, а любой случайный несуществующий путь.Поэтому меня беспокоит вызов маршрута system.404 *внутри* исключения NotFoundHttpException, а не за его пределами. Только когда выдается ошибка 404 Not found.
4uk4 avatar
флаг cn
Я также поместил обе тестовые формы в 404 случайного несуществующего пути. Причиной для беспокойства являются последующие запросы на system/404, которые в моем случае возвращают код состояния 200, а в вашем случае код состояния 404, который я не могу воспроизвести.
Рейтинг:0
флаг cn

Форма Ajax внутри пользовательской системы. Контроллер маршрута 404 работает

Например, форма узла, возвращенная контроллером:

<?php

пространство имен Drupal\mymodule\Controller;    

используйте Drupal\node\Entity\Node;

класс MyController расширяет ControllerBase {

  публичная функция on404() {
    $node = Node::create(['type' => 'article']);
    вернуть $this->entityFormBuilder()->getForm($node);
  }

}

Форма узла полностью функциональна, включая сложные операции Ajax, такие как открытие медиабраузера.

Код состояния 404 или 200

Проблема в том, что я также отображаю форму, содержащую элемент Ajax (a button), который не работает, потому что, по-видимому, запрос Ajax пошел по следующему пути:

/system/404?q=несуществующий-путь&destination=несуществующий-путь&_exception_statuscode=404&ajax_form=1&_wrapper_format=drupal_ajax

который неожиданно возвращает код состояния: 404 Not Found

Это неправда, просьба /система/404 возвращает код состояния 200 при вызове вне обработчика исключений, например, в запросе ajax. система.404 route — это обычный маршрут, который выполняется обработчиком исключений в подзапросе. Статус 404 добавляется позже и не является частью этого маршрута.

Chris Roditis avatar
флаг in
«Маршрут system.404 — это обычный маршрут, который выполняется обработчиком исключений в подзапросе», это помогло указать мне правильное направление. Спасибо за помощь!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.