Variável de sessão personalizada não salva

7

Estou tendo um problema com as variáveis ​​de sessão que são salvas após um redirecionamento. Aqui está uma simulação do código relevante:

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

Na classe do controlador:

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

Controlador que o redirecionamento atinge:

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

}

Alguém pode esclarecer por que a quote_idvariável não persiste após o redirecionamento?

Editar 1:

No primeiro controlador:

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

)

No controlador de redirecionamento:

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

)

Resolução:

A Other_Company_SomeControllerclasse substituiu o preDispatchmétodo e não chamou adequadamente a classe pai.

Luke A. Leber
fonte
Está Mage::getSingleton('company_x/session')retornando um Company_X_Model_Sessionobjeto?
precisa saber é o seguinte
Sim, modificarei a pergunta para incluir o print_r do objeto.
22416 Luke A. Leber
Você já tentou definir algo como setFoo('bar')e recuperá-lo posteriormente com êxito?
Julian Lachal # 23/16
Não vejo como a alteração dos nomes das variáveis ​​afetaria o resultado (como a classe base final é um Varien_Object), mas definir a variável 'foo' como 'bar' também não funciona.
22416 Luke A. Leber
Apenas no caso de haver um problema ao usar a cotação.
Julian Lachal # 23/16

Respostas:

2

Cheguei à conclusão de que a Other_Company_SomeControllerclasse teve seu preDispatchmétodo substituído e não estava chamando adequadamente o método pai.

Isso causou todo o problema. Agradeço a todos aqueles que investiram seu tempo e esforço para me ajudar a descobrir isso.

Luke A. Leber
fonte
Olá Luke, você pode adicionar o nome da classe aqui (Other_Company_SomeController). Sim, seu Magento certo está criando outra sessão, acho que você precisa acompanhar todo o roteamento para verificar onde o Magento está criando outra sessão na página redirecionada. Adicione um nome de classe aqui para que eu possa ajudá-lo de alguma forma. Obrigado
Ashish Ranade
Olá Ashish, sou incapaz de fazer isso devido a restrições de licenciamento que colocariam meus empregadores em violação do EULA com o qual concordamos. Eu criei uma substituição local do controlador problemático e isso resolveu o problema.
27616 Luke A. Leber
0

Então, como descobrimos no comentário $session->getSessionId();, você tem dois IDs de sessão diferentes no seu controlador.

Depois de verificar seu código novamente, o erro é tão pequeno que é difícil encontrá-lo.

A razão por trás disso é porque seu construtor está faltando um sublinhado, então, em vez de:

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

Deveria ser:

protected function __construct() {
    $this->init('company_x');
}
Raphael na Digital Pianism
fonte
Oi Raphael, obrigado pela resposta. Fiquei com a impressão de que todas as subclasses de Varien_Object deveriam usar o método _construct (como __construct chama o método _construct internamente). Aceitei o seu conselho e mudei para __construct, mas o problema não foi resolvido. SID Antes: si0v5vff4e3uaht49g4lqud3o5 SID Depois: sj4rlife1bb070npb3se8hjki7 Estou começando a pensar que há um problema mais profundo aqui, pois até uma Mage_Core_Model_Session também está regenerando a sessão. Curiosamente, este é o único lugar no código que as sessões estão se comportando mal ...
Luke A. Leber
@ LukeA.Leber meu palpite é que alguém está acontecendo nos controladores que exclui as sessões definidas anteriormente. Você tem algum módulo personalizado observando um controller_action_predispatch_*evento?
Raphael no Digital Pianism
Olá Raphael, joguei a recompensa em sua direção, porque sua sugestão sobre a verificação dos IDs da sessão me levou a encontrar a resposta que publiquei aqui. Acontece que um controlador de terceiros não conseguiu chamar o preDispatchmétodo pai , o que resultou na instanciação incorreta da sessão.
Luke A. Leber
@ LukeA.Leber obrigado por isso estou feliz que você descobri-lo
Raphael em Digital pianismo