Benutzerdefinierte Sitzungsvariable wird nicht gespeichert

7

Ich habe ein Problem mit dem Speichern von Sitzungsvariablen nach einer Umleitung. Hier ist ein Modell des relevanten Codes:

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();
    }
}

In der Controller-Klasse:

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());
    }
}

Controller, den die Umleitung trifft:

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');
    }

}

Kann jemand etwas Licht ins Dunkel bringen, warum die quote_idVariable nach der Umleitung nicht bestehen bleibt?

Bearbeiten 1:

In der ersten Steuerung:

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
        (
        )

)

In der Umleitungssteuerung:

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
        (
        )

)

Auflösung:

Die Other_Company_SomeControllerKlasse hatte die preDispatchMethode überschrieben und die übergeordnete Klasse nicht ordnungsgemäß aufgerufen.

Luke A. Leber
quelle
Gibt Mage::getSingleton('company_x/session')ein Company_X_Model_SessionObjekt zurück?
Julien Lachal
Ja, ich werde die Frage so ändern, dass sie print_r des Objekts enthält.
Luke A. Leber
Haben Sie versucht, so etwas einzustellen setFoo('bar')und später erfolgreich abzurufen?
Julien Lachal
Ich sehe nicht, wie sich das Ändern der Variablennamen auf das Ergebnis auswirken würde (da die ultimative Basisklasse ein Varien_Object ist), aber das Setzen der Variablen 'foo' auf 'bar' funktioniert auch nicht.
Luke A. Leber
Nur für den Fall, dass bei der Verwendung des Angebots ein Problem aufgetreten wäre.
Julien Lachal

Antworten:

2

Ich bin zu dem Schluss gekommen, dass die Methode der Other_Company_SomeControllerKlasse preDispatchüberschrieben wurde und die übergeordnete Methode nicht ordnungsgemäß aufgerufen wurde.

Dies verursachte das gesamte Problem. Vielen Dank an diejenigen, die ihre Zeit und Mühe investiert haben, um mir dabei zu helfen, dies herauszufinden.

Luke A. Leber
quelle
Hallo Luke, kannst du stattdessen hier den Klassennamen hinzufügen (Other_Company_SomeController). Ja, Ihr rechtes Magento erstellt eine weitere Sitzung. Ich denke, Sie müssen das gesamte Routing verfolgen, um zu überprüfen, wo Magento auf einer umgeleiteten Seite eine weitere Sitzung erstellt. Fügen Sie hier einen Klassennamen hinzu, damit ich Ihnen irgendwie helfen kann. Vielen Dank
Ashish Ranade
Hallo Ashish, ich kann dies aufgrund von Lizenzbeschränkungen, die meine Arbeitgeber gegen die von uns vereinbarte EULA verstoßen würden, nicht tun. Ich habe eine lokale Überschreibung des problematischen Controllers erstellt und das Problem dadurch behoben.
Luke A. Leber
0

Wie wir im Kommentar mit herausgefunden haben $session->getSessionId();, haben Sie zwei verschiedene Sitzungs-IDs in Ihrem Controller.

Nachdem Sie Ihren Code erneut überprüft haben, ist der Fehler so gering, dass Sie ihn nur schwer finden können.

Der Grund dafür ist, dass Ihrem Konstruktor ein Unterstrich fehlt. Statt:

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

Es sollte sein:

protected function __construct() {
    $this->init('company_x');
}
Raphael beim digitalen Pianismus
quelle
Hallo Raphael, danke für die Antwort. Ich hatte den Eindruck, dass alle Unterklassen von Varien_Object die _construct-Methode verwenden sollten (wie __construct die _construct-Methode intern aufruft). Ich habe Ihren Rat befolgt und ihn in __construct geändert, das Problem ist jedoch nicht behoben. SID Vorher: si0v5vff4e3uaht49g4lqud3o5 SID Nachher: ​​sj4rlife1bb070npb3se8hjki7 Ich fange an zu denken, dass es hier ein tieferes Problem gibt, da sogar eine Mage_Core_Model_Session die Sitzung ebenfalls neu generiert. Seltsamerweise ist dies der einzige Ort im Code, an dem sich Sitzungen schlecht benehmen ...
Luke A. Leber
@ LukeA.Leber Ich vermute, dass in den Controllern jemand passiert, der die zuvor festgelegten Sitzungen löscht. Haben Sie benutzerdefinierte Module, die controller_action_predispatch_*möglicherweise ein Ereignis beobachten ?
Raphael bei Digital Pianism
Hallo Raphael, ich habe das Kopfgeld in deine Richtung geworfen, weil dein Vorschlag zur Überprüfung der Sitzungs-IDs mich dazu veranlasst hat, die Antwort zu finden, die ich hier gepostet habe. Es stellt sich heraus, dass ein Controller eines Drittanbieters die übergeordnete preDispatchMethode nicht aufrufen konnte, was dazu führte, dass die Sitzung nicht ordnungsgemäß instanziiert wurde.
Luke A. Leber
@ LukeA.Leber danke dafür Ich bin froh, dass du es herausgefunden hast
Raphael bei Digital Pianism