0

ログアウトの完了後にユーザーをリダイレクトする必要がある URL を Magento に渡す必要があります。それを保存するには、次のようにします。

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

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

必要に応じて、 を使用して URL を取得しますMage::getSingleton('core/session')->getBackTo()。問題は、これはログインではうまく機能しますが、ログアウト (最も必要な場所) では機能しないことです。セッション変数を保存することも、すぐに取得することもできますがlogout.phtml、リダイレクト JavaScript が配置されている にいるとき、そのような変数は に設定され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
    }
}

}

ログアウト.phtml

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

助けてくれてありがとう。

12/09/25 更新 - 回避策を発見

リダイレクトによって開かれたログアウト ページにセッション変数を渡す方法が見つからなかったため、別の方法を選択しました。URL 経由で渡しています。具体的には、logoutAction()which を呼び出すを実装しました$this->_redirect('*/*/logoutSuccess', array('myvar' => $MyValue));

リダイレクトを行う必要があるテンプレートでは、Mage::helper('core')->urlDecode(Mage::app()->getRequest()->getParam('myvar'));.

全体を実装するためのより良い方法があったかもしれないことは承知していますが、バグ修正ソリューションが必要であり、これでうまくいきます。答えてくれたすべての人に感謝します。

4

3 に答える 3

2

私が見た最もクリーンなオプション (コントローラーの書き換えは必要ありません!) は、動的にディスパッチされcontroller_action_postdispatch_customer_account_logoutたイベントを観察することです - の関連する行をMage_Core_Controller_Varien_Action::postDispatch()参照してください。このpostDispatch()メソッドは、コントローラーのアクションが完了した後に呼び出されます。

オブザーバーメソッドの例:

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

これを行うと、ログアウト時にユーザーが目的の URL に直接リダイレクトされます。つまり、JS リダイレクトを含む logoutSuccess ページにはアクセスできません。

logoutSuccess ページを通常どおりレンダリングするが、別の URL にリダイレクトすることが必要な場合は、次の 2 つの方法で実現できます。 1. カスタム テンプレートを作成する 2. カスタム テンプレート ブロック クラスを作成し、getUrl()メソッドをオーバーライドして選択した URL を取得customer_logoutし、カスタム レイアウト XML 更新ファイルで(ブロックを削除または置換することにより) コンテンツ領域にレンダリングするブロックとしてそれを割り当てます。

于 2012-09-25T01:40:24.523 に答える
1

このイベントcustomer_logoutを観察するだけで、イベントがメソッドを呼び出すときに、セッションキーをデータベースに保存します。詳細: http://www.magentocommerce.com/wiki/5_-_modules_and_development/reference/events

http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_method

GL。

于 2012-09-25T01:06:18.360 に答える
0

更新 12/09/25 - 回避策が見つかりました
この回避策は、質問自体にも投稿されています。

リダイレクトによって開かれたログアウト ページにセッション変数を渡す方法が見つからなかったため、別の方法を選択しました。URL 経由で渡しています。具体的には、logoutAction()which を呼び出すを実装しました$this->_redirect('*/*/logoutSuccess', array('myvar' => $MyValue));.

リダイレクトを行う必要があるテンプレートでは、Mage::helper('core')->urlDecode(Mage::app()->getRequest()->getParam('myvar'));.

全体を実装するためのより良い方法があったかもしれないことは承知していますが、バグ修正ソリューションが必要であり、これでうまくいきます。答えてくれたすべての人に感謝します。

于 2012-09-25T18:02:58.047 に答える