リダイレクト後のセッション変数の保存に問題があります。ここに関連するコードのモックがあります:
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
メソッドを、適切に親クラスに通じ呼び出していませんでした。
はい、質問を変更して、オブジェクトのprint_rを含めます。
—
ルークA.レーバー2016
のようなものを設定して
—
Julien Lachal
setFoo('bar')
、後で正常に取得してみましたか?
変数名の変更が結果にどのように影響するか(最終的な基本クラスはVarien_Objectであるため)はわかりませんが、 'foo'変数を 'bar'に設定しても機能しません。
—
ルークA.レーバー
見積もりを使用するときに問題が発生した場合に備えて。
—
Julien Lachal
Mage::getSingleton('company_x/session')
戻ってCompany_X_Model_Session
オブジェクトを?