diff --git a/Block/Js.php b/Block/Js.php index ab59703be..f5f39097d 100644 --- a/Block/Js.php +++ b/Block/Js.php @@ -251,6 +251,8 @@ public function getSettings() 'is_instant_checkout_button' => $this->getIsInstantCheckoutButton(), 'cdn_url' => $this->configHelper->getCdnUrl(), 'always_present_checkout' => $this->enableAlwaysPresentCheckoutButton(), + 'account_url' => $this->getAccountJsUrl(), + 'order_management_selector' => $this->getOrderManagementSelector(), ]); } @@ -462,6 +464,18 @@ public function isOrderManagementEnabled() $this->featureSwitches->isOrderManagementEnabled(); } + /** + * Return true if Order Management is enabled + * @return bool + */ + public function getOrderManagementSelector() + { + if (!$this->configHelper->isOrderManagementEnabled() || !$this->featureSwitches->isOrderManagementEnabled()) { + return ''; + } + return $this->configHelper->getOrderManagementSelector(); + } + /** * Return false if block wasn't shown yet * Need to provide using block only once diff --git a/Helper/Config.php b/Helper/Config.php index 1e1ada064..46476f122 100644 --- a/Helper/Config.php +++ b/Helper/Config.php @@ -127,6 +127,11 @@ class Config extends AbstractHelper */ const XML_PATH_PRODUCT_ORDER_MANAGEMENT = 'payment/boltpay/order_management'; + /** + * Enable Bolt order management CSS selector + */ + const XML_PATH_PRODUCT_ORDER_MANAGEMENT_SELECTOR = 'payment/boltpay/order_management_selector'; + /** * Prefetch shipping @@ -737,6 +742,22 @@ public function isOrderManagementEnabled($store = null) ); } + /** + * Get Order management CSS selector from config + * + * @param int|string|Store $store + * + * @return string + */ + public function getOrderManagementSelector($store = null) + { + return $this->getScopeConfig()->getValue( + self::XML_PATH_PRODUCT_ORDER_MANAGEMENT_SELECTOR, + ScopeInterface::SCOPE_STORE, + $store + ); + } + /** * Get Prefetch Shipping and Tax config * diff --git a/Test/Unit/Block/JsTest.php b/Test/Unit/Block/JsTest.php index 569a058d4..2ee722809 100644 --- a/Test/Unit/Block/JsTest.php +++ b/Test/Unit/Block/JsTest.php @@ -33,7 +33,7 @@ class JsTest extends \PHPUnit\Framework\TestCase { // Number of settings in method getSettings() - const SETTINGS_NUMBER = 23; + const SETTINGS_NUMBER = 25; const STORE_ID = 1; const CONFIG_API_KEY = 'test_api_key'; const CONFIG_SIGNING_SECRET = 'test_signing_secret'; @@ -108,7 +108,8 @@ protected function setUp() 'getReplaceSelectors', 'getGlobalCSS', 'getPrefetchShipping', 'getQuoteIsVirtual', 'getTotalsChangeSelectors', 'getAdditionalCheckoutButtonClass', 'getAdditionalConfigString', 'getIsPreAuth', 'shouldTrackCheckoutFunnel','isPaymentOnlyCheckoutEnabled', 'isIPRestricted', 'getPageBlacklist', - 'getMinicartSupport', 'getIPWhitelistArray', 'getApiKey', 'getSigningSecret', 'getButtonColor', 'isAlwaysPresentCheckoutEnabled' + 'getMinicartSupport', 'getIPWhitelistArray', 'getApiKey', 'getSigningSecret', 'getButtonColor', 'isAlwaysPresentCheckoutEnabled', + 'getOrderManagementSelector','isOrderManagementEnabled', ]; $this->configHelper = $this->getMockBuilder(HelperConfig::class) @@ -367,6 +368,8 @@ public function getSettings() $this->assertArrayHasKey('default_error_message', $array, $message . 'default_error_message'); $this->assertArrayHasKey('button_css_styles', $array, $message . 'button_css_styles'); $this->assertArrayHasKey('always_present_checkout', $array, $message . 'always_present_checkout'); + $this->assertArrayHasKey('account_url', $array, $message . 'account_url'); + $this->assertArrayHasKey('order_management_selector', $array, $message . 'order_management_selector'); } /** diff --git a/Test/Unit/Helper/ConfigTest.php b/Test/Unit/Helper/ConfigTest.php index ff91e729c..bf89f18b1 100644 --- a/Test/Unit/Helper/ConfigTest.php +++ b/Test/Unit/Helper/ConfigTest.php @@ -611,6 +611,7 @@ public function getValueMethodsProvider() ['getOnClose', BoltConfig::XML_PATH_TRACK_CLOSE], ['getMinimumOrderAmount', BoltConfig::XML_PATH_MINIMUM_ORDER_AMOUNT], ['getOnShippingOptionsComplete', BoltConfig::XML_PATH_TRACK_SHIPPING_OPTIONS_COMPLETE], + ['getOrderManagementSelector', BoltConfig::XML_PATH_PRODUCT_ORDER_MANAGEMENT_SELECTOR], ]; } diff --git a/etc/adminhtml/system.xml b/etc/adminhtml/system.xml index 4e74f30a4..a1a8c20ef 100644 --- a/etc/adminhtml/system.xml +++ b/etc/adminhtml/system.xml @@ -95,7 +95,13 @@ payment/boltpay/order_management Magento\Config\Model\Config\Source\Yesno - + + + 1 + Leave empty for show button in header. + payment/boltpay/order_management_selector + + payment/boltpay/always_present_checkout Magento\Config\Model\Config\Source\Yesno diff --git a/view/frontend/templates/boltaccount.phtml b/view/frontend/templates/boltaccount.phtml index ba6201c7c..84128a94c 100644 --- a/view/frontend/templates/boltaccount.phtml +++ b/view/frontend/templates/boltaccount.phtml @@ -20,11 +20,18 @@ * * @var $block \Bolt\Boltpay\Block\Js */ -if ($block->shouldDisableBoltCheckout()) { return; +if ($block->shouldDisableBoltCheckout()) { + return; } -if (!$block->isOrderManagementEnabled()) { return; +if (!$block->isOrderManagementEnabled()) { + return; } -if ($block->isBlockAlreadyShown('account')) { return; +// If CSS selector is set we want to insert button via fronend after this selector. +if ($block->getOrderManagementSelector()) { + return; +} +if ($block->isBlockAlreadyShown('account')) { + return; } $accountJsUrl = $block->getAccountJsUrl(); $checkoutKey = $block->getCheckoutKey(); diff --git a/view/frontend/templates/js/replacejs.phtml b/view/frontend/templates/js/replacejs.phtml index 5b61a47c4..6038827e7 100644 --- a/view/frontend/templates/js/replacejs.phtml +++ b/view/frontend/templates/js/replacejs.phtml @@ -2274,6 +2274,41 @@ if (!$block->isSaveCartInSections()) { ?> invalidateBoltCart(); }); + // insert Bolt order managenent button into DOM + if (settings.order_management_selector) { + var insertAccountScript = function () { + var scriptTag = document.getElementById('bolt-account'); + if (scriptTag) { + return; + } + var publishableKey = getCheckoutKey(); + scriptTag = document.createElement('script'); + scriptTag.setAttribute('type', 'text/javascript'); + scriptTag.setAttribute('async', ''); + scriptTag.setAttribute('src', settings.account_url); + scriptTag.setAttribute('id', 'bolt-account'); + scriptTag.setAttribute('data-publishable-key', publishableKey); + document.head.appendChild(scriptTag); + } + var insertManagementButtonDivAfterElement = function(element) { + var orderMagagementButton = document.createElement('div'); + orderMagagementButton.setAttribute('class', 'bolt-account-login'); + element.parentNode.insertBefore(orderMagagementButton, element.nextSibling); + insertAccountScript(); + } + var setupOrderManagementReplacement = function() { + element = document.querySelector(settings.order_management_selector); + if (element) { + insertManagementButtonDivAfterElement(element); + } else { + onElementReady(settings.order_management_selector, function(element) { + insertManagementButtonDivAfterElement(element); + }); + } + } + setupOrderManagementReplacement(); + }; + //////////////////////////////////////////////////// // Initially configures BoltCheckout. // Required for setting check callback which either