2013-05-01 25 views
7

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.

+0

nên bạn đang sử dụng HTTPS? –

+0

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

Trả lời

25

Url phải là http://mystore.com/index.php/admin/mybackend/ajax/key/.../?isAjax=true, vì vậy Magento biết đây là yêu cầu ajax.

Ngoài ra, bạn cần phải cung cấp from_key trong dữ liệu POST của mình được lưu trữ trong Biến JavaScript toàn cục window.FORM_KEY.

Yêu cầu jQuery bạn nên tìm một cái gì đó như thế này:

function magentoAdminAjax(data, callback) { 
    data.form_key = window.FORM_KEY; 
    $.post(
     'http://mystore.com/index.php/admin/mybackend/ajax/key/.../?isAjax=true', 
     data, 
     callback 
    ); 
} 

Bộ luật cho việc kiểm tra này có thể được tìm thấy trong Mage_Adminhtml_Controller_Action :: preDispatch (Line: 164) (magento-1.7.0.2)

+0

Cảm ơn bạn đã trả lời và tôi xin lỗi vì đã dành một thời gian dài để chấp nhận nó - tôi đã phải làm việc trên một dự án khác trong thời gian chờ đợi. Tôi đã thiếu 'isAjax = true' trong các yêu cầu của tôi. Đây là lý do tại sao nó không hoạt động. Tuy nhiên, thay vì thêm tham số vào yêu cầu jQuery, tôi quyết định đi với các yêu cầu kiểu Prototype mà Magento thường sử dụng: 'Ajax.Request'. Nó cũng tự động thêm 'isAjax'. Có vẻ như không hợp với jQuery và Prototype, nhưng tôi vẫn cần Prototype để giao tiếp với các widget Magento khác nhau (lưới, hình chọn, vv) vì vậy cuối cùng nó hoạt động :) – Grampa

+0

Cảm ơn, đây là vấn đề tôi gặp phải cũng. Rõ ràng bạn có thể yêu cầu ajax GET mà không có khóa biểu mẫu, nhưng ngay sau khi bạn sử dụng POST nó bắt đầu chuyển hướng đến bảng điều khiển mà không có nó. –