Puncte:1

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

drapel 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
drapel cn
Dacă doriți să încercați să schimbați 404 cu un 200, setați un răspuns de redirecționare în ascultatorul de evenimente.
Chris Roditis avatar
drapel in
mulțumesc, dar acest lucru mă va redirecționa către o altă cale, vreau să rămân la calea curentă (care nu există) și să îmi redau conținutul împreună cu forma ajax
4uk4 avatar
drapel cn
Bine, atunci am citit greșit ultima ta propoziție. Referitor la subiectul principal. `/system/404` nu returnează un cod de stare 404 atunci când este utilizat în afara unei excepții. Returnează conținutul sistemului.404 într-un răspuns de 200 și funcționează cu Ajax. Tocmai l-am testat setând un formular ca conținut 404.
Chris Roditis avatar
drapel in
Vă mulțumesc că ați analizat, dar pentru a fi mai clar, încerc să redau un formular (cu un buton ajax în el), în pagina implicită 404. Deci, ori de câte ori cineva lovește o pagină inexistentă, apare mesajul „Pagină negăsită” și sub ea formularul. Problema este că butonul ajax nu funcționează.
4uk4 avatar
drapel cn
După cum am explicat, nu pot reproduce problema. Ruta system/404 returnează un 200 (nu un 404 așa cum ați menționat) și acțiunile Ajax pe această rută funcționează fără probleme în testele mele cu două formulare diferite, un formular personalizat și un formular de bază (formular de editare a nodului).
Chris Roditis avatar
drapel in
Calea de care mă interesează nu este system/404, ci orice cale aleatorie inexistentă.Prin urmare, sunt preocupat de apelul rutei „system.404” *în* excepția NotFoundHttpException, nu în afara uneia. Numai când se aruncă un 404 Not found.
4uk4 avatar
drapel cn
Am plasat ambele forme de testare într-un 404 dintr-o cale aleatorie inexistentă. Motiv de îngrijorare sunt cererile ulterioare pentru system/404, care în cazul meu returnează un cod de stare 200 și în cazul tău un cod de stare 404, pe care nu îl pot reproduce.
Puncte:0
drapel cn

Formularul Ajax în interiorul sistemului personalizat. Controlerul de rută 404 funcționează

De exemplu, un formular de nod returnat de la controler:

<?php

spațiu de nume Drupal\mymodule\Controller;    

utilizați Drupal\node\Entity\Node;

clasa MyController extinde ControllerBase {

  funcție publică pe404() {
    $node = Node::create(['tip' => 'articol']);
    returnează $this->entityFormBuilder()->getForm($node);
  }

}

Forma nodului este complet funcțională, inclusiv operațiuni complexe Ajax, cum ar fi deschiderea browserului media.

Cod de stare 404 sau 200

Problema este că redau și un formular care conține un element Ajax (a butonul), care nu funcționează deoarece se pare că cererea Ajax este făcut pe următorul drum:

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

care, nu în mod neașteptat, returnează un cod de stare: 404 Not Found

Acest lucru nu este adevărat, o cerere pentru /system/404 returnează un cod de stare 200 atunci când este apelat în afara unui handler de excepții, de exemplu într-o solicitare ajax. The sistem.404 ruta este o rută normală care este executată de handlerul de excepții într-o sub-cerere. Starea 404 este adăugată mai târziu și nu face parte din această rută.

Chris Roditis avatar
drapel in
„Ruta system.404 este o rută normală care este executată de handlerul de excepții într-o solicitare secundară”, acest lucru m-a ajutat să îndrume în direcția corectă. Mulțumesc pentru tot ajutorul!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.