/app/code/core/Mage/Checkout/Model/Session.php
PHP | 429 lines | 244 code | 43 blank | 142 comment | 42 complexity | f8abf097841c62f56529f482a406296b MD5 | raw file
- <?php
- /**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magento.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magento.com for more information.
- *
- * @category Mage
- * @package Mage_Checkout
- * @copyright Copyright (c) 2006-2016 X.commerce, Inc. and affiliates (http://www.magento.com)
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
- */
- class Mage_Checkout_Model_Session extends Mage_Core_Model_Session_Abstract
- {
- const CHECKOUT_STATE_BEGIN = 'begin';
- /**
- * Quote instance
- *
- * @var null|Mage_Sales_Model_Quote
- */
- protected $_quote;
- /**
- * Customer instance
- *
- * @var null|Mage_Customer_Model_Customer
- */
- protected $_customer;
- /**
- * Whether load only active quote
- *
- * @var bool
- */
- protected $_loadInactive = false;
- /**
- * Loaded order instance
- *
- * @var Mage_Sales_Model_Order
- */
- protected $_order;
- /**
- * Class constructor. Initialize checkout session namespace
- */
- public function __construct()
- {
- $this->init('checkout');
- }
- /**
- * Unset all data associated with object
- */
- public function unsetAll()
- {
- parent::unsetAll();
- $this->_quote = null;
- }
- /**
- * Set customer instance
- *
- * @param Mage_Customer_Model_Customer|null $customer
- * @return Mage_Checkout_Model_Session
- */
- public function setCustomer($customer)
- {
- $this->_customer = $customer;
- return $this;
- }
- /**
- * Check whether current session has quote
- *
- * @return bool
- */
- public function hasQuote()
- {
- return isset($this->_quote);
- }
- /**
- * Set quote to be loaded even if inactive
- *
- * @param bool $load
- * @return Mage_Checkout_Model_Session
- */
- public function setLoadInactive($load = true)
- {
- $this->_loadInactive = $load;
- return $this;
- }
- /**
- * Get checkout quote instance by current session
- *
- * @return Mage_Sales_Model_Quote
- */
- public function getQuote()
- {
- Mage::dispatchEvent('custom_quote_process', array('checkout_session' => $this));
- if ($this->_quote === null) {
- /** @var $quote Mage_Sales_Model_Quote */
- $quote = Mage::getModel('sales/quote')->setStoreId(Mage::app()->getStore()->getId());
- if ($this->getQuoteId()) {
- if ($this->_loadInactive) {
- $quote->load($this->getQuoteId());
- } else {
- $quote->loadActive($this->getQuoteId());
- }
- if ($quote->getId()) {
- /**
- * If current currency code of quote is not equal current currency code of store,
- * need recalculate totals of quote. It is possible if customer use currency switcher or
- * store switcher.
- */
- if ($quote->getQuoteCurrencyCode() != Mage::app()->getStore()->getCurrentCurrencyCode()) {
- $quote->setStore(Mage::app()->getStore());
- $quote->collectTotals()->save();
- /*
- * We mast to create new quote object, because collectTotals()
- * can to create links with other objects.
- */
- $quote = Mage::getModel('sales/quote')->setStoreId(Mage::app()->getStore()->getId());
- $quote->load($this->getQuoteId());
- }
- } else {
- $this->setQuoteId(null);
- }
- }
- $customerSession = Mage::getSingleton('customer/session');
- if (!$this->getQuoteId()) {
- if ($customerSession->isLoggedIn() || $this->_customer) {
- $customer = ($this->_customer) ? $this->_customer : $customerSession->getCustomer();
- $quote->loadByCustomer($customer);
- $this->setQuoteId($quote->getId());
- } else {
- $quote->setIsCheckoutCart(true);
- Mage::dispatchEvent('checkout_quote_init', array('quote'=>$quote));
- }
- }
- if ($this->getQuoteId()) {
- if ($customerSession->isLoggedIn() || $this->_customer) {
- $customer = ($this->_customer) ? $this->_customer : $customerSession->getCustomer();
- $quote->setCustomer($customer);
- }
- }
- $quote->setStore(Mage::app()->getStore());
- $this->_quote = $quote;
- }
- if ($remoteAddr = Mage::helper('core/http')->getRemoteAddr()) {
- $this->_quote->setRemoteIp($remoteAddr);
- $xForwardIp = Mage::app()->getRequest()->getServer('HTTP_X_FORWARDED_FOR');
- $this->_quote->setXForwardedFor($xForwardIp);
- }
- return $this->_quote;
- }
- protected function _getQuoteIdKey()
- {
- return 'quote_id_' . Mage::app()->getStore()->getWebsiteId();
- }
- public function setQuoteId($quoteId)
- {
- $this->setData($this->_getQuoteIdKey(), $quoteId);
- }
- public function getQuoteId()
- {
- return $this->getData($this->_getQuoteIdKey());
- }
- /**
- * Load data for customer quote and merge with current quote
- *
- * @return Mage_Checkout_Model_Session
- */
- public function loadCustomerQuote()
- {
- if (!Mage::getSingleton('customer/session')->getCustomerId()) {
- return $this;
- }
- Mage::dispatchEvent('load_customer_quote_before', array('checkout_session' => $this));
- $customerQuote = Mage::getModel('sales/quote')
- ->setStoreId(Mage::app()->getStore()->getId())
- ->loadByCustomer(Mage::getSingleton('customer/session')->getCustomerId());
- if ($customerQuote->getId() && $this->getQuoteId() != $customerQuote->getId()) {
- if ($this->getQuoteId()) {
- $customerQuote->merge($this->getQuote())
- ->collectTotals()
- ->save();
- }
- $this->setQuoteId($customerQuote->getId());
- if ($this->_quote) {
- $this->_quote->delete();
- }
- $this->_quote = $customerQuote;
- } else {
- $this->getQuote()->getBillingAddress();
- $this->getQuote()->getShippingAddress();
- $this->getQuote()->setCustomer(Mage::getSingleton('customer/session')->getCustomer())
- ->setTotalsCollectedFlag(false)
- ->collectTotals()
- ->save();
- }
- return $this;
- }
- public function setStepData($step, $data, $value=null)
- {
- $steps = $this->getSteps();
- if (is_null($value)) {
- if (is_array($data)) {
- $steps[$step] = $data;
- }
- } else {
- if (!isset($steps[$step])) {
- $steps[$step] = array();
- }
- if (is_string($data)) {
- $steps[$step][$data] = $value;
- }
- }
- $this->setSteps($steps);
- return $this;
- }
- public function getStepData($step=null, $data=null)
- {
- $steps = $this->getSteps();
- if (is_null($step)) {
- return $steps;
- }
- if (!isset($steps[$step])) {
- return false;
- }
- if (is_null($data)) {
- return $steps[$step];
- }
- if (!is_string($data) || !isset($steps[$step][$data])) {
- return false;
- }
- return $steps[$step][$data];
- }
- /**
- * Retrieves list of all saved additional messages for different instances (e.g. quote items) in checkout session
- * Returned: array(itemKey => messageCollection, ...)
- * where itemKey is a unique hash (e.g 'quote_item17') to distinguish item messages among message collections
- *
- * @param bool $clear
- *
- * @return array
- */
- public function getAdditionalMessages($clear = false)
- {
- $additionalMessages = $this->getData('additional_messages');
- if (!$additionalMessages) {
- return array();
- }
- if ($clear) {
- $this->setData('additional_messages', null);
- }
- return $additionalMessages;
- }
- /**
- * Retrieves list of item additional messages
- * itemKey is a unique hash (e.g 'quote_item17') to distinguish item messages among message collections
- *
- * @param string $itemKey
- * @param bool $clear
- *
- * @return null|Mage_Core_Model_Message_Collection
- */
- public function getItemAdditionalMessages($itemKey, $clear = false)
- {
- $allMessages = $this->getAdditionalMessages();
- if (!isset($allMessages[$itemKey])) {
- return null;
- }
- $messages = $allMessages[$itemKey];
- if ($clear) {
- unset($allMessages[$itemKey]);
- $this->setAdditionalMessages($allMessages);
- }
- return $messages;
- }
- /**
- * Adds new message in this session to a list of additional messages for some item
- * itemKey is a unique hash (e.g 'quote_item17') to distinguish item messages among message collections
- *
- * @param string $itemKey
- * @param Mage_Core_Model_Message $message
- *
- * @return Mage_Checkout_Model_Session
- */
- public function addItemAdditionalMessage($itemKey, $message)
- {
- $allMessages = $this->getAdditionalMessages();
- if (!isset($allMessages[$itemKey])) {
- $allMessages[$itemKey] = Mage::getModel('core/message_collection');
- }
- $allMessages[$itemKey]->add($message);
- $this->setAdditionalMessages($allMessages);
- return $this;
- }
- /**
- * Retrieves list of quote item messages
- * @param int $itemId
- * @param bool $clear
- *
- * @return null|Mage_Core_Model_Message_Collection
- */
- public function getQuoteItemMessages($itemId, $clear = false)
- {
- return $this->getItemAdditionalMessages('quote_item' . $itemId, $clear);
- }
- /**
- * Adds new message to a list of quote item messages, saved in this session
- *
- * @param int $itemId
- * @param Mage_Core_Model_Message $message
- *
- * @return Mage_Checkout_Model_Session
- */
- function addQuoteItemMessage($itemId, $message)
- {
- return $this->addItemAdditionalMessage('quote_item' . $itemId, $message);
- }
- public function clear()
- {
- Mage::dispatchEvent('checkout_quote_destroy', array('quote'=>$this->getQuote()));
- $this->_quote = null;
- $this->setQuoteId(null);
- $this->setLastSuccessQuoteId(null);
- }
- /**
- * Clear misc checkout parameters
- */
- public function clearHelperData()
- {
- $this->setLastBillingAgreementId(null)
- ->setRedirectUrl(null)
- ->setLastOrderId(null)
- ->setLastRealOrderId(null)
- ->setLastRecurringProfileIds(null)
- ->setAdditionalMessages(null)
- ;
- }
- public function resetCheckout()
- {
- $this->setCheckoutState(self::CHECKOUT_STATE_BEGIN);
- return $this;
- }
- public function replaceQuote($quote)
- {
- $this->_quote = $quote;
- $this->setQuoteId($quote->getId());
- return $this;
- }
- /**
- * Get order instance based on last order ID
- *
- * @return Mage_Sales_Model_Order
- */
- public function getLastRealOrder()
- {
- $orderId = $this->getLastRealOrderId();
- if ($this->_order !== null && $orderId == $this->_order->getIncrementId()) {
- return $this->_order;
- }
- $this->_order = $this->_getOrderModel();
- if ($orderId) {
- $this->_order->loadByIncrementId($orderId);
- }
- return $this->_order;
- }
- /**
- * Get order model
- *
- * @return Mage_Sales_Model_Order
- */
- protected function _getOrderModel()
- {
- return Mage::getModel('sales/order');
- }
- }