diff --git a/app/code/Magento/Checkout/Block/Cart/Shipping.php b/app/code/Magento/Checkout/Block/Cart/Shipping.php index c52b7fe18814f..de51e913c63a3 100644 --- a/app/code/Magento/Checkout/Block/Cart/Shipping.php +++ b/app/code/Magento/Checkout/Block/Cart/Shipping.php @@ -25,6 +25,11 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart * @var \Magento\Framework\Serialize\Serializer\Json */ private $serializer; + + /** + * @var \Magento\Checkout\Model\Cart\ConfigProvider + */ + private $cartConfig; /** * @param \Magento\Framework\View\Element\Template\Context $context @@ -34,6 +39,7 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart * @param array $layoutProcessors * @param array $data * @param \Magento\Framework\Serialize\Serializer\Json|null $serializer + * @param \Magento\Checkout\Model\Cart\ConfigProvider|null $cartConfig * @throws \RuntimeException */ public function __construct( @@ -43,7 +49,8 @@ public function __construct( \Magento\Checkout\Model\CompositeConfigProvider $configProvider, array $layoutProcessors = [], array $data = [], - \Magento\Framework\Serialize\Serializer\Json $serializer = null + \Magento\Framework\Serialize\Serializer\Json $serializer = null, + \Magento\Checkout\Model\Cart\ConfigProvider $cartConfig = null ) { $this->configProvider = $configProvider; $this->layoutProcessors = $layoutProcessors; @@ -51,6 +58,8 @@ public function __construct( $this->_isScopePrivate = true; $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Serialize\Serializer\Json::class); + $this->cartConfig = $cartConfig ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Checkout\Model\Cart\ConfigProvider::class); } /** @@ -61,7 +70,7 @@ public function __construct( */ public function getCheckoutConfig() { - return $this->configProvider->getConfig(); + return $this->cartConfig->getCheckoutConfig(); } /** @@ -95,6 +104,6 @@ public function getBaseUrl() */ public function getSerializedCheckoutConfig() { - return json_encode($this->getCheckoutConfig(), JSON_HEX_TAG); + return $this->cartConfig->getSerializedCheckoutConfig(); } } diff --git a/app/code/Magento/Checkout/Block/Cart/Totals.php b/app/code/Magento/Checkout/Block/Cart/Totals.php index 375c564f29059..2efe6fae15a98 100644 --- a/app/code/Magento/Checkout/Block/Cart/Totals.php +++ b/app/code/Magento/Checkout/Block/Cart/Totals.php @@ -37,6 +37,16 @@ class Totals extends \Magento\Checkout\Block\Cart\AbstractCart * @var LayoutProcessorInterface[] */ protected $layoutProcessors; + + /** + * @var \Magento\Checkout\Model\Cart\ConfigProvider + */ + private $cartConfig; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; /** * @param \Magento\Framework\View\Element\Template\Context $context @@ -45,6 +55,8 @@ class Totals extends \Magento\Checkout\Block\Cart\AbstractCart * @param \Magento\Sales\Model\Config $salesConfig * @param array $layoutProcessors * @param array $data + * @param \Magento\Checkout\Model\Cart\ConfigProvider $cartConfig + * @param \Magento\Framework\Serialize\SerializerInterface $serializer * @codeCoverageIgnore */ public function __construct( @@ -53,12 +65,18 @@ public function __construct( \Magento\Checkout\Model\Session $checkoutSession, \Magento\Sales\Model\Config $salesConfig, array $layoutProcessors = [], - array $data = [] + array $data = [], + \Magento\Checkout\Model\Cart\ConfigProvider $cartConfig = null, + \Magento\Framework\Serialize\SerializerInterface $serializer = null ) { $this->_salesConfig = $salesConfig; parent::__construct($context, $customerSession, $checkoutSession, $data); $this->_isScopePrivate = true; $this->layoutProcessors = $layoutProcessors; + $this->cartConfig = $cartConfig ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Checkout\Model\Cart\ConfigProvider::class); + $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Framework\Serialize\SerializerInterface::class); } /** @@ -70,7 +88,7 @@ public function getJsLayout() $this->jsLayout = $processor->process($this->jsLayout); } - return json_encode($this->jsLayout, JSON_HEX_TAG); + return $this->serializer->serialize($this->jsLayout); } /** @@ -207,4 +225,12 @@ public function getQuote() } return $this->_quote; } + + /** + * @return bool|string + */ + public function getSerializedCheckoutConfig() + { + return $this->cartConfig->getSerializedCheckoutConfig(); + } } diff --git a/app/code/Magento/Checkout/Model/Cart/ConfigProvider.php b/app/code/Magento/Checkout/Model/Cart/ConfigProvider.php new file mode 100644 index 0000000000000..68ad7133fe34d --- /dev/null +++ b/app/code/Magento/Checkout/Model/Cart/ConfigProvider.php @@ -0,0 +1,59 @@ +configProvider = $configProvider; + $this->serializer = $serializer; + } + + /** + * Retrieve checkout configuration + * + * @return array + * @codeCoverageIgnore + */ + public function getCheckoutConfig() + { + return $this->configProvider->getConfig(); + } + + /** + * Retrieve checkout serialized configuration + * + * @return bool|string + */ + public function getSerializedCheckoutConfig() + { + return $this->serializer->serialize($this->getCheckoutConfig()); + } +} diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php index 6a2ffd87b1885..ac2a6026ea4c6 100644 --- a/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php @@ -51,6 +51,11 @@ class ShippingTest extends \PHPUnit\Framework\TestCase * @var \PHPUnit_Framework_MockObject_MockObject */ private $serializer; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $cartConfig; protected function setUp() { @@ -69,6 +74,7 @@ protected function setUp() $this->storeManager = $this->createMock(\Magento\Store\Model\StoreManagerInterface::class); $this->context->expects($this->once())->method('getStoreManager')->willReturn($this->storeManager); $this->serializer = $this->createMock(\Magento\Framework\Serialize\Serializer\Json::class); + $this->cartConfig = $this->createMock(\Magento\Checkout\Model\Cart\ConfigProvider::class); $this->model = new \Magento\Checkout\Block\Cart\Shipping( $this->context, @@ -77,14 +83,15 @@ protected function setUp() $this->configProvider, [$this->layoutProcessor], ['jsLayout' => $this->layout], - $this->serializer + $this->serializer, + $this->cartConfig ); } public function testGetCheckoutConfig() { $config = ['param' => 'value']; - $this->configProvider->expects($this->once())->method('getConfig')->willReturn($config); + $this->cartConfig->expects($this->once())->method('getCheckoutConfig')->willReturn($config); $this->assertEquals($config, $this->model->getCheckoutConfig()); } @@ -117,7 +124,10 @@ public function testGetBaseUrl() public function testGetSerializedCheckoutConfig() { $checkoutConfig = ['checkout', 'config']; - $this->configProvider->expects($this->once())->method('getConfig')->willReturn($checkoutConfig); + $this->cartConfig + ->expects($this->once()) + ->method('getSerializedCheckoutConfig') + ->willReturn(json_encode($checkoutConfig)); $this->assertEquals(json_encode($checkoutConfig), $this->model->getSerializedCheckoutConfig()); } diff --git a/app/code/Magento/Checkout/Test/Unit/Model/Cart/ConfigProviderTest.php b/app/code/Magento/Checkout/Test/Unit/Model/Cart/ConfigProviderTest.php new file mode 100644 index 0000000000000..8ec1b2003a3bc --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Model/Cart/ConfigProviderTest.php @@ -0,0 +1,64 @@ +cartConfigProvider = $this->createMock(\Magento\Checkout\Model\Cart\ConfigProvider::class); + $this->compositeConfigProvider = $this->createMock(\Magento\Checkout\Model\CompositeConfigProvider::class); + $this->serializer = $this->createMock(\Magento\Framework\Serialize\SerializerInterface::class); + + $this->model = new \Magento\Checkout\Model\Cart\ConfigProvider( + $this->compositeConfigProvider, + $this->serializer + ); + } + + public function testGetCheckoutConfig() + { + $config = ['param' => 'value']; + $this->compositeConfigProvider + ->expects($this->once()) + ->method('getConfig') + ->willReturn($config); + + $this->assertEquals($config, $this->model->getCheckoutConfig()); + } + + public function testGetSerializedCheckoutConfig() + { + $config = '{"param":"value"}'; + + $this->serializer + ->expects($this->once()) + ->method('serialize') + ->willReturn($config); + + $this->assertEquals($config, $this->model->getSerializedCheckoutConfig()); + } +} diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/totals.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/totals.phtml index f39b70df98424..8dfada86ca801 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/totals.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/totals.phtml @@ -15,7 +15,12 @@ diff --git a/app/code/Magento/Checkout/view/frontend/web/js/totals.js b/app/code/Magento/Checkout/view/frontend/web/js/totals.js new file mode 100644 index 0000000000000..3ed8dd02b0afe --- /dev/null +++ b/app/code/Magento/Checkout/view/frontend/web/js/totals.js @@ -0,0 +1,20 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +define([ + 'mage/url', + 'Magento_Ui/js/block-loader' +], function (url, blockLoader) { + 'use strict'; + + return function (config) { + window.checkoutConfig = config.checkoutConfig; + window.customerData = window.checkoutConfig.customerData; + window.isCustomerLoggedIn = window.checkoutConfig.isCustomerLoggedIn; + + blockLoader(config.loaderFile); + url.setBaseUrl(config.baseUrl); + }; +});