Skip to content

Commit 48051a4

Browse files
committed
Merge remote-tracking branch 'origin/MAGETWO-63174-Guest-Checkout' into 2.2-develop-pr-1
2 parents b97c78f + 8db5912 commit 48051a4

File tree

16 files changed

+992
-30
lines changed

16 files changed

+992
-30
lines changed
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Persistent\Model\Checkout;
8+
9+
use Magento\Checkout\Model\GuestPaymentInformationManagement;
10+
use Magento\Checkout\Model\Session;
11+
12+
/**
13+
* Plugin to convert shopping cart from persistent cart to guest cart before order save when customer not logged in
14+
*/
15+
class GuestPaymentInformationManagementPlugin
16+
{
17+
/**
18+
* Persistence Session Helper
19+
*
20+
* @var \Magento\Persistent\Helper\Session
21+
*/
22+
private $persistenceSessionHelper;
23+
24+
/**
25+
* Persistence Data Helper
26+
*
27+
* @var \Magento\Persistent\Helper\Data
28+
*/
29+
private $persistenceDataHelper;
30+
31+
/**
32+
* Customer Session
33+
*
34+
* @var \Magento\Customer\Model\Session
35+
*/
36+
private $customerSession;
37+
38+
/**
39+
* Checkout Session
40+
*
41+
* @var \Magento\Checkout\Model\Session
42+
*/
43+
private $checkoutSession;
44+
45+
/**
46+
* Quote Manager
47+
*
48+
* @var \Magento\Persistent\Model\QuoteManager
49+
*/
50+
private $quoteManager;
51+
52+
/**
53+
* Cart Repository
54+
*
55+
* @var \Magento\Quote\Api\CartRepositoryInterface
56+
*/
57+
private $cartRepository;
58+
59+
/**
60+
* Initialize dependencies
61+
*
62+
* @param \Magento\Persistent\Helper\Data $persistenceDataHelper
63+
* @param \Magento\Persistent\Helper\Session $persistenceSessionHelper
64+
* @param \Magento\Customer\Model\Session $customerSession
65+
* @param \Magento\Checkout\Model\Session $checkoutSession
66+
* @param \Magento\Persistent\Model\QuoteManager $quoteManager
67+
* @param \Magento\Quote\Api\CartRepositoryInterface $cartRepository
68+
*/
69+
public function __construct(
70+
\Magento\Persistent\Helper\Data $persistenceDataHelper,
71+
\Magento\Persistent\Helper\Session $persistenceSessionHelper,
72+
\Magento\Customer\Model\Session $customerSession,
73+
\Magento\Checkout\Model\Session $checkoutSession,
74+
\Magento\Persistent\Model\QuoteManager $quoteManager,
75+
\Magento\Quote\Api\CartRepositoryInterface $cartRepository
76+
) {
77+
$this->persistenceDataHelper = $persistenceDataHelper;
78+
$this->persistenceSessionHelper = $persistenceSessionHelper;
79+
$this->customerSession = $customerSession;
80+
$this->checkoutSession = $checkoutSession;
81+
$this->quoteManager = $quoteManager;
82+
$this->cartRepository = $cartRepository;
83+
}
84+
85+
/**
86+
* Convert customer cart to guest cart before order is placed if customer is not logged in
87+
*
88+
* @param GuestPaymentInformationManagement $subject
89+
* @param string $cartId
90+
* @param string $email
91+
* @param \Magento\Quote\Api\Data\PaymentInterface $paymentMethod
92+
* @param \Magento\Quote\Api\Data\AddressInterface|null $billingAddress
93+
* @return void
94+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
95+
*/
96+
public function beforeSavePaymentInformationAndPlaceOrder(
97+
GuestPaymentInformationManagement $subject,
98+
$cartId,
99+
$email,
100+
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
101+
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
102+
) {
103+
if ($this->persistenceSessionHelper->isPersistent()
104+
&& !$this->customerSession->isLoggedIn()
105+
&& $this->persistenceDataHelper->isShoppingCartPersist()
106+
&& $this->quoteManager->isPersistent()
107+
) {
108+
$this->customerSession->setCustomerId(null);
109+
$this->customerSession->setCustomerGroupId(null);
110+
$this->quoteManager->convertCustomerCartToGuest();
111+
/** @var \Magento\Quote\Api\Data\CartInterface $quote */
112+
$quote = $this->cartRepository->get($this->checkoutSession->getQuote()->getId());
113+
$quote->setCustomerEmail($email);
114+
$quote->getAddressesCollection()->walk('setEmail', ['email' => $email]);
115+
$this->cartRepository->save($quote);
116+
}
117+
}
118+
}

app/code/Magento/Persistent/Model/QuoteManager.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public function __construct(
6262
}
6363

6464
/**
65-
* Make quote to be guest
65+
* Clear cart of customer data if exists and reset guest information, remove persistent session
6666
*
6767
* @param bool $checkQuote Check quote to be persistent (not stolen)
6868
* @return void
@@ -98,6 +98,36 @@ public function setGuest($checkQuote = false)
9898
$this->persistentSession->getSession()->removePersistentCookie();
9999
}
100100

101+
/**
102+
* Emulate guest cart with persistent cart
103+
*
104+
* Converts persistent cart tied to logged out customer to a guest cart, retaining customer information required for
105+
* checkout
106+
*
107+
* @return void
108+
*/
109+
public function convertCustomerCartToGuest()
110+
{
111+
/** @var $quote \Magento\Quote\Model\Quote */
112+
$quote = $this->quoteRepository->get($this->checkoutSession->getQuote()->getId());
113+
if ($quote && $quote->getId()) {
114+
$this->_setQuotePersistent = false;
115+
$quote->setIsActive(true)
116+
->setCustomerId(null)
117+
->setCustomerEmail(null)
118+
->setCustomerFirstname(null)
119+
->setCustomerLastname(null)
120+
->setCustomerGroupId(\Magento\Customer\Api\Data\GroupInterface::NOT_LOGGED_IN_ID)
121+
->setIsPersistent(false);
122+
$quote->getAddressesCollection()->walk('setCustomerAddressId', ['customerAddressId' => null]);
123+
$quote->getAddressesCollection()->walk('setCustomerId', ['customerId' => null]);
124+
$quote->getAddressesCollection()->walk('setEmail', ['email' => null]);
125+
$quote->collectTotals();
126+
$this->persistentSession->getSession()->removePersistentCookie();
127+
$this->quoteRepository->save($quote);
128+
}
129+
}
130+
101131
/**
102132
* Expire persistent quote
103133
*
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Persistent\Observer;
7+
8+
use Magento\Framework\Event\ObserverInterface;
9+
use Magento\Framework\Exception\NoSuchEntityException;
10+
11+
/**
12+
* Observer to remove persistent session if guest empties persistent cart previously created and added to by customer.
13+
*/
14+
class RemoveGuestPersistenceOnEmptyCartObserver implements ObserverInterface
15+
{
16+
/**
17+
* Customer session
18+
*
19+
* @var \Magento\Customer\Model\Session
20+
*/
21+
private $customerSession;
22+
23+
/**
24+
* Persistent session
25+
*
26+
* @var \Magento\Persistent\Helper\Session
27+
*/
28+
private $persistenceSessionHelper;
29+
30+
/**
31+
* Quote manager
32+
*
33+
* @var \Magento\Persistent\Model\QuoteManager
34+
*/
35+
private $quoteManager;
36+
37+
/**
38+
* Persistent Data
39+
*
40+
* @var \Magento\Persistent\Helper\Data
41+
*/
42+
private $persistenceDataHelper;
43+
44+
/**
45+
* Cart Repository
46+
*
47+
* @var \Magento\Quote\Api\CartRepositoryInterface $cartRepository
48+
*/
49+
private $cartRepository;
50+
51+
/**
52+
* Initialize dependencies
53+
*
54+
* @param \Magento\Persistent\Helper\Session $persistenceSessionHelper
55+
* @param \Magento\Persistent\Helper\Data $persistenceDataHelper
56+
* @param \Magento\Persistent\Model\QuoteManager $quoteManager
57+
* @param \Magento\Customer\Model\Session $customerSession
58+
* @param \Magento\Quote\Api\CartRepositoryInterface $cartRepository
59+
*/
60+
public function __construct(
61+
\Magento\Persistent\Helper\Session $persistenceSessionHelper,
62+
\Magento\Persistent\Helper\Data $persistenceDataHelper,
63+
\Magento\Persistent\Model\QuoteManager $quoteManager,
64+
\Magento\Customer\Model\Session $customerSession,
65+
\Magento\Quote\Api\CartRepositoryInterface $cartRepository
66+
) {
67+
$this->persistenceSessionHelper = $persistenceSessionHelper;
68+
$this->customerSession = $customerSession;
69+
$this->quoteManager = $quoteManager;
70+
$this->persistenceDataHelper = $persistenceDataHelper;
71+
$this->cartRepository = $cartRepository;
72+
}
73+
74+
/**
75+
* Set persistent session to guest if cart has been emptied and customer not logged in
76+
*
77+
* @param \Magento\Framework\Event\Observer $observer
78+
* @return void
79+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
80+
*/
81+
public function execute(\Magento\Framework\Event\Observer $observer)
82+
{
83+
if (!$this->persistenceSessionHelper->isPersistent()
84+
|| $this->customerSession->isLoggedIn()
85+
|| !$this->persistenceDataHelper->isShoppingCartPersist()
86+
) {
87+
return;
88+
}
89+
90+
try {
91+
$custId = $this->persistenceSessionHelper->getSession()->getCustomerId();
92+
/** @var \Magento\Quote\Api\Data\CartInterface $cart */
93+
$cart = $this->cartRepository->getActiveForCustomer($custId);
94+
} catch (NoSuchEntityException $entityException) {
95+
$cart = null;
96+
}
97+
98+
if (!$cart || $cart->getItemsCount() == 0) {
99+
$this->quoteManager->setGuest();
100+
}
101+
}
102+
}

app/code/Magento/Persistent/Observer/RemovePersistentCookieObserver.php renamed to app/code/Magento/Persistent/Observer/RemovePersistentCookieOnRegisterObserver.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88

99
use Magento\Framework\Event\ObserverInterface;
1010

11-
class RemovePersistentCookieObserver implements ObserverInterface
11+
/**
12+
* Plugin to change persistent session cart to guest cart on new customer register success.
13+
*/
14+
class RemovePersistentCookieOnRegisterObserver implements ObserverInterface
1215
{
1316
/**
1417
* Customer session

0 commit comments

Comments
 (0)