2012-11-06 8 views
10

Magentoメッセージに問題があります。理論的には、ストアの一部の部分へのアクセスを制限できるカスタムモジュールを構築しています。私はcontroller_action_predispatchイベントにフックするオブザーバーを作成し、現在の要求にユーザーがアクセスできるかどうかをチェックします。アクションにアクセスできない場合、オブザーバはユーザをリダイレクトし、エラー情報を設定します。ショップ全体をクリックするのを避けるため、顧客が来ているページにリダイレクトURLを設定したいと思います。私はを見て、それが設定されている場合はそれを使用し、そうでなければ私は顧客をホームページにリダイレクトします。問題は、後のケース(ホームページのリダイレクト)ですべてがうまくいくが、リファラーに基づいてURLを設定すると、メッセージボックスにエラーメッセージが表示されないということです。リダイレクト後にMagentoがメッセージを失う

オブザーバー($name変数が文字列である)からコード:私は面白い見つけたもの

Mage::getSingleton('core/session')->addError('Acces to '.$name.' section is denied'); 
$url = Mage::helper('core/http')->getHttpReferer() ? Mage::helper('core/http')->getHttpReferer() : Mage::getUrl(); 
Mage::app()->getResponse()->setRedirect($url); 

は、私はオブザーバーファイルの変更を行うと、それを保存する場合は、次の要求が失敗したということで、 refererにリダイレクトされます。urlはエラー情報を表示しますが、それ以降のメッセージはすべて失われます。

私はこの問題は、(私は.localのドメインを使用しています)完全なURLと私の地元のインスタレーションであると考えていたが、私は

$url = str_replace(Mage::getBaseUrl(), '/', $url); 

を追加しようとしたが、これは助けませんでした。

私はリダイレクトを試みても、結果はまったくなく、header()です。

すべてのキャッシュが無効です。カートリンク(このアカウントのカートが無効になっている)

  • 上(例/顧客/アカウント用)

    1. 私がアクセス可能な任意のページに行くよ
    2. クリック:問題をトリガーするワークフローは次のようです/顧客/アカウントに戻り、エラーメッセージが再び
    3. 戻る/顧客/アカウントが、エラーメッセージなしにカートリンク上
    4. クリックして表示される

    見た目のヒントがあれば幸いです。

  • +0

    キャッシュに問題があるかどうかを確認するために、すべてのキャッシュを無効にすることはできますか(magento EEの場合は+ FPC)?ところで、私はすべての説明を理解していない、セッションエラーメッセージが最初の表示の後に削除されることを理解していますか? –

    +0

    私は説明を展開し、今はっきりしていることを願っています。 – Zefiryn

    答えて

    4

    あなたのメッセージが原因で迷子controller_action_predispatchのリダイレクトに好ましくない方法を使用します。あなたのソリューションは、一方では "メッセージの消失"を引き起こし、他方では、サーバーの処理能力を無駄にします。

    Mage_Core_Controller_Varien_Action::dispatch()を見ると、ソリューションが現在のアクションの実行を停止することはありませんが、リダイレクトで解決されるはずです。代わりにMagentoは、前に追加したメッセージのレンダリングを含め、現在のアクションを最後まで実行します。だから、なぜ次のクライアントリクエストでメッセージが失われたのか、Magentoはあなたのリダイレクトを含むサーバーレスポンスで既にレンダリングしていました。

    さらに、Mage_Core_Controller_Varien_Action::dispatch()には現在のアクションの実行を停止し、428 catch (Mage_Core_Controller_Varien_Exception $e) [...]のリダイレクトに直接スキップすることができます。だからあなたはかなり不評であるMage_Core_Controller_Varien_Exceptionを使用しなければならないが、あなたの目的のための唯一の正しい解決策である。唯一の問題は、Magento 1.3.2で導入されて以来、このクラスにバグがあります。しかし、これは簡単に修正することができます。

    だけMage_Core_Controller_Varien_Exceptionから派生し、独自のクラスを作成します。

    /** 
    * Controller exception that can fork different actions, 
    * cause forward or redirect 
    */ 
    class Your_Module_Controller_Varien_Exception 
        extends Mage_Core_Controller_Varien_Exception 
    { 
        /** 
        * Bugfix 
        * 
        * @see Mage_Core_Controller_Varien_Exception::prepareRedirect() 
        */ 
        public function prepareRedirect($path, $arguments = array()) 
        { 
         $this->_resultCallback = self::RESULT_REDIRECT; 
         $this->_resultCallbackParams = array($path, $arguments); 
         return $this; 
        } 
    } 
    

    だからあなたは今それと本当にきれいなソリューションを実装することができます

    /** 
    * Your observer 
    */ 
    class Your_Module_Model_Observer 
    { 
        /** 
        * Called before frontend action dispatch 
        * (controller_action_predispatch) 
        * 
        * @param Varien_Event_Observer $observer 
        */ 
        public function onFrontendActionDispatch($observer) 
        { 
         // [...] 
    
         /* @var $action Mage_Core_Model_Session */ 
         $session = Mage::getSingleton('core/session'); 
         /* @var $helper Mage_Core_Helper_Http */ 
         $helper = Mage::helper('core/http'); 
         // puts your message in the session 
         $session->addError('Your message'); 
         // prepares the redirect url 
         $params = array(); 
         $params['_direct'] = $helper->getHttpReferer() 
          ? $helper->getHttpReferer() : Mage::getHomeUrl(); 
         // force the redirect 
         $exception = new Your_Module_Controller_Varien_Exception(); 
         $exception->prepareRedirect('', $params); 
         throw $exception; 
        } 
    } 
    
    24
    //A Success Message 
    Mage::getSingleton('core/session')->addSuccess("Some success message"); 
    
    //A Error Message 
    Mage::getSingleton('core/session')->addError("Some error message"); 
    
    //A Info Message (See link below) 
    Mage::getSingleton('core/session')->addNotice("This is just a FYI message..."); 
    
    //These lines are required to get it to work 
    session_write_close(); //THIS LINE IS VERY IMPORTANT! 
    $this->_redirect('module/controller/action'); 
    
    // or 
    $url = 'path/to/your/page'; 
    $this->_redirectUrl($url); 
    

    これは、コントローラでは動作しますが、出力がすでに送信された後にリダイレクトしようとしている場合は、あなただけのJavaScriptを使用して行うことができ:

    <script language=”javascript” type=”text/javascript”> 
    window.location.href=”module/controller/action/getparam1/value1/etc"; 
    </script>  
    
    +7

    ありがとうございます、session_write_close();私のためのトリックでした。 –

    +0

    +1 for session_write_close()、永遠に詰まっていた!どうも –

    0

    これは動作しますので、それを試してみてください:

    $url = 'path/to/your/page'; 
    $this->_redirectUrl($url); 
    return false; 
    

    これは、もう何かを実行することを許可していないことを意味します。

    関連する問題