Điểm:1

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

lá cờ 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
lá cờ cn
Nếu bạn muốn thử thay đổi 404 thành 200, hãy đặt phản hồi chuyển hướng trong trình xử lý sự kiện.
Chris Roditis avatar
lá cờ in
cảm ơn nhưng điều này sẽ chuyển hướng tôi đến một đường dẫn khác, tôi muốn ở lại đường dẫn hiện tại (không tồn tại) và hiển thị nội dung của tôi cùng với biểu mẫu ajax
4uk4 avatar
lá cờ cn
OK, sau đó tôi đọc sai câu cuối cùng của bạn. Liên quan đến chủ đề chính. `/system/404` không trả lại mã trạng thái 404 khi được sử dụng bên ngoài một ngoại lệ. Nó trả về nội dung của system.404 trong một phản hồi 200 và nó hoạt động với Ajax. Chỉ cần kiểm tra nó bằng cách đặt biểu mẫu là nội dung 404.
Chris Roditis avatar
lá cờ in
Cảm ơn bạn đã xem xét nó nhưng để làm cho nó rõ ràng hơn, tôi đang cố gắng hiển thị một biểu mẫu (có nút ajax trong đó), trong trang 404 mặc định. Vì vậy, bất cứ khi nào ai đó truy cập vào một trang không tồn tại, thông báo "Không tìm thấy trang" sẽ xuất hiện và bên dưới nó là biểu mẫu. Vấn đề là nút ajax không hoạt động.
4uk4 avatar
lá cờ cn
Như đã giải thích, tôi không thể tạo lại sự cố. Tuyến hệ thống/404 trả về 200 (không phải 404 như bạn đã đề cập) và các hành động Ajax trên tuyến này hoạt động mà không gặp sự cố trong các thử nghiệm của tôi với hai biểu mẫu khác nhau, biểu mẫu tùy chỉnh và biểu mẫu lõi (biểu mẫu chỉnh sửa nút).
Chris Roditis avatar
lá cờ in
Đường dẫn mà tôi quan tâm không phải là hệ thống/404, mà là bất kỳ đường dẫn không tồn tại ngẫu nhiên nào.Vì vậy, tôi quan tâm đến cuộc gọi của tuyến đường 'system.404' *trong* ngoại lệ NotFoundHttpException, không phải bên ngoài một. Chỉ khi 404 Không tìm thấy được đưa ra.
4uk4 avatar
lá cờ cn
Tôi cũng đã đặt cả hai biểu mẫu kiểm tra trong 404 của một đường dẫn ngẫu nhiên không tồn tại. Nguyên nhân đáng lo ngại là các yêu cầu tiếp theo đối với hệ thống/404, trong trường hợp của tôi trả về mã trạng thái 200 và trong trường hợp của bạn là mã trạng thái 404, mà tôi không thể tạo lại.
Điểm:0
lá cờ cn

Biểu mẫu Ajax bên trong bộ điều khiển tuyến system.404 tùy chỉnh không hoạt động

Ví dụ: một biểu mẫu nút được trả về từ bộ điều khiển:

<?php

không gian tên Drupal\mymodule\Controller;    

sử dụng Drupal\node\Entity\Node;

lớp MyController mở rộng ControllerBase {

  hàm công khai on404() {
    $node = Node::create(['type' => 'article']);
    trả về $this->entityFormBuilder()->getForm($node);
  }

}

Dạng nút có đầy đủ chức năng bao gồm các thao tác Ajax phức tạp như mở trình duyệt phương tiện.

Mã trạng thái 404 hoặc 200

Vấn đề là tôi cũng đang kết xuất một biểu mẫu có chứa phần tử Ajax (a nút), không hoạt động vì rõ ràng yêu cầu Ajax là được thực hiện theo đường dẫn sau:

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

không bất ngờ, trả về Mã trạng thái: 404 Not Found

Điều này là không đúng sự thật, một yêu cầu cho /hệ thống/404 trả về mã trạng thái 200 khi được gọi bên ngoài trình xử lý ngoại lệ, chẳng hạn như trong yêu cầu ajax. Các hệ thống.404 tuyến đường là một tuyến đường bình thường được thực hiện bởi trình xử lý ngoại lệ trong một yêu cầu phụ. Trạng thái 404 được thêm vào sau và không phải là một phần của lộ trình này.

Chris Roditis avatar
lá cờ in
"Tuyến system.404 là một tuyến bình thường được thực thi bởi trình xử lý ngoại lệ trong một yêu cầu phụ", điều này đã giúp tôi đi đúng hướng. Cảm ơn vì sự giúp đỡ!

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.