Biến phiên tùy chỉnh không lưu


7

Tôi đang gặp vấn đề với việc lưu biến phiên sau khi chuyển hướng. Đây là một bản mô phỏng mã liên quan:

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

Trong lớp trình điều khiển:

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

Trình điều khiển mà chuyển hướng nhấn:

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

}

Bất cứ ai cũng có thể làm sáng tỏ lý do tại sao quote_idbiến không tồn tại sau khi chuyển hướng?

Chỉnh sửa 1:

Trong bộ điều khiển đầu tiên:

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

)

Trong bộ điều khiển chuyển hướng:

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

)

Nghị quyết:

Các Other_Company_SomeControllerlớp học đã ghi đè các preDispatchphương pháp và đã không gọi đúng thông qua các tầng lớp phụ huynh.


Mage::getSingleton('company_x/session')trả lại một Company_X_Model_Sessionđối tượng?
Julien Lachal

Có, tôi sẽ sửa đổi câu hỏi để bao gồm print_r của đối tượng.
Luke A. Leber

Bạn đã thử thiết lập một cái gì đó như setFoo('bar')và lấy nó thành công sau này?
Julien Lachal

Tôi không thấy việc thay đổi tên biến sẽ ảnh hưởng đến kết quả như thế nào (vì lớp cơ sở cuối cùng là Varien_Object), nhưng việc đặt biến 'foo' thành 'bar' cũng không hoạt động.
Luke A. Leber

Chỉ trong trường hợp đã có một vấn đề khi sử dụng Trích dẫn.
Julien Lachal

Câu trả lời:


2

Tôi đã đi đến kết luận rằng Other_Company_SomeControllerlớp có preDispatchphương thức của nó bị ghi đè và không được gọi đúng phương thức cha.

Điều này gây ra toàn bộ vấn đề. Cảm ơn những người đã đầu tư thời gian và công sức của họ để giúp tôi tìm ra điều này.


Xin chào Luke, bạn có thể thêm tên lớp ở đây thay vào đó (Other_Company_SomeControll). Có Magento bên phải của bạn đang tạo một phiên khác, tôi nghĩ bạn cần theo dõi toàn bộ định tuyến để kiểm tra nơi Magento đang tạo một phiên khác trên trang được chuyển hướng. Thêm một tên lớp ở đây để tôi có thể giúp bạn bằng cách nào đó. Cảm ơn
Ashish Ranade

Xin chào Ashish, tôi không thể làm điều đó vì những hạn chế cấp phép sẽ khiến chủ nhân của tôi vi phạm EULA mà chúng tôi đã đồng ý. Tôi đã tạo một ghi đè cục bộ của bộ điều khiển rắc rối và điều này đã giải quyết được vấn đề.
Luke A. Leber

0

Vì vậy, như chúng tôi đã tìm thấy trong nhận xét bằng cách sử dụng $session->getSessionId();, bạn có hai id phiên khác nhau trong bộ điều khiển của mình.

Sau khi kiểm tra lại mã của bạn, lỗi rất nhỏ, thật khó để tìm thấy nó.

Lý do đằng sau đó là vì hàm tạo của bạn thiếu dấu gạch dưới, vì vậy thay vì:

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

Nó nên là:

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

Xin chào Raphael, cảm ơn câu trả lời. Tôi có ấn tượng rằng tất cả các lớp con của Varien_Object được cho là sử dụng phương thức _construct (vì __construct gọi phương thức _construct bên trong). Tôi đã lấy lời khuyên của bạn và thay đổi nó thành __construct, tuy nhiên vấn đề không được giải quyết. SID Trước: si0v5vff4e3uaht49g4lqud3o5 SID Sau: sj4rlife1bb070npb3se8hjki7 Tôi bắt đầu nghĩ rằng có một vấn đề sâu hơn ở đây, vì ngay cả một Mage_Core_Model_Session cũng đang tái sinh Thật kỳ lạ, đây là nơi duy nhất trong mã mà các phiên hoạt động sai ...
Luke A. Leber

@ LukeA.Leber tôi đoán là ai đó đang xảy ra trong bộ điều khiển xóa các phiên đã đặt trước đó. Bạn có bất kỳ mô-đun tùy chỉnh quan sát một controller_action_predispatch_*sự kiện có thể?
Raphael tại Nghệ thuật piano kỹ thuật số

Xin chào Raphael, tôi đã ném tiền thưởng theo hướng của bạn bởi vì đề xuất của bạn về việc kiểm tra ID phiên dẫn tôi tìm câu trả lời mà tôi đã đăng ở đây. Nó chỉ ra rằng bộ điều khiển của bên thứ ba đã thất bại trong việc gọi đến preDispatchphương thức cha dẫn đến phiên không được khởi tạo đúng.
Luke A. Leber

@ LukeA.Leber cảm ơn vì điều đó tôi rất vui vì bạn đã tìm ra nó
Raphael tại Digital Pianism
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.