カスタムセッション変数が保存されない


7

リダイレクト後のセッション変数の保存に問題があります。ここに関連するコードのモックがあります:

class Company_X_Model_Session extends Mage_Core_Model_Session_Abstract {
    const KEY_QUOTE = 'quote';

    protected function _construct() {
        $this->init('company_x');
    }

    public function getQuote() {
        if (!$this->hasData(self::KEY_QUOTE)) {

            $quote = Mage::getModel('sales/quote')->setStoreId(Mage::app()->getStore()->getId());
            /* @var $quote Mage_Sales_Model_Quote */

            if ($this->getQuoteId()) {
                $quote->load($this->getQuoteId());
            }
            $this->setData(self::KEY_QUOTE, $quote);
        }
        return $this->getData(self::KEY_QUOTE);
    }

    public function clear() {
        $this->_quote = null;
        $this->setQuoteId(null);
        $this->setLastSuccessQuoteId(null);
        return parent::clear();
    }
}

コントローラークラス:

class Company_X_SomeController extends Other_Company_SomeController {

    protected function relevantAction() {

        $session = Mage::getSingleton('company_x/session');
        /* @var $session Company_X_Model_Session */

        $quote = $session->getQuote();
        /* @var $quote Mage_Sales_Model_Quote */

        $payment = $quote->getPayment();
        $payment->importData(array('method' => 'paypal_express'));

        /// all sorts of interesting quote-setting-up code here         

        $quote->collectTotals()->save();

        /// This variable is not saving properly
        $session->setQuoteId($quote->getId());

        $this->_redirectUrl($quote->getPayment()->getCheckoutRedirectUrl());
    }
}

リダイレクトがヒットするコントローラー:

class Company_X_ExpressController extends Mage_Paypal_ExpressController {

    protected function _getQuote() {
        if(!$this->_quote) {
            $this->_quote = $this->_getCheckoutSession()->getQuote();
        }
        return $this->_quote;
    }

    protected function _getCheckoutSession() {

        /// quote_id is not printed here.
        print_r(Mage::getSingleton('company_x/session')->getData());

        return Mage::getSingleton('company_x/session');
    }

}

リダイレクト後に変数が持続しない理由を誰かが明らかにすることはできますか?quote_id

編集1:

最初のコントローラーで:

Company_X_Model_Session Object
(
    [_skipSessionIdFlag:protected] => 
    [_sessionHosts:protected] => Array
        (
            [company.x.local] => 1
        )

    [_data:protected] => Array
        (
            [_session_validator_data] => Array
                (
                    [remote_addr] => 10.0.2.21
                    [http_via] => 
                    [http_x_forwarded_for] => 
                    [http_user_agent] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
                )

            [quote_id] => 445
        )

    [_hasDataChanges:protected] => 
    [_origData:protected] => 
    [_idFieldName:protected] => 
    [_isDeleted:protected] => 
    [_oldFieldsMap:protected] => Array
        (
        )

    [_syncFieldsMap:protected] => Array
        (
        )

)

リダイレクトコントローラーで:

Company_X_Model_Session Object
(
    [_skipSessionIdFlag:protected] => 
    [_sessionHosts:protected] => Array
        (
            [company.x.local] => 1
        )

    [_data:protected] => Array
        (
            [_session_validator_data] => Array
                (
                    [remote_addr] => 10.0.2.21
                    [http_via] => 
                    [http_x_forwarded_for] => 
                    [http_user_agent] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
                )

        )

    [_hasDataChanges:protected] => 
    [_origData:protected] => 
    [_idFieldName:protected] => 
    [_isDeleted:protected] => 
    [_oldFieldsMap:protected] => Array
        (
        )

    [_syncFieldsMap:protected] => Array
        (
        )

)

解決:

Other_Company_SomeControllerこのクラスは、オーバーライドされたpreDispatchメソッドを、適切に親クラスに通じ呼び出していませんでした。


されてMage::getSingleton('company_x/session')戻ってCompany_X_Model_Sessionオブジェクトを?
Julien Lachal

はい、質問を変更して、オブジェクトのprint_rを含めます。
ルークA.レーバー2016

のようなものを設定してsetFoo('bar')、後で正常に取得してみましたか?
Julien Lachal

変数名の変更が結果にどのように影響するか(最終的な基本クラスはVarien_Objectであるため)はわかりませんが、 'foo'変数を 'bar'に設定しても機能しません。
ルークA.レーバー

見積もりを使用するときに問題が発生した場合に備えて。
Julien Lachal

回答:


2

私は、Other_Company_SomeControllerクラスがそのpreDispatchメソッドをオーバーライドしていて、親メソッドを適切に呼び出さなかったという結論に達しました。

これが問題全体を引き起こした。私がこれを理解するのを助けるために時間と労力を費やしてくれた人々に感謝します。


こんにちは、ルーク、代わりにクラス名をここに追加できますか(Other_Company_SomeController)。はい、正しいMagentoが別のセッションを作成しています。リダイレクトされたページでMagentoが別のセッションを作成している場所を確認するには、ルーティング全体を追跡する必要があると思います。ここにクラス名を追加して、なんとかできるようにしてください。ありがとう
Ashish Ranade

こんにちはアシシュ、私が同意したEULAに私の雇用主を違反させるラ​​イセンス制限のため、私はそれを行うことができません。問題のあるコントローラーのローカルオーバーライドを作成しました。これで問題が解決しました。
ルークA.レーバー2016

0

したがって、を使用したコメントでわかったように、$session->getSessionId();コントローラーには2つの異なるセッションIDがあります。

コードを再度確認した後、エラーは非常に小さいため、見つけるのは困難です。

その背後にある理由は、コンストラクターに下線がないためです:

protected function _construct() {
    $this->init('company_x');
}

そのはず:

protected function __construct() {
    $this->init('company_x');
}

こんにちはラファエル、答えてくれてありがとう。Varien_Objectのすべてのサブクラスが_constructメソッドを使用することになっているという印象を受けました(__constructが_constructメソッドを内部的に呼び出すため)。私はあなたのアドバイスを取り入れて__constructに変更しましたが、問題は解決していません。以前のSID:si0v5vff4e3uaht49g4lqud3o5 SID後:sj4rlife1bb070npb3se8hjki7 Mage_Core_Model_Sessionでもセッションを再生成しているため、ここにはさらに深い問題があると考え始めています。奇妙なことに、これはセッションが...ふらちなされていることをコードで唯一の場所である
ルークA.レーバー

@ LukeA.Leber私の推測では、以前に設定されたセッションを削除するコントローラーで誰かが発生しています。controller_action_predispatch_*イベントを監視しているカスタムモジュールはありますか?
デジタルピアニズムのラファエル、

こんにちはラファエル、セッションIDの確認に関する提案から、私がここに投稿した答えを見つけることができたので、賞金をあなたの方に投げました。サードパーティのコントローラーが親preDispatchメソッドの呼び出しに失敗し、セッションが適切にインスタンス化されないことがわかりました。
ルークA.レーバー

@ LukeA.Leberありがとうございました
デジタルピアニズムのラファエル、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.