Tôi hiện đang phát triển một phần mở rộng Magento có các thành phần chính là tiện ích giao diện người dùng và bảng tùy chọn quản trị viên phụ trợ. Tôi không có bộ điều khiển giao diện người dùng, nhưng tôi có bộ điều khiển adminhtml
gây ra một số rắc rối. Đây là một số mã trong bộ điều khiển của tôi.Magento adminhtml Truy vấn AJAX trả về trạng thái 302
File: /app/code/community/Mynamespace/Myextension/controllers/Adminhtml/MybackendController.php
class Mynamespace_Myextension_Adminhtml_MybackendController
extends Mage_adminhtml_Controller_Action
{
protected function normalAction() {
}
protected function ajaxAction() {
die('got here');
}
}
normalAction
là một hành động mà được gọi bằng cách điều hướng thông qua các liên kết như http://mystore.com/index.php/admin/mybackend/normal/key/.../
. Có một vài hành động như thế này chẳng hạn như index
, save
, edit
, grid
, v.v. Điểm nhập vào bộ điều khiển của tôi là mục nhập dẫn đến hành động index
. Tất cả các hành động như vậy hoạt động như mong đợi.
ajaxAction
là một hành động được gọi chỉ thông qua truy vấn POST của AJAX.
Vấn đề là bất cứ khi nào tôi cố thực hiện điều này, tôi nhận được trả lời mã trạng thái HTTP 302 chuyển hướng đến trang tổng quan quản trị (admin/index/index
). Nếu tôi cố gắng truy cập trực tiếp vào hành động này bằng cách nhập liên kết của nó trong trình duyệt, tôi vẫn nhận được 302. Nếu tôi thêm mục nhập vào tác vụ này, thì nó hoạt động như mong đợi và tôi thấy văn bản "ở đây".
Mã Javascript/jQuery mà không yêu cầu AJAX không phải là phức tạp:
$.post(
'http://mystore.com/index.php/admin/mybackend/ajax/key/.../',
somePostDataObject,
function() {
alert('success');
}
);
Lưu ý rằng chức năng thành công được gọi là mặc dù các mã trạng thái là 302.
tôi đã cố gắng gỡ lỗi cơ chế định tuyến để hiểu chính xác nguyên nhân khiến nó chuyển hướng. Cho đến nay tôi đã suy luận rằng một vấn đề xảy ra trong phương pháp preDispatch
của lớp Mage_Core_Controller_Varien_Action
. Mô-đun, bộ điều khiển và hành động được giải quyết thành công và yêu cầu được đánh dấu là đã gửi đi (_dispatched
thuộc tính là đúng) cho đến khi sự kiện controller_action_predispatch
được gửi đi. Sau khi sự kiện được giải quyết, yêu cầu xuất hiện khi không được gửi đi (_dispatched
trở thành sai). Có lẽ một trong những đối tượng lắng nghe sự kiện này thực hiện thêm một số xử lý theo yêu cầu và từ chối nó. Tôi đã không thể gỡ lỗi sâu hơn điều này.
Thông thường tôi sẽ đăng một số mã để giúp bạn hiểu những gì đang diễn ra tốt hơn, nhưng có khá nhiều dòng để sao chép từ các tệp và lớp cấu hình khác nhau, vì vậy tôi sẽ làm điều đó khi mọi người viết nhận xét hoặc câu trả lời để xem các tệp cụ thể. Cho đến nay, tôi tin rằng cấu hình là chính xác, vì tất cả các chức năng khác ngoài yêu cầu AJAX đang hoạt động ok.
nên bạn đang sử dụng HTTPS? –
Tôi hiện không sử dụng HTTPS (không phải trên giao diện người dùng cũng như trên chương trình phụ trợ). – Grampa