2013-05-01 117 views
7

我目前正在開發一個Magento擴展,其主要組件是前端部件和後端管理選項面板。我沒有前端控制器,但我有一個adminhtml控制器,給我一些麻煩。這裏是我的控制器中的一些代碼。Magento adminhtml AJAX查詢返回302狀態

文件:/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是通過鏈接,如http://mystore.com/index.php/admin/mybackend/normal/key/.../導航稱爲操作。有一些類似的操作,例如index,save,edit,grid等。我的控制器的入口點是一個菜單項,導致index操作。所有這些行動都按預期工作。

ajaxAction是僅通過AJAX POST查詢調用的操作。

問題是,無論何時我嘗試這樣做,我都會收到一個302 HTTP狀態碼回覆,該回復重定向到管理儀表板admin/index/index)。如果我嘗試通過在瀏覽器中輸入鏈接來直接訪問此操作,我仍然會得到一個302.如果我爲此操作添加菜單條目,那麼它按預期方式工作,並看到「到達此處」文本。

的JavaScript/jQuery的代碼,不會AJAX請求並不複雜:

$.post(
    'http://mystore.com/index.php/admin/mybackend/ajax/key/.../', 
    somePostDataObject, 
    function() { 
     alert('success'); 
    } 
); 

注意,成功函數被調用,即使狀態代碼爲302

我試着調試路由機制瞭解究竟是什麼導致它重定向。到目前爲止,我已經推斷在Mage_Core_Controller_Varien_Action類的preDispatch方法中發生了問題。模塊,控制器和操作已成功解決,並且將請求標記爲已分派(_dispatched屬性爲true),直到調度controller_action_predispatch事件。事件解決後,請求顯示爲未被分派(_dispatched變爲false)。據推測,偵聽此事件的其中一個對象會對請求進行一些進一步處理並拒絕它。我還沒有能夠比這更深入地進行調試。

通常我會發布一些代碼,以幫助您更好地理解發生了什麼,但是需要從各種配置文件和類複製很多行,所以我會在人們寫評論或回答時提問查看特定文件。到目前爲止,我相信配置是正確的,因爲除AJAX請求之外的所有其他功能都可以正常工作。

+0

你應該正在使用HTTPS? – 2013-05-01 14:50:49

+0

我根本沒有使用HTTPS(既不在前端也不在後端)。 – Grampa 2013-05-01 15:23:33

回答

25

Url應該是http://mystore.com/index.php/admin/mybackend/ajax/key/.../?isAjax=true,所以magento知道這是一個ajax請求。

此外,您還需要在POST數據中提供from_key,該數據存儲在全局JavaScript變量window.FORM_KEY中。

你的jQuery請求應該是這個樣子:

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

的代碼,這種檢查可以Mage_Adminhtml_Controller_Action找到:: preDispatch(線:164)(Magento的-1.7.0.2)

+0

謝謝你的回答,我很抱歉花了這麼長時間來接受它 - 我不得不在另一個項目上工作。我的請求中缺少「isAjax = true」。這就是爲什麼它不起作用。然而,我並沒有將參數添加到jQuery請求中,而是決定使用Magento通常使用的Prototype樣式請求:「Ajax.Request」。它也會自動添加'isAjax'。將jQuery和Prototype混合使用看起來可能不對,但我仍然需要Prototype來與各種Magento小部件(網格,圖像選擇器等)進行交互,以便最終完成所有工作:) – Grampa 2013-06-15 22:03:13

+0

謝謝,這是我遇到的問題以及。顯然,你可以在不使用表單鍵的情況下創建ajax GET請求,但只要使用POST,它就會開始重定向到沒有它的儀表板。 – 2016-04-20 03:01:33