2012-09-25 33 views
0

我需要將URL傳遞給Magento,它應在完成註銷後重定向用戶。要存儲它,我執行以下操作:Magento - 將會話變量傳遞到通過_redirect()調用的頁面

$BackTo = Mage::app()->getRequest()->getParam('backto'); 

if(!empty($BackTo)) { 
    Mage::getSingleton('core/session')->setBackTo($BackTo); 
} 

需要時,我使用Mage::getSingleton('core/session')->getBackTo()檢索URL。問題是,雖然這在登錄時效果很好,但它不適用於註銷(最需要的地方)。我可以存儲會話變量,我也可以立即檢索它,但是,當我處於重定向JavaScript所在的logout.phtml時,此類變量設置爲null

我懷疑Magento在註銷時執行的重定向與這個「消失」會話變量有關,但我不能肯定地說。

爲了完整起見,下面是相關的代碼(這裏有更多的代碼,但它們主要是輔助功能,它們在登出時不會被調用)。

賬戶控制器

class MyPackage_Redirectplugin_AccountController extends Mage_Customer_AccountController { 
    /** 
    * @see AccountController:logoutAction() 
    */ 
    public function logoutAction() { 
     $this->_getSession() 
      ->logout() 
      ->setBeforeAuthUrl(Mage::getUrl()); 

     // Store the "back to" URL in a session variable 
     $this->StoreBackToURL(); 

     $this->_redirect('*/*/logoutSuccess'); 
    } 

protected function StoreBackToURL() { 
    // Store the value of the "backto" argument, if it was passed 
    $BackTo = Mage::app()->getRequest()->getParam('backto'); 

    if(!empty($BackTo)) { 
     Mage::getSingleton('core/session')->setBackTo($BackTo); 
     // At this point I can see the correct value stored in the session variable 
    } 
} 

} 

Logout.phtml

// The following command returns null 
$redirectURL = Mage::getSingleton('core/session')->getBackTo(); 

在此先感謝您的幫助。

更新25年12月9日 - 找到一個解決辦法

因爲我無法找到一個方法來傳遞一個會話變量被重定向打開登出頁面,我選擇了另一種方式:我通過URL傳遞它。具體來說,我實施了logoutAction(),其中調用$this->_redirect('*/*/logoutSuccess', array('myvar' => $MyValue));

在模板中,我必須做重定向,我只需使用Mage::helper('core')->urlDecode(Mage::app()->getRequest()->getParam('myvar'));來讀取這樣的參數。

我知道有可能有更好的方法來實現整個事情,但我需要一個錯誤修復解決方案,這是做這項工作。感謝所有回答的人。

回答

0

更新25年12月9日 - 找到一個解決辦法
此變通辦法也被張貼在問題本身。

由於我找不到將會話變量傳遞到重定向打開的註銷頁面的方式,我選擇了另一種方式:我通過URL傳遞它。具體來說,我實現了一個logoutAction(),其中調用$this->_redirect('*/*/logoutSuccess', array('myvar' => $MyValue));.

在模板中,我必須做重定向,我只需使用Mage::helper('core')->urlDecode(Mage::app()->getRequest()->getParam('myvar'));讀取這樣的參數。

我知道有可能有更好的方法來實現整個事情,但我需要一個錯誤修復解決方案,這是做這項工作。感謝所有回答的人。

1
+0

謝謝,但是,當我回答benmark時,攔截註銷並重定向到其他地方不是問題。整個插件已經完成了這項工作,它只是在將目標URL存儲到會話變量中並將其傳遞給新的logout.phtml時失敗,該新的logout.phtml將執行重定向。我想到了數據庫,但創建一個表,一個模型和整個(慢)ORM的東西只是爲了將一個字符串從一個頁面傳遞到另一個頁面,因此這種路由不可行。無論如何感謝您的建議。 – Diego

2

我看到的最乾淨的選項(無需重寫控制器!)就是觀察動態調度的controller_action_postdispatch_customer_account_logout事件 - 請參閱relevant line fromMage_Core_Controller_Varien_Action::postDispatch()。在控制器操作完成後調用postDispatch()方法。

例觀察者方法:

public function logoutRedirect($obs) 
{ 
    $redirectUrl = Mage::getUrl(/* url args */); 
    $obs->getControllerAction()->getResponse()->setRedirect($redirectUrl); 
} 

這樣做直接在註銷這意味着與JS重定向的logoutSuccess頁面將不被訪問的用戶將重定向到所需的URL。

如果願望是有logoutSuccess頁面呈現爲正常,但重定向到一個不同的URL,這樣就可以實現幾個方面:1。 通過創建自定義模板 2.通過創建一個自定義模板塊類,覆蓋getUrl()方法來檢索您選擇的URL,並將其指定爲在內容區域中呈現的塊(通過刪除或替換customer_logout塊)在自定義佈局XML更新文件中。

+0

謝謝。這裏的問題是100%的模塊已經被覆蓋控制器,理論上它應該可以工作。它實現了一個新的註銷頁面模板,該模板嘗試檢索「我應該在哪裏重定向您」的值並執行重定向。整個邏輯清晰簡單:接收目標URL,將其保存到某個地方,當重定向的時候檢索並在那裏發送用戶。事情是,當新的佈局呈現時,會話變量「消失」,我不明白爲什麼。 – Diego

+0

我仍然很欣賞你的建議,但是,對我來說重寫整個插件(我沒有寫在第一位,我幾乎不瞭解Magento的基本知識)並不可行。 – Diego

相關問題