2012-11-05 23 views
5

我無法在觀察者中創建Magento中的工作重定向。Magento從始終工作的觀察者重定向

據我所知,有很多事件獲得響應對象(在$observer對象中)。 另一種方式是由偉大的阿蘭風暴這裏提到https://stackoverflow.com/a/4730200/1700048使用類似

Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart')); 

不幸的是這並沒有爲我工作,甚至當我添加sendResponse()這樣的:

Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart'))->sendResponse(); 

例如:

我想防止一些電子郵件地址,通訊訂閱。 因此我爲newsletter_subscriber_save_before事件創建了一個觀察者。

在我的觀察者方法中,我檢查了一些情況,如果它們觸發,我想防止保存訂閱通訊。 我的計劃是添加這樣的錯誤:

Mage::getSingleton('checkout/session')->addError('Email is spam!'); 

,只是讓當前頁面重載(顯示錯誤消息)與重定向的上方(在本例中checkout/cart只是看到它確實有效) 。

不幸的是,重定向不起作用。 爲什麼sendResponse在這種情況下不發送響應?

感謝您的幫助:)

+0

最接近solutiuon的方法似乎就像這裏討論:http://www.magentocommerce。com/boards/viewthread/15792 /#t325035 Mage :: app() - > getResponse() - > setRedirect($ url); Mage :: app() - > getResponse() - > sendResponse(); 退出; exit()對此起作用是必不可少的。不幸的是,這在某些情況下導致了包括回滾錯誤的一些錯誤。我不確定它是否足夠乾淨以成爲一般解決方案的基礎。 – Celldweller

+0

對於Magento 2我們可以做什麼? –

回答

0

這應該很好地工作:■

您是否嘗試過剛剛setRedirect()調用後立即退出腳本,看看它肯定到達那裏?

+0

是的。我絕對在那裏。 當我用Mage :: log()記錄響應對象時,我可以看到重定向信息在那裏。 問題是sendResponse方法似乎什麼都不做,所以通訊SubscriberController(newAction)在最後重置它並執行$ this - > _ redirectReferer() – Celldweller

+0

嗯那麼你可能會拋出異常而不是添加錯誤消息嗎?建議在這裏:http://stackoverflow.com/questions/5425416/stopping-product-saving-process-in-observer – HughieW

+0

是的。應該是一個聰明的方法。我已經嘗試過了。這裏的問題是app \ code \ core \ Mage \ Newsletter \ controllers \ SubscriberController.php捕獲所有異常。所以我不幸的是不能用prepareForward拋出我自己準備好的異常。 沒有異常捕捉通訊控制器它將是一個偉大的方式。 我一直希望能找到一個始終有效的解決方案。無論我在哪個觀察者。我希望法師:: app:getResponse的方式是這樣的 – Celldweller

0

而不是創建一個觀察者,你有沒有想過用自己的自定義模塊覆蓋保存新聞字母控制器,並在那裏發送垃圾信息,然後在邏輯下添加新聞字母代碼。

您也可以將保存新聞信件的URL更改爲新的自定義模塊網址,然後執行垃圾郵件過濾器,如果您認爲這是一個有效的電子郵件,那麼您需要向常規保存新聞郵件進行內部轉發(請參閱how to call one action from another in magento?

所以你不會有從控制器

+0

感謝您的建議。它會按照你的建議工作,但是我希望我可以繞過觀察者覆蓋的需要。 這不是我第一次需要停止觀察者內部的正常工作流程並進行自定義重定向 我的希望得到一個適用於所有觀察者的通用解決方案,而不僅僅是明確得到響應對象的觀察者。 我仍然不明白爲什麼像Mage :: app() - > getResponse() - > setRedirect (Mage :: getUrl('checkout/cart')) - > sendResponse();不能在觀察者內工作。 – Celldweller

15

這工作重定向任何問題,但它是不是超級優雅:

Mage::getSingleton('core/session')->addError('Email is spam!'); 
Mage::app()->getFrontController()->getResponse()->setRedirect(Mage::getUrl('checkout/cart')); 
Mage::app()->getResponse()->sendResponse(); 
exit; 
7

我要短,正確Silas Palmer的代碼。

Mage::getSingleton('checkout/session')->addError('Email is spam!'); 
Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart'))->sendResponse(); 
exit; 

希望這可以幫助別人!