Commit df3c1427 by lmf

Merge branch 'developer' into production

parents e1a16d0a 5fff78ad
......@@ -15,3 +15,4 @@ var
.idea
/.php_cs.cache
/app/design/frontend/Joshine/breeze/Magento_Theme/templates/root.phtml
/pub/feed
......@@ -44,14 +44,14 @@ class InstallSchema implements InstallSchemaInterface
->newTable($installer->getTable('amasty_advanced_review_images'))
->addColumn(
'image_id',
Table::TYPE_INTEGER,
Table::TYPE_BIGINT,
null,
['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
'Review Id'
)
->addColumn(
'review_id',
Table::TYPE_INTEGER,
Table::TYPE_BIGINT,
null,
['default' => 0, 'nullable' => false],
'Review table id'
......
......@@ -104,6 +104,20 @@ class UpgradeData implements UpgradeDataInterface
'required' => false,
'sort_order' => 70,
'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE,
],
'is_show_size'=>
[
'type' => 'int',
'label' => 'badge',
'visible_on_front' => true,
'user_defined' => false,
'default' => 0,
'group' => '',
'input' => 'checkbox',
'backend' => '',
'required' => false,
'sort_order' => 100,
'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE,
]
];
......
......@@ -6,5 +6,5 @@
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Joshine_Category" setup_version="1.1.2"/>
<module name="Joshine_Category" setup_version="1.1.5"/>
</config>
......@@ -84,5 +84,39 @@
</argument>
</field>
</fieldset>
</form>
<fieldset name="general">
<field name="is_show_size" sortOrder="0" formElement="checkbox">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="source" xsi:type="string">category</item>
<item name="default" xsi:type="number">0</item>
</item>
</argument>
<settings>
<validation>
<rule name="required-entry" xsi:type="boolean">false</rule>
</validation>
<dataType>boolean</dataType>
<label translate="true">Is Show Size</label>
</settings>
<formElements>
<checkbox>
<settings>
<valueMap>
<map name="false" xsi:type="string">0</map>
<map name="true" xsi:type="string">1</map>
</valueMap>
<prefer>toggle</prefer>
</settings>
</checkbox>
</formElements>
</field>
</fieldset>
</form>
<?php
/**
* Copyright © 2015 Magento. All rights reserved.
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Rokanthemes_RokanBase',
'Joshine_Review',
__DIR__
);
......@@ -450,6 +450,11 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
*/
protected function _renderFiltersBefore()
{
if(isset($_REQUEST['skus']) && !empty($_REQUEST['skus']))
{
$this->_renderFiltersSku();
return;
}
if ($this->isLoaded()) {
return;
}
......@@ -477,6 +482,35 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
$this->getSearchResultApplier($this->searchResult)->apply();
parent::_renderFiltersBefore();
}
protected function _renderFiltersSku()
{
if ($this->isLoaded()) {
return;
}
if ($this->searchRequestName !== 'quick_search_container'
|| strlen(trim($this->queryText))
) {
$this->prepareSearchTermFilter();
$this->preparePriceAggregation();
$searchCriteria = $this->getSearchCriteriaResolver()->resolve();
try {
$this->searchResult = $this->getSearch()->searchSku($searchCriteria);
$this->_totalRecords = $this->getTotalRecordsResolver($this->searchResult)->resolve();
} catch (EmptyRequestDataException $e) {
$this->searchResult = $this->createEmptyResult();
} catch (NonExistingRequestNameException $e) {
$this->_logger->error($e->getMessage());
throw new LocalizedException(__('An error occurred. For details, see the error log.'));
}
} else {
$this->searchResult = $this->createEmptyResult();
}
$this->getSearchResultApplier($this->searchResult)->applySku();
parent::_renderFiltersBefore();
}
/**
* Create empty search result
......
......@@ -5,7 +5,7 @@
* See COPYING.txt for license details.
*/
namespace Magento\Checkout\Controller\Onepage;
use Aitoc\Smtp\Model\Config;
class Failure extends \Magento\Checkout\Controller\Onepage
{
/**
......@@ -15,8 +15,24 @@ class Failure extends \Magento\Checkout\Controller\Onepage
{
$lastQuoteId = $this->getOnepage()->getCheckout()->getLastQuoteId();
$lastOrderId = $this->getOnepage()->getCheckout()->getLastOrderId();
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
if(!$lastQuoteId && !$lastOrderId && isset($_REQUEST['order_sn']))
{
$order = $objectManager->create('Magento\Sales\Model\OrderFactory')->create()->loadByIncrementId($_REQUEST['order_sn']);
$lastOrderId = $order->getId();
$lastQuoteId = $order->getQuoteId();
}
$quote = $objectManager->create('Magento\Quote\Model\QuoteFactory')->create()->load($lastQuoteId);
$quote->setReservedOrderId(null);
$quote->setIsActive(true);
$quote->removePayment();
$quote->save();
$objectManager->get(\Magento\Checkout\Model\Session::class)->replaceQuote($quote);
$objectManager->get(\Magento\Checkout\Model\Session::class)->restoreQuote();
if (!$lastQuoteId || !$lastOrderId) {
//$this->cart->setQuote($quote);
if ($lastQuoteId && $lastOrderId) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
......
......@@ -9,6 +9,7 @@
<update handle="checkout_cart_item_renderers"/>
<body>
<referenceBlock name="page.main.title" remove="true"/>
<referenceBlock name="sparsh.free-shipping.bar.top" remove="true" />
<referenceBlock name="checkout.cart.addtocart" remove="true" />
<referenceContainer name="page.messages">
<block class="Magento\Checkout\Block\Cart\ValidationMessages" name="checkout.cart.validationmessages"/>
......@@ -174,11 +175,12 @@
</arguments>
</block>
</container>
<block class="Magento\Checkout\Block\Cart\Coupon" name="checkout.cart.coupon" as="coupon" template="Magento_Checkout::cart/coupon.phtml"/>
<block class="Magento\Checkout\Block\Cart\Coupon" name="checkout.cart.coupon" as="coupon" template="Magento_Checkout::cart/coupon.phtml" after="checkout.cart.summary.title"/>
<block class="Magento\Checkout\Block\Cart" name="checkout.cart.methods.bottom" template="Magento_Checkout::cart/methods.phtml">
<container name="checkout.cart.methods" as="methods" label="Payment Methods After Checkout Button">
<block class="Magento\Checkout\Block\Onepage\Link" name="checkout.cart.methods.onepage.bottom" template="Magento_Checkout::onepage/link.phtml" />
<block class="Magento\Checkout\Block\QuoteShortcutButtons" name="checkout.cart.shortcut.buttons" />
<block class="Magento\Framework\View\Element\Template" name="checkout.cart.we_accept" template="Magento_Checkout::cart/we_accept.phtml" />
</container>
</block>
</container>
......
......@@ -47,6 +47,7 @@
</item>
</item>
</item>
<!--
<item name="progressBar" xsi:type="array">
<item name="component" xsi:type="string">Magento_Checkout/js/view/progress-bar</item>
<item name="displayArea" xsi:type="string">progressBar</item>
......@@ -57,6 +58,7 @@
</item>
</item>
</item>
-->
<item name="estimation" xsi:type="array">
<item name="component" xsi:type="string">Magento_Checkout/js/view/estimation</item>
<item name="displayArea" xsi:type="string">estimation</item>
......@@ -389,8 +391,10 @@
<!-- merge your components here -->
</item>
</item>
<item name="cart_items" xsi:type="array">
<!--<item name="cart_items" xsi:type="array">
<item name="component" xsi:type="string">Magento_Checkout/js/view/summary/cart-items</item>
<item name="sortOrder" xsi:type="string">2</item>
<item name="children" xsi:type="array">
<item name="details" xsi:type="array">
<item name="component" xsi:type="string">Magento_Checkout/js/view/summary/item/details</item>
......@@ -411,6 +415,7 @@
</item>
</item>
</item>
-->
<item name="itemsAfter" xsi:type="array">
<item name="component" xsi:type="string">uiComponent</item>
<item name="children" xsi:type="array">
......@@ -434,6 +439,9 @@
</item>
</item>
</item>
<item name="part" xsi:type="array">
<item name="component" xsi:type="string">Magento_Checkout/js/view/part</item>
</item>
</item>
</item>
<item name="checkoutProvider" xsi:type="array">
......
......@@ -10,6 +10,30 @@
<title>Success Page</title>
</head>
<body>
<referenceContainer name="page.bottom.container" remove="true"/>
<referenceContainer name="footer-container" remove="true"/>
<referenceBlock name="catalog.topnav" remove="true" />
<referenceBlock name="top.search" remove="true" />
<referenceBlock name="sparsh.free-shipping.bar.top" remove="true" />
<referenceBlock name="header.search.bar" remove="true" />
<referenceBlock name="header.account" remove="true" />
<referenceBlock name="header.wishlist" remove="true" />
<referenceBlock name="minicart" remove="true" />
<referenceContainer name="header.container">
<block class="Magento\Cms\Block\Block" name="cart.payment.top">
<arguments>
<argument name="block_id" xsi:type="string">cart_payment_top</argument>
</arguments>
</block>
</referenceContainer>
<referenceContainer name="columns.top">
<block class="Magento\Cms\Block\Block" name="progress.bar" before="-">
<arguments>
<argument name="block_id" xsi:type="string">progress_bar</argument>
</arguments>
</block>
</referenceContainer>
<referenceBlock name="page.main.title">
<block class="Magento\Checkout\Block\Onepage\Success" name="checkout.success.print.button" template="Magento_Checkout::button.phtml"/>
<action method="setPageTitle">
......@@ -21,6 +45,7 @@
<container name="order.success.additional.info" label="Order Success Additional Info"/>
</block>
<block class="Magento\Checkout\Block\Registration" name="checkout.registration" template="Magento_Checkout::registration.phtml" cacheable="false"/>
<block class="Magento\Framework\View\Element\Template" name="checkout.cart.footer" template="Magento_Checkout::footer.phtml" />
</referenceContainer>
</body>
</page>
......@@ -46,14 +46,13 @@ if (count($_items) > 0) {
data-mage-init='{"shoppingCart":{"emptyCartButton": ".action.clear",
"updateCartActionContainer": "#update_cart_action_container"}}'>
<caption class="table-caption"><?= $block->escapeHtml(__('Shopping Cart Items')) ?></caption>
<thead>
<thead><td><div class="item-summary">Item Summary</div></td></thead>
<tr>
<th class="col item" scope="col"><span><?= $block->escapeHtml(__('Item')) ?></span></th>
<th class="col price" scope="col"><span><?= $block->escapeHtml(__('Price')) ?></span></th>
<th class="col qty" scope="col"><span><?= $block->escapeHtml(__('Qty')) ?></span></th>
<th class="col subtotal" scope="col"><span><?= $block->escapeHtml(__('Subtotal')) ?></span></th>
<td class="col item first" scope="col"><span><?= $block->escapeHtml(__('Item')) ?></span></td>
<td class="col price" scope="col"><span><?= $block->escapeHtml(__('Price')) ?></span></td>
<td class="col qty" scope="col"><span><?= $block->escapeHtml(__('Qty')) ?></span></td>
<td class="col subtotal" scope="col"><span><?= $block->escapeHtml(__('Subtotal')) ?></span></td>
</tr>
</thead>
<?php foreach ($block->getItems() as $_item): ?>
<?= $block->getItemHtml($_item) ?>
<?php endforeach ?>
......
......@@ -66,6 +66,8 @@ define([
* Estimate totals for billing address.
*/
estimateTotalsBilling = function () {
if(quote.billingAddress() != null)
{
var type = quote.billingAddress().getType();
if (quote.isVirtual()) {
......@@ -75,6 +77,7 @@ define([
totalsProcessors[type].estimateTotals(quote.billingAddress()) :
totalsProcessors['default'].estimateTotals(quote.billingAddress());
}
}
};
quote.shippingAddress.subscribe(estimateTotalsAndUpdateRates);
......
......@@ -7,8 +7,9 @@ define([
'underscore',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/payment/method-list',
'Magento_Checkout/js/action/select-payment-method'
], function (_, quote, methodList, selectPaymentMethod) {
'Magento_Checkout/js/action/select-payment-method',
'ko'
], function (_, quote, methodList, selectPaymentMethod,ko) {
'use strict';
/**
......@@ -27,10 +28,16 @@ define([
getGrandTotal = function () {
return quote.totals()['grand_total'];
};
var totals = quote.getTotals(),
couponCode = ko.observable(null);
if (totals()) {
couponCode(totals()['coupon_code']);
}
return {
isFreeAvailable: false,
isLoading: ko.observable(false),
isAppliedCoupon: ko.observable(couponCode() != null),
/**
* Populate the list of payment methods
* @param {Array} methods
......
......@@ -30,6 +30,7 @@ define([
shippingAddress = ko.observable(null),
shippingMethod = ko.observable(null),
paymentMethod = ko.observable(null),
paymentMethodlist = ko.observable(null),
quoteData = window.checkoutConfig.quoteData,
basePriceFormat = window.checkoutConfig.basePriceFormat,
priceFormat = window.checkoutConfig.priceFormat,
......@@ -44,6 +45,7 @@ define([
shippingMethod: shippingMethod,
billingAddress: billingAddress,
paymentMethod: paymentMethod,
paymentMethodlist:paymentMethodlist,
guestEmail: null,
/**
......@@ -111,7 +113,12 @@ define([
getPaymentMethod: function () {
return paymentMethod;
},
setPaymentMethodList: function (MethodList) {
paymentMethodlist(MethodList);
},
getPaymentMethodList: function () {
return paymentMethodlist;
},
/**
* @return {*}
*/
......
......@@ -58,6 +58,7 @@ define([
).done(
function (response) {
quote.setTotals(response.totals);
quote.setPaymentMethodList(methodConverter(response['payment_methods']));
paymentService.setPaymentMethods(methodConverter(response['payment_methods']));
fullScreenLoader.stopLoader();
}
......
......@@ -5,15 +5,22 @@
define([
'ko',
'Magento_Checkout/js/model/checkout-data-resolver'
], function (ko, checkoutDataResolver) {
'Magento_Checkout/js/model/checkout-data-resolver',
'Magento_Checkout/js/model/quote'
], function (ko, checkoutDataResolver,quote) {
'use strict';
var shippingRates = ko.observableArray([]);
var totals = quote.getTotals(),
couponCode = ko.observable(null);
if (totals()) {
couponCode(totals()['coupon_code']);
}
return {
isLoading: ko.observable(false),
isAppliedCoupon: ko.observable(couponCode() != null),
/**
* Set shipping rates
*
......
......@@ -134,6 +134,7 @@ define([
* @param {*} code
* @return {Boolean}
*/
/*
isProcessed: function (code) {
var activeItemIndex = this.getActiveItemIndex(),
sortedItems = steps().sort(this.sortItems),
......@@ -148,6 +149,10 @@ define([
return activeItemIndex > requestedItemIndex;
},
*/
isProcessed: function (code) {
return true;
},
/**
* @param {*} code
* @param {*} scrollToElementId
......
......@@ -51,17 +51,17 @@ function (
return Component.extend({
defaults: {
template: 'Magento_Checkout/billing-address',
template: 'Magento_Checkout/new-billing-address',
actionsTemplate: 'Magento_Checkout/billing-address/actions',
formTemplate: 'Magento_Checkout/billing-address/form',
detailsTemplate: 'Magento_Checkout/billing-address/details',
//detailsTemplate: 'Magento_Checkout/billing-address/details',
links: {
isAddressFormVisible: '${$.billingAddressListProvider}:isNewAddressSelected'
}
},
currentBillingAddress: quote.billingAddress,
customerHasAddresses: addressOptions.length > 0,
addressOptions: addressOptions,
/**
* Init component
*/
......
......@@ -56,7 +56,7 @@ define([
_.bind(this.navigate, this),
this.sortOrder
);
this.navigate();
return this;
},
......
......@@ -223,7 +223,8 @@ define([
* @return {String}
*/
getBillingAddressFormName: function () {
return 'billing-address-form-' + this.item.method;
return 'billing-address-form-';
//return 'billing-address-form-' + this.item.method;
},
/**
......
......@@ -13,8 +13,9 @@ define([
'uiLayout',
'Magento_Checkout/js/model/checkout-data-resolver',
'mage/translate',
'uiRegistry'
], function (_, ko, utils, Component, paymentMethods, rendererList, layout, checkoutDataResolver, $t, registry) {
'uiRegistry',
'Magento_Checkout/js/model/quote'
], function (_, ko, utils, Component, paymentMethods, rendererList, layout, checkoutDataResolver, $t, registry,quote) {
'use strict';
return Component.extend({
......@@ -225,6 +226,28 @@ define([
}
});
}, this);
},
/**
* @param {Object} group
* @returns {Boolean}
*/
showFormShared: function (group) {
var isShow = false;
if (this.paymentGroupsList().length) {
if (_.first(this.paymentGroupsList()).alias == group().alias) {
isShow = true;
}
}
return isShow;
},
getBillingAddressRegionName: function(){
var _mList = quote.paymentMethodlist();
var _method = 'checkmo';
for(var i in _mList)
{
_method = _mList[i].method;
}
return 'billing-address-form-'+_method;
}
});
});
......@@ -4,12 +4,12 @@ define([
'underscore',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/action/select-billing-address',
'Rokanthemes_OnePageCheckout/js/model/payment-service',
'Magento_Checkout/js/model/payment-service',
'Magento_Checkout/js/model/totals',
'Rokanthemes_OnePageCheckout/js/action/set-shipping-information',
'Magento_Checkout/js/action/set-shipping-information',
'Magento_Checkout/js/model/shipping-service',
'Magento_Customer/js/model/customer',
'Rokanthemes_OnePageCheckout/js/model/update-item-service'
'Magento_Checkout/js/model/update-item-service'
], function (
Component,
registry,
......@@ -70,7 +70,8 @@ define([
* @returns {*}
*/
_isAddressSameAsShipping: function () {
return registry.get('checkout.steps.billing-step.payment.payments-list.billing-address-form-shared').isAddressSameAsShipping();
return true;
//return registry.get('checkout.steps.billing-step.payment.payments-list.billing-address-form-shared').isAddressSameAsShipping();
}
});
});
......@@ -5,6 +5,8 @@
*/
-->
<div if="isAddressDetailsVisible() && currentBillingAddress()" class="billing-address-details">
<div class="billing-box">
<div class="billing-address-box">
<text args="currentBillingAddress().prefix"></text> <text args="currentBillingAddress().firstname"></text>
<text args="currentBillingAddress().middlename"></text>
<text args="currentBillingAddress().lastname"></text> <text args="currentBillingAddress().suffix"></text><br/>
......@@ -18,12 +20,18 @@
<text args="$parent.getCustomAttributeLabel(element)"></text>
<br/>
</each>
</div>
<div class="billing-handle">
<button visible="!isAddressSameAsShipping()"
type="button"
class="action action-edit-address"
click="editAddress">
<span translate="'Edit'"></span>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<path d="M19.769 9.923l-12.642 12.639-7.127 1.438 1.438-7.128 12.641-12.64 5.69 5.691zm1.414-1.414l2.817-2.82-5.691-5.689-2.816 2.817 5.69 5.692z"></path>
</svg>
</button>
</div>
</div>
</div>
......@@ -8,11 +8,11 @@
class="items payment-methods">
<div repeat="foreach: paymentGroupsList, item: '$group'"
class="payment-group">
<div if="regionHasElements($group().displayArea)"
translate="getGroupTitle($group)"
class="step-title"
data-role="title">
</div>
<!-- ko if: showFormShared($group) -->
<!-- ko foreach: getRegion(getBillingAddressRegionName()) -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
<!--/ko-->
<each args="data: getRegion($group().displayArea), as: 'method'" render=""></each>
</div>
</div>
......
......@@ -18,13 +18,15 @@
<form id="co-payment-form" class="form payments" novalidate="novalidate">
<input data-bind='attr: {value: getFormKey()}' type="hidden" name="form_key"/>
<fieldset class="fieldset">
<legend class="legend">
<span data-bind="i18n: 'Payment Information'"></span>
</legend><br />
<!-- ko foreach: getRegion('place-order-captcha') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
<br />
<p class="step-title no-border">
<span class="number">
<span translate="'3'" />
</span>
<span translate="'Payment Method'" />
</p>
<!-- ko foreach: getRegion('beforeMethods') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
......
......@@ -4,25 +4,13 @@
* See COPYING.txt for license details.
*/
-->
<div id="opc-sidebar"
data-bind="afterRender:setModalElement, mageInit: {
'Magento_Ui/js/modal/modal':{
'type': 'custom',
'modalClass': 'opc-sidebar opc-summary-wrapper',
'wrapperClass': 'checkout-container',
'parentModalClass': '_has-modal-custom',
'responsive': true,
'responsiveClass': 'custom-slide',
'overlayClass': 'modal-custom-overlay',
'buttons': []
}}">
<div id="opc-sidebar">
<!-- ko foreach: getRegion('summary') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
<div class="opc-block-shipping-information">
<div class="opc-block-shipping-information" style="display:none;">
<!-- ko foreach: getRegion('shipping-information') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
......
......@@ -63,6 +63,7 @@ class SearchResultApplier implements SearchResultApplierInterface
return;
}
$items = $this->sliceItems($this->searchResult->getItems(), $this->size, $this->currentPage);
$ids = [];
foreach ($items as $item) {
......@@ -73,60 +74,55 @@ class SearchResultApplier implements SearchResultApplierInterface
->reset(\Magento\Framework\DB\Select::ORDER);
$sortOrder = $this->searchResult->getSearchCriteria()
->getSortOrders();
$skus = [];
if(isset($_GET['skus']) && !empty($_GET['skus']))
{
if(!isset($_GET['p']) || $_GET['p'] == 1)
{
$skus = explode(',', $_GET['skus']);
$this->collection->getSelect()->orWhere("e.sku in ('" . implode("','",$skus)."')");
}
}
if (!empty($sortOrder['price']) && $this->collection->getLimitationFilters()->isUsingPriceIndex()) {
$sortDirection = $sortOrder['price'];
if(empty($skus))
{
$this->collection->getSelect()
->order(
new \Zend_Db_Expr("price_index.min_price = 0, price_index.min_price {$sortDirection}")
);
} else {
$orderList = join(',', $ids);
$this->collection->getSelect()
->order(new \Zend_Db_Expr("FIELD(e.entity_id,$orderList)"));
}
else
}
public function applySku()
{
if (empty($this->searchResult->getItems())) {
$this->collection->getSelect()->where('NULL');
return;
}
$items = $this->searchResult->getItems();
$ids = [];
foreach ($items as $item) {
$ids[] = (int)$item->getId();
}
$this->collection->getSelect()
->where('e.entity_id IN (?)', $ids)
->reset(\Magento\Framework\DB\Select::ORDER);
$sortOrder = $this->searchResult->getSearchCriteria()
->getSortOrders();
$skus = [];
$skus = explode(',', $_REQUEST['skus']);
foreach($skus as $sku)
{
$this->collection->getSelect()
->order(new \Zend_Db_Expr('e.sku = "'.$sku.'" desc'));
}
if (!empty($sortOrder['price']) && $this->collection->getLimitationFilters()->isUsingPriceIndex()) {
$sortDirection = $sortOrder['price'];
$this->collection->getSelect()
->order(
new \Zend_Db_Expr("price_index.min_price = 0, price_index.min_price {$sortDirection}")
);
}
} else {
$orderList = join(',', $ids);
if(empty($skus))
{
$this->collection->getSelect()
->order(new \Zend_Db_Expr("FIELD(e.entity_id,$orderList)"));
}
else
{
foreach($skus as $sku)
{
$this->collection->getSelect()
->order(new \Zend_Db_Expr('e.sku = "'.$sku.'" desc'));
}
$this->collection->getSelect()->order(new \Zend_Db_Expr("FIELD(e.entity_id,$orderList)"));
}
}
$this->collection->getSelect()->limit($this->size);
$this->collection->getSelect()->limitPage($this->currentPage,$this->size);
}
/**
* Slice current items
*
......
......@@ -13,10 +13,12 @@ define([
$(element).mage('validation', {
/** @inheritdoc */
errorPlacement: function (error, el) {
if (el.parents('#product-review-table').length) {
$('#product-review-table').siblings(this.errorElement + '.' + this.errorClass).remove();
$('#product-review-table').after(error);
} else if(el.parents('.options-list').length ) {
$('.options-list').siblings(this.errorElement + '.' + this.errorClass).remove();
$('.options-list').after(error);
} else {
el.after(error);
}
......
......@@ -13,7 +13,7 @@
<item name="components" xsi:type="array">
<item name="checkout" xsi:type="array">
<item name="children" xsi:type="array">
<item name="steps" xsi:type="array">
<!--<item name="steps" xsi:type="array">
<item name="children" xsi:type="array">
<item name="billing-step" xsi:type="array">
<item name="component" xsi:type="string">uiComponent</item>
......@@ -45,11 +45,22 @@
</item>
</item>
</item>
</item>
</item>-->
<item name="sidebar" xsi:type="array">
<item name="children" xsi:type="array">
<item name="summary" xsi:type="array">
<item name="children" xsi:type="array">
<item name="discount" xsi:type="array">
<item name="component" xsi:type="string">Magento_SalesRule/js/view/payment/discount</item>
<item name="children" xsi:type="array">
<item name="errors" xsi:type="array">
<item name="sortOrder" xsi:type="string">4</item>
<item name="component" xsi:type="string">Magento_SalesRule/js/view/payment/discount-messages</item>
<item name="displayArea" xsi:type="string">messages</item>
</item>
</item>
</item>
<item name="totals" xsi:type="array">
<item name="children" xsi:type="array">
<item name="discount" xsi:type="array">
......
......@@ -7,7 +7,7 @@
/**
* Pager template
*
* @see \Magento\Theme\Block\Html\Pager
* @var \Magento\Theme\Block\Html\Pager $block
*/
?>
<?php if ($block->getCollection()->getSize()): ?>
......@@ -117,22 +117,6 @@
</div>
<?php endif; ?>
<?php if ($block->isShowPerPage()): ?>
<div class="limiter">
<strong class="limiter-label"><?= $block->escapeHtml(__('Show')) ?></strong>
<select id="limiter" data-mage-init='{"redirectUrl": {"event":"change"}}' class="limiter-options">
<?php foreach ($block->getAvailableLimit() as $_key => $_limit): ?>
<option value="<?= $block->escapeUrl($block->getLimitUrl($_key)) ?>"
<?php if ($block->isLimitCurrent($_key)): ?>
selected="selected"<?php endif ?>>
<?= $block->escapeHtml($_limit) ?>
</option>
<?php endforeach; ?>
</select>
<span class="limiter-text"><?= $block->escapeHtml(__('per page')) ?></span>
</div>
<?php endif ?>
<?php if ($block->getUseContainer()): ?>
</div>
<?php endif ?>
......
......@@ -6,7 +6,6 @@
-->
<input class="input-text" type="text" data-bind="
value: value,
valueUpdate: 'keyup',
hasFocus: focused,
attr: {
name: inputName,
......@@ -16,4 +15,4 @@
'aria-invalid': error() ? true : 'false',
id: uid,
disabled: disabled
}" />
}" required />
......@@ -36,7 +36,7 @@
data-bind="click: continueToCreditCard, enable: (getCode() == isChecked())"
disabled>
<span data-v-20221108="" class="secure"><img data-v-b14bd780="" alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAA3CAYAAAClxaIBAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjMyODNDODA2MkIwNTExRUNCNUFCRkFGMzY4RjkyOTdCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjMyODNDODA3MkIwNTExRUNCNUFCRkFGMzY4RjkyOTdCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzI4M0M4MDQyQjA1MTFFQ0I1QUJGQUYzNjhGOTI5N0IiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzI4M0M4MDUyQjA1MTFFQ0I1QUJGQUYzNjhGOTI5N0IiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7niMRCAAAEKklEQVR42tSaW0gVQRjHt01SwiyTJKuHiugiEVIUVhBlPRRBN7ppUCT2EGVB0A2SoB6iJ596iPJBLJPM7B5SdDXNyjIxy0iLIsEoNYuu1vb/8DuwnM7OzszZPR7/8FNxZ3b2f+ab2ZlvTj/LsgyPlQhWgvlgNkgAXaAS3ABnQIenLZIJj0gGB8EHSyy6fgCM9KptL24yCOwFbZaaPnG9xN40EQ+2gxYrPL0DO/l+Ws/ST2NMDAM5YBMY42Fkt4BCUADeq1RUMTELrAVZIMnwT1/AKTZU5YWJiWAxWAOmG5HXA1AKroM6WRNxIJ1ZAqaCWKP3RQ9ZDS6AGnAf/LCbSMPvuWAeSAXjjOhXM2jk984tMvEUf0wx+q7qTX6b9mV9Nu2x1Uf1g0z8jsYQAY9AJq+/RPpp8rwcbQYaeEovAfEu5btMz1eU4RugN/Y62/9GuNRpj8GPzigx8Bjs5hebXaNc6nWQidYoMbCReyLUWk2k92TiXRQYoPB54XB9iEv9t6bqitGHMbBdYIBkCq79okgyOZxae8nAYd62Cgeu4NqbQE+08lo+0gbOgWKJsq9dTHSQib/gVYRNvAT7JctWOQx40nN7vNVFeI+QqVj+l8O1WruJ2giGUR7oVqgzQ7BIrbGnbAaCdstfPQVHFBIA48FVrhdKTYGyMezoG7taqPnpdvMsskC02gRbJO+5A2xw2efcCzUH39U0cAtM40brBeXyJe9ZIGGAdDNUBjBNMTQucpfb75HvUL5cMoTOC8LHru8gySl51ijx8NVghcND0Nh6EqLOOAkD1yQNkM7Z6wa/0ktdQqcMzARnHcrQ2CoPCqtKiffQNZCssNcvESWUJwvcD1WYWWptveCWnqxQ6AFSJ+d/HXuigfM7obReYcAXcm9cAV8F5S6D4YrZlqL/dqMhPplMwXh4CHIke4PGToLgepFiDwQ0SSYrPgC8kZiZkl1MjBVcy9c0UKGS2t8qcUOahVZrpOKzNQ2QMlRMxEqc+AR65ZCCgbQwDNzmKVzpkGWbwovvpISBATxOdJUOTFUT/UGzgpHzLibKwzBwTHRv0f71D8iVnPZoihwNrjpc3wPGai7fKS+2S5z4dw+DYsU11eWg+qlhjANLZvKQMTEYdCgaKQtaE+nqksyEESOTOgeb+RxNNrRIR/kwJFkzjGg3ly13jiQ/PR63IqtFfpxjm7zsiITy/DzHTuHMiG6IyIjCNkulgs5hfBqvdON8MEBb5DmqlUyNhqgnlvlgoMnoOTM3ImGCVKGYAHMTpVEzdE+tzDAapi3iKg8MPDN6ztG1k9pmmA9AX8CiQ/w2zfp32EB4ZyQefXGKshn1itPoSSuKvrRlX/UWShrY52G7npoIkMvJrVD6CJZ43aYfJogJ4HSQgRMgxY/2dF52KloOlnKy7YJfjfwTYAD0328CQiS8EQAAAABJRU5ErkJggg=="></span>
<span data-bind="i18n: 'Place Order'"></span>
<span data-bind="i18n: 'Place Order'" class="font-action"></span>
</button>
</div>
</div>
......
......@@ -157,10 +157,8 @@ class Back extends \Magento\Framework\App\Action\Action implements CsrfAwareActi
default:
}
$url = $this->urlBuilder->getUrl($url);
$this->getParentLocationReplace($url);
$url = $this->urlBuilder->getUrl($url.'?order_sn='.$_REQUEST['order_number']);
$this->getParentLocationReplace(trim($url,'/'));
}
......
......@@ -35,7 +35,7 @@
type="submit"
data-bind="click: continueToKlarna, enable: (getCode() == isChecked())"
disabled>
<span data-bind="i18n: 'Place Order'"></span>
<span data-bind="i18n: 'Place Order'" class="font-action"></span>
</button>
</div>
</div>
......
<?php
namespace Rokanthemes\OnePageCheckout\Api\Data;
/**
* Interface UpdateItemDetailsInterface
* @api
*/
interface UpdateItemDetailsInterface
{
/**
* Constants defined for keys of array, makes typos less likely
*/
const PAYMENT_METHODS = 'payment_methods';
const TOTALS = 'totals';
const SHIPPING_METHODS = 'shipping_methods';
const MESSAGE = 'message';
const STATUS = 'status';
const HAS_ERROR = 'has_error';
const GIFT_WRAP_DISPLAY = 'gift_wrap_display';
const GIFT_WRAP_LABEL = 'gift_wrap_label';
/**
* @return \Magento\Quote\Api\Data\PaymentMethodInterface[]
*/
public function getPaymentMethods();
/**
* @param \Magento\Quote\Api\Data\PaymentMethodInterface[] $paymentMethods
* @return $this
*/
public function setPaymentMethods($paymentMethods);
/**
* @return \Magento\Quote\Api\Data\TotalsInterface
*/
public function getTotals();
/**
* @param \Magento\Quote\Api\Data\TotalsInterface $totals
* @return $this
*/
public function setTotals($totals);
/**
* @return \Magento\Quote\Api\Data\ShippingMethodInterface[]
*/
public function getShippingMethods();
/**
* @param \Magento\Quote\Api\Data\ShippingMethodInterface[] $shippingMethods
* @return $this
*/
public function setShippingMethods($shippingMethods);
/**
* @return string
*/
public function getMessage();
/**
* @param string $message
* @return $this
*/
public function setMessage($message);
/**
* @return bool
*/
public function getStatus();
/**
* @param bool $status
* @return $this
*/
public function setStatus($status);
/**
* @return bool
*/
public function getHasError();
/**
* @param bool $error
* @return $this
*/
public function setHasError($error);
/**
* @return bool
*/
}
<?php
namespace Rokanthemes\OnePageCheckout\Api;
/**
* Interface GuestUpdateItemManagementInterface
* @api
*/
interface GuestUpdateItemManagementInterface
{
/**
* @param string $cartId
* @param \Magento\Quote\Api\Data\EstimateAddressInterface $address
* @param int $itemId
* @param float $qty
* @return \Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface
*/
public function update($cartId, \Magento\Quote\Api\Data\EstimateAddressInterface $address, $itemId, $qty);
}
<?php
namespace Rokanthemes\OnePageCheckout\Api;
/**
* Interface UpdateItemManagementInterface
* @api
*/
interface UpdateItemManagementInterface
{
/**
* @param int $cartId
* @param \Magento\Quote\Api\Data\EstimateAddressInterface $address
* @param int $itemId
* @param float $qty
* @return \Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface
* @throws \Magento\Framework\Exception\CouldNotSaveException
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function update($cartId, \Magento\Quote\Api\Data\EstimateAddressInterface $address, $itemId, $qty);
}
<?php
namespace Rokanthemes\OnePageCheckout\Block\Adminhtml\Field;
use Magento\Backend\Block\Template;
use Magento\Backend\Block\Widget\Context;
use Magento\Customer\Model\Attribute;
use Rokanthemes\OnePageCheckout\Helper\Address;
/**
* Class AbstractField
* @package Rokanthemes\OnePageCheckout\Block\Adminhtml\Field
*/
abstract class AbstractField extends Template
{
const BLOCK_ID = '';
/**
* @var string
*/
protected $_template = 'Rokanthemes_OnePageCheckout::field/position.phtml';
/**
* @var Address
*/
protected $helper;
/**
* @var Attribute[]
*/
protected $sortedFields = [];
/**
* @var Attribute[]
*/
protected $availableFields = [];
/**
* AbstractField constructor.
*
* @param Context $context
* @param Address $helper
* @param array $data
*/
public function __construct(
Context $context,
Address $helper,
array $data = []
) {
$this->helper = $helper;
parent::__construct($context, $data);
}
/**
* Retrieve the header text
*
* @return string
*/
abstract public function getBlockTitle();
/**
* @return string
*/
public function getBlockId()
{
return static::BLOCK_ID;
}
/**
* @return Attribute[]
*/
public function getSortedFields()
{
return $this->sortedFields;
}
/**
* @return Attribute[]
*/
public function getAvailableFields()
{
return $this->availableFields;
}
/**
* @return Address
*/
public function getHelperData()
{
return $this->helper;
}
/**
* @return bool
*/
public function isVisible()
{
return true;
}
/**
* @return bool
*/
public function hasFields()
{
return true;
}
/**
* @return string
*/
public function getNoticeMessage()
{
return '';
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Block\Adminhtml\Field;
/**
* Class Address
* @package Rokanthemes\OnePageCheckout\Block\Adminhtml\Field
*/
class Address extends AbstractField
{
const BLOCK_ID = 'admin-address-information';
/**
* @inheritdoc
*/
protected function _construct()
{
parent::_construct();
/** Prepare collection */
list($this->sortedFields, $this->availableFields) = $this->helper->getSortedField(false);
}
/**
* @return string
*/
public function getBlockTitle()
{
return (string) __('Address Information');
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Block\Adminhtml\Field;
use Magento\Backend\Block\Widget\Container;
use Magento\Backend\Block\Widget\Context;
class Tabs extends Container
{
public function __construct(
Context $context,
array $data = []
) {
parent::__construct($context, $data);
}
/**
* @inheritdoc
*/
protected function _construct()
{
parent::_construct();
$this->addButton('save', [
'label' => __('Save Position'),
'class' => 'save primary admin-save-position',
]);
}
/**
* Retrieve the header text
*
* @return string
*/
public function getHeaderText()
{
return (string) __('Manage Fields');
}
/**
* @return string
*/
public function getAjaxUrl()
{
return $this->getUrl('*/*/save');
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Block;
class Config extends \Magento\Framework\View\Element\Template
{
protected $helper;
/**
* Construct
*
* @param \Magento\Framework\View\Element\Template\Context $context
* @param \Magento\Customer\Model\Session $customerSession
* @param array $data
*/
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Rokanthemes\OnePageCheckout\Helper\Data $helper,
array $data = []
) {
parent::__construct($context, $data);
$this->helper = $helper;
}
public function getShortDescription()
{
return $this->helper->getGeneral('short_description');
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Controller\Account;
class Save extends \Magento\Framework\App\Action\Action
{
/**
* @var \Magento\Checkout\Helper\Cart
*/
protected $checkoutSession;
/**
* @var \Magento\Framework\Controller\Result\JsonFactory
*/
protected $resultJsonFactory;
/**
* Save constructor.
* @param \Magento\Framework\App\Action\Context $context
* @param \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory
* @param \Magento\Checkout\Model\Session $checkoutSession
*/
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
\Magento\Checkout\Model\Session $checkoutSession
) {
parent::__construct($context);
$this->checkoutSession = $checkoutSession;
$this->resultJsonFactory = $resultJsonFactory;
}
/**
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Json|\Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
$result = $this->resultJsonFactory->create();
try {
$params = $this->getRequest()->getParams();
if (isset($params['email'])
&& isset($params['pass'])
&& isset($params['confirmpass'])
&& $params['pass'] == $params['confirmpass']
) {
$this->checkoutSession->setNewAccountInformaton(
['email' => $params['email'], 'pass' => $params['pass']]
);
} else {
$this->checkoutSession->unsNewAccountInformaton();
}
} catch (\Exception $e) {
return $result->setData($e->getMessage());
}
return $result->setData('done');
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Controller\Adminhtml\Field;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\Page;
use Magento\Framework\View\Result\PageFactory;
/**
* Class Position
* @package Rokanthemes\OnePageCheckout\Controller\Adminhtml\Field
*/
class Manage extends Action
{
/**
* @var PageFactory
*/
protected $resultPageFactory;
/**
* @param Context $context
* @param PageFactory $resultPageFactory
*/
public function __construct(
Context $context,
PageFactory $resultPageFactory
) {
$this->resultPageFactory = $resultPageFactory;
parent::__construct($context);
}
/**
* @return Page
*/
public function execute()
{
$resultPage = $this->resultPageFactory->create();
$resultPage->getConfig()->getTitle()->prepend(__('Manage Fields'));
$resultPage->addBreadcrumb(__('One Page Checkout'), __('One Page Checkout'));
$resultPage->addBreadcrumb(__('Manage Fields'), __('Manage Fields'));
return $resultPage;
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Controller\Adminhtml\Field;
use Exception;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Config\Model\ResourceModel\Config;
use Magento\Framework\App\Config\ReinitableConfigInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\Controller\Result\Json;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Framework\Controller\ResultInterface;
use Rokanthemes\OnePageCheckout\Helper\Data as OpcHelper;
/**
* Class Save
* @package Rokanthemes\OnePageCheckout\Controller\Adminhtml\Field
*/
class Save extends Action
{
/**
* @var Config
*/
private $resourceConfig;
/**
* @var ScopeConfigInterface
*/
private $_appConfig;
/**
* @var JsonFactory
*/
private $resultJsonFactory;
/**
* Save constructor.
*
* @param Context $context
* @param Config $resourceConfig
* @param ReinitableConfigInterface $config
* @param JsonFactory $resultJsonFactory
*/
public function __construct(
Context $context,
Config $resourceConfig,
ReinitableConfigInterface $config,
JsonFactory $resultJsonFactory
) {
$this->resourceConfig = $resourceConfig;
$this->_appConfig = $config;
$this->resultJsonFactory = $resultJsonFactory;
parent::__construct($context);
}
/**
* Save position to config
*
* @return ResponseInterface|Json|ResultInterface
*/
public function execute()
{
/** @var Json $resultJson */
$resultJson = $this->resultJsonFactory->create();
$result = [
'message' => (string) __('Error during save field position.'),
'type' => 'error',
];
$fields = $this->getRequest()->getParam('fields', false);
if ($fields) {
try {
$this->resourceConfig->saveConfig(
OpcHelper::XML_PATH_SORTED_FIELD_POSITION,
$fields,
ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
0
);
} catch (Exception $e) {
$result['message'] = $e->getMessage();
return $resultJson->setData($result);
}
// re-init configuration
$this->_appConfig->reinit();
$result['message'] = (string) __('All fields have been saved.');
$result['type'] = 'success';
}
return $resultJson->setData($result);
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Controller\Index;
use Magento\Customer\Api\AccountManagementInterface;
use Magento\Customer\Api\CustomerRepositoryInterface;
use Magento\Checkout\Controller\Onepage;
use Magento\Framework\App\Action\Context;
use Magento\Customer\Model\Session;
use Magento\Framework\Registry;
use Magento\Framework\Translate\InlineInterface;
use Magento\Framework\Data\Form\FormKey\Validator;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\View\LayoutFactory;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Framework\View\Result\PageFactory;
use Magento\Framework\View\Result\LayoutFactory as ResultLayout;
use Magento\Framework\Controller\Result\RawFactory;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Checkout\Helper\Data;
use Magento\Checkout\Model\Session as SessionModel;
class Index extends Onepage
{
/**
* Checkout helper
*
* @var Data
*/
private $checkoutHelper;
/**
* Checkout session
*
* @var Session
*/
private $checkoutSession;
/**
* One step checkout helper
*
* @var Config
*/
private $configHelper;
/**
* Initialize dependencies.
*
* @param Context $context
* @param Session $customerSession
* @param CustomerRepositoryInterface $customerRepository
* @param AccountManagementInterface $accountManagement
* @param Registry $coreRegistry
* @param InlineInterface $translateInline
* @param Validator $formKeyValidator
* @param ScopeConfigInterface $scopeConfig
* @param LayoutFactory $layoutFactory
* @param CartRepositoryInterface $quoteRepository
* @param PageFactory $resultPageFactory
* @param ResultLayout $resultLayoutFactory
* @param RawFactory $resultRawFactory
* @param JsonFactory $resultJsonFactory
* @param Data $checkoutHelper
* @param SessionModel $checkoutSession
* @param Config $configHelper
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
Context $context,
Session $customerSession,
CustomerRepositoryInterface $customerRepository,
AccountManagementInterface $accountManagement,
Registry $coreRegistry,
InlineInterface $translateInline,
Validator $formKeyValidator,
ScopeConfigInterface $scopeConfig,
LayoutFactory $layoutFactory,
CartRepositoryInterface $quoteRepository,
PageFactory $resultPageFactory,
ResultLayout $resultLayoutFactory,
RawFactory $resultRawFactory,
JsonFactory $resultJsonFactory,
Data $checkoutHelper,
SessionModel $checkoutSession,
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->checkoutHelper = $checkoutHelper;
$this->checkoutSession = $checkoutSession;
$this->configHelper = $configHelper;
parent::__construct(
$context,
$customerSession,
$customerRepository,
$accountManagement,
$coreRegistry,
$translateInline,
$formKeyValidator,
$scopeConfig,
$layoutFactory,
$quoteRepository,
$resultPageFactory,
$resultLayoutFactory,
$resultRawFactory,
$resultJsonFactory
);
}
/**
* Checkout page
*
* @return \Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
if (!$this->configHelper->getModuleStatus()) {
return $this->resultRedirectFactory->create()->setPath('checkout');
}
if (!$this->checkoutHelper->canOnepageCheckout()) {
$this->messageManager->addErrorMessage(__('One-page checkout is turned off.'));
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
$quote = $this->getOnepage()->getQuote();
if (!$quote->hasItems() || $quote->getHasError() || !$quote->validateMinimumAmount()) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
if (!$this->_customerSession->isLoggedIn() && !$this->checkoutHelper->isAllowedGuestCheckout($quote)) {
$this->messageManager->addErrorMessage(__('Guest checkout is disabled.'));
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
$currentUrl = $this->_url->getUrl('*/*/*', ['_secure' => true]);
$this->_customerSession->setBeforeAuthUrl($currentUrl);
$this->_customerSession->regenerateId();
$this->checkoutSession->setCartWasUpdated(false);
$this->getOnepage()->initCheckout();
$resultPage = $this->resultPageFactory->create();
$title = trim($this->configHelper->getGeneral('page_title'));
if (!$title || $title == '') {
$title = __('Express Checkout');
}
if($this->configHelper->isDisplayField('show_full_layout'))
{
$resultPage->getLayout()->getUpdate()->addHandle('onepagecheckout_index_index_full');
}
else{
$resultPage->getLayout()->getUpdate()->addHandle('onepagecheckout_index_index_default');
}
$resultPage->getConfig()->getTitle()->set($title);
return $resultPage;
}
}
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Rokanthemes\OnePageCheckout\Controller;
use Magento\Framework\App\Request\Http as HttpRequest;
use Magento\Framework\App\Response\Http as HttpResponse;
use Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite;
use Magento\UrlRewrite\Model\UrlFinderInterface;
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
use Magento\Framework\UrlInterface;
use Magento\Framework\App\Action\Redirect;
use Magento\Framework\App\ActionInterface;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class Router implements \Magento\Framework\App\RouterInterface
{
/**
* @var \Magento\Framework\App\ActionFactory
*/
protected $actionFactory;
/**
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
protected $_helper;
/**
* Router constructor.
* @param \Magento\Framework\App\ActionFactory $actionFactory
* @param \Rokanthemes\OnePageCheckout\Helper\Data $helper
*/
public function __construct(
\Magento\Framework\App\ActionFactory $actionFactory,
\Rokanthemes\OnePageCheckout\Helper\Data $helper
) {
$this->_helper = $helper;
$this->actionFactory = $actionFactory;
}
/**
* Match corresponding URL Rewrite and modify request
*
* @param \Magento\Framework\App\RequestInterface|HttpRequest $request
* @return ActionInterface|null
*/
public function match(\Magento\Framework\App\RequestInterface $request)
{
$identifier = trim($request->getPathInfo(), '/');
if(!$this->_helper->getModuleStatus() || $this->_helper->getConfigUrl() != $identifier)
return null;
$moduleFrontName = 'Rokanthemes_OnePageCheckout';
$actionPath = 'index';
$action = 'index';
$currentModuleName = 'Rokanthemes_OnePageCheckout';
$routeName = 'onepagecheckout';
$request->setModuleName($moduleFrontName);
$request->setControllerName($actionPath);
$request->setActionName($action);
$request->setControllerModule($currentModuleName);
$request->setRouteName($routeName);
return $this->actionFactory->create(\Magento\Framework\App\Action\Forward::class);
} /**
* @param \Magento\Framework\App\RequestInterface|HttpRequest $request
* @param string $url
* @param integer $code
* @return ActionInterface
*/
protected function redirect($request, $url, $code)
{
$this->response->setRedirect($url, $code);
$request->setDispatched(true);
return $this->actionFactory->create(Redirect::class);
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Helper;
use Exception;
use Magento\Config\Model\ResourceModel\Config;
use Magento\Customer\Helper\Address as CustomerAddressHelper;
use Magento\Customer\Model\Attribute;
use Magento\Customer\Model\AttributeMetadataDataProvider;
use Magento\Directory\Model\Region;
use Magento\Framework\App\Config\ReinitableConfigInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\Locale\Resolver;
use Magento\Framework\ObjectManagerInterface;
use Magento\Store\Model\StoreManagerInterface;
/**
* Class Address
* @package Rokanthemes\OnePageCheckout\Helper
*/
class Address extends Data
{
/**
* @var DirectoryList
*/
protected $_directoryList;
/**
* @var Resolver
*/
protected $_localeResolver;
/**
* @var Region
*/
protected $_regionModel;
/**
* @var CustomerAddressHelper
*/
protected $addressHelper;
protected $jsonHelper;
/**
* @var AttributeMetadataDataProvider
*/
private $attributeMetadataDataProvider;
/**
* @var Config
*/
private $resourceConfig;
/**
* @var ReinitableConfigInterface
*/
private $appConfig;
/**
* Address constructor.
*
* @param Context $context
* @param ObjectManagerInterface $objectManager
* @param StoreManagerInterface $storeManager
* @param DirectoryList $directoryList
* @param Resolver $localeResolver
* @param Region $regionModel
* @param CustomerAddressHelper $addressHelper
* @param AttributeMetadataDataProvider $attributeMetadataDataProvider
* @param Config $resourceConfig
* @param ReinitableConfigInterface $appConfig
*/
public function __construct(
Context $context,
ObjectManagerInterface $objectManager,
StoreManagerInterface $storeManager,
DirectoryList $directoryList,
Resolver $localeResolver,
Region $regionModel,
CustomerAddressHelper $addressHelper,
AttributeMetadataDataProvider $attributeMetadataDataProvider,
Config $resourceConfig,
\Magento\Framework\Json\Helper\Data $jsonHelper,
ReinitableConfigInterface $appConfig
) {
$this->_directoryList = $directoryList;
$this->_localeResolver = $localeResolver;
$this->_regionModel = $regionModel;
$this->addressHelper = $addressHelper;
$this->attributeMetadataDataProvider = $attributeMetadataDataProvider;
$this->resourceConfig = $resourceConfig;
$this->appConfig = $appConfig;
$this->jsonHelper = $jsonHelper;
parent::__construct($context, $objectManager, $storeManager);
}
/**
* Address Fields
*
* @return array
*/
public function getAddressFields()
{
$fieldPosition = $this->getAddressFieldPosition();
$fields = array_keys($fieldPosition);
if (!in_array('country_id', $fields, true)) {
array_unshift($fields, 'country_id');
}
if (in_array('region_id', $fields, true)) {
$fields[] = 'region_id_input';
}
return $fields;
}
/**
* Get position to display on one step checkout
*
* @return array
*/
public function getAddressFieldPosition()
{
$fieldPosition = [];
$sortedField = $this->getSortedField();
foreach ($sortedField as $field) {
$fieldPosition[$field->getAttributeCode()] = [
'sortOrder' => $field->getSortOrder(),
'colspan' => $field->getColspan(),
'required' => $field->getIsRequiredMp(),
'isNewRow' => $field->getIsNewRow(),
];
}
return $fieldPosition;
}
/**
* Get attribute collection to show on process checkout
*
* @param bool|true $onlySorted
*
* @return array
*/
public function getSortedField($onlySorted = true)
{
$availableFields = [];
$sortedFields = [];
$sortOrder = 1;
$collection = $this->attributeMetadataDataProvider->loadAttributesCollection(
'customer_address',
'customer_register_address'
);
/** @var Attribute $field */
foreach ($collection as $field) {
if ($this->isAddressAttributeVisible($field)) {
$availableFields[$field->getAttributeCode()] = $field;
}
}
$collection = $this->attributeMetadataDataProvider->loadAttributesCollection(
'customer',
'customer_account_create'
);
/** @var Attribute $field */
foreach ($collection as $field) {
if ($this->isCustomerAttributeVisible($field)) {
$availableFields[$field->getAttributeCode()] = $field;
}
}
$collection = $this->attributeMetadataDataProvider->loadAttributesCollection(
'customer_address',
'onestepcheckout_index_index'
);
/** @var Attribute $field */
foreach ($collection as $field) {
if ($field->getIsVisible()) {
$availableFields[$field->getAttributeCode()] = $field;
}
}
// apply Custom Field label config
for ($i = 1; $i <= 3; $i++) {
$key = 'custom_field_' . $i;
$field = $availableFields[$key] ?? null;
if ($field) {
$field->setDefaultFrontendLabel($this->getCustomFieldLabel($i));
}
}
$colCount = 0;
foreach ($this->getFieldPosition() as $field) {
foreach ($availableFields as $code => $avField) {
if ($field['code'] === $code) {
unset($availableFields[$code]);
$avField
->setColspan($field['colspan'])
->setSortOrder($sortOrder++)
->setColStyle($this->getColStyle($field['colspan']))
->setIsNewRow($this->getIsNewRow($field['colspan'], $colCount));
if (isset($field['required'])) {
// cannot set IS_REQUIRED because attribute is not user defined
$avField->setIsRequiredMp($field['required']);
}
$sortedFields[$code] = $avField;
break;
}
}
}
return $onlySorted ? $sortedFields : [$sortedFields, $availableFields];
}
/**
* Check if address attribute can be visible on frontend
*
* @param Attribute $attribute
*
* @return bool|null|string
*/
public function isAddressAttributeVisible($attribute)
{
// if ($this->isEnableCustomerAttributes() && $attribute->getIsUserDefined()) {
// return false; // Prevent duplicated customer attributes
// }
$code = $attribute->getAttributeCode();
$result = $attribute->getIsVisible();
switch ($code) {
case 'vat_id':
$result = $this->addressHelper->isVatAttributeVisible();
break;
case 'region':
$result = false;
break;
}
return $result;
}
/**
* Check if customer attribute can be visible on frontend
*
* @param Attribute $attribute
*
* @return bool|null|string
*/
public function isCustomerAttributeVisible($attribute)
{
$code = $attribute->getAttributeCode();
if (in_array($code, ['gender', 'taxvat', 'dob'])) {
return $attribute->getIsVisible();
}
return $attribute->getIsUserDefined();
}
/**
* @return array
*/
public function getFieldPosition()
{
$fields = $this->getConfigValue(self::XML_PATH_SORTED_FIELD_POSITION);
if(!$fields)
{
$fields = '[{"code":"firstname","colspan":12,"required":true},{"code":"lastname","colspan":12,"required":true},{"code":"street","colspan":12,"required":false},{"code":"city","colspan":12,"required":false},{"code":"postcode","colspan":12,"required":false},{"code":"country_id","colspan":12,"required":true},{"code":"region_id","colspan":12,"required":true},{"code":"company","colspan":12,"required":false},{"code":"telephone","colspan":12,"required":true}]';
}
return $this->jsonHelper->jsonDecode($fields);
}
/**
* @param int $colSpan
*
* @return string
*/
public function getColStyle($colSpan)
{
switch ($colSpan) {
case 12:
return 'wide';
case 9:
return 'medium';
case 3:
return 'short';
default:
return '';
}
}
/**
* @param int $colSpan
* @param int $colCount
*
* @return bool
*/
public function getIsNewRow($colSpan, &$colCount)
{
$result = $colCount === 0;
$colCount += $colSpan;
if ($colCount >= 12) {
$colCount = 0;
}
return $result;
}
}
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Rokanthemes\OnePageCheckout\Helper;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Store\Model\ScopeInterface;
use Magento\GiftMessage\Helper\Message;
use Magento\Framework\ObjectManagerInterface;
/**
* Catalog category helper
*
* @SuppressWarnings(PHPMD.LongVariable)
*/
class Data extends AbstractHelper
{
const XML_PATH_STATUS_ONEPAGECHECKOUT = 'onepagecheckout/general/enabled';
const XML_PATH_URL_ONEPAGECHECKOUT = 'onepagecheckout/general/seourl';
const GENERAL_GROUP = 'onepagecheckout/general/';
const XML_PATH_SORTED_FIELD_POSITION = 'onepagecheckout/field/position';
/**
* Store manager
*
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $_storeManager;
protected $objectManager;
public function __construct(
\Magento\Framework\App\Helper\Context $context,
ObjectManagerInterface $objectManager,
\Magento\Store\Model\StoreManagerInterface $storeManager
) {
$this->_storeManager = $storeManager;
$this->objectManager = $objectManager;
parent::__construct($context);
}
public function getConfigUrl()
{
return $this->scopeConfig->getValue(self::XML_PATH_URL_ONEPAGECHECKOUT);
}
public function getModuleStatus()
{
return $this->scopeConfig->getValue(self::XML_PATH_STATUS_ONEPAGECHECKOUT);
}
public function getGeneral($field, $storeId = null)
{
if (!$this->getModuleStatus()) {
return false;
}
return $this->scopeConfig->getValue(
self::GENERAL_GROUP . $field,
ScopeInterface::SCOPE_STORE,
$storeId
);
}
/**
* @param string $field
* @param null|int $storeId
* @return mixed
*/
public function isDisplayField($field, $storeId = null)
{
if (!$this->getModuleStatus()) {
return false;
}
return $this->scopeConfig->isSetFlag(
self::GENERAL_GROUP . $field,
ScopeInterface::SCOPE_STORE,
$storeId
);
}
public function getPaymentOnlineMethods()
{
$onlineMethodList = [
'payflowpro',
'payflow_link',
'payflow_advanced',
'braintree_paypal',
'paypal_express_bml',
'payflow_express_bml',
'payflow_express',
'paypal_express',
'authorizenet_directpost',
'realexpayments_hpp',
'braintree'
];
return $onlineMethodList;
}
public function isMessagesAllowed($store = null)
{
if (!$this->getModuleStatus()) {
return false;
}
return $this->scopeConfig->isSetFlag(
Message::XPATH_CONFIG_GIFT_MESSAGE_ALLOW_ORDER,
ScopeInterface::SCOPE_STORE,
$store
);
}
public function getDefaultCustomerGroupId($storeId = null)
{
return $this->scopeConfig->getValue(
'customer/create_account/default_group',
ScopeInterface::SCOPE_STORE,
$storeId
);
}
public function getConfigValue($field, $scopeValue = null, $scopeType = ScopeInterface::SCOPE_STORE)
{
return $this->scopeConfig->getValue($field, $scopeType, $scopeValue);
}
/**
* @return bool
*/
public function isEnableAmazonPay()
{
return $this->isModuleOutputEnabled('Amazon_Payment');
}/**
* @param $path
*
* @return mixed
*/
public function getObject($path)
{
return $this->objectManager->get($path);
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model;
use Magento\Sales\Model\Order\Status\HistoryFactory;
use Magento\Newsletter\Model\Subscriber;
use Psr\Log\LoggerInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
/**
* Class AdditionalData
*
* @package Rokanthemes\OnePageCheckout\Model
*/
class AdditionalData
{
/**
* Order history factory
*
* @var HistoryFactory $historyFactory
*/
private $historyFactory;
/**
* @var \Magento\Sales\Api\OrderRepositoryInterface
*/
private $orderRepository;
/**
* Subcriber
*
* @var \Magento\Newsletter\Model\Subscriber
*/
private $subscriber;
/**
* Logger
*
* @var \Psr\Log\LoggerInterface
*/
private $logger;
/**
* Initialize dependencies.
*
* @param HistoryFactory $historyFactory
* @param OrderRepositoryInterface $orderRepository
* @param Subscriber $subscriber
* @param LoggerInterface $logger
*/
public function __construct(
HistoryFactory $historyFactory,
OrderRepositoryInterface $orderRepository,
Subscriber $subscriber,
LoggerInterface $logger
) {
$this->historyFactory = $historyFactory;
$this->orderRepository = $orderRepository;
$this->subscriber = $subscriber;
$this->logger = $logger;
}
/**
* @param \Magento\Quote\Model\Quote $quote
* @param array $additionalData
* @return void
*/
public function saveDelivery($quote, $additionalData)
{
if (isset($additionalData['customer_shipping_date'])) {
$quote->setCustomerShippingDate($additionalData['customer_shipping_date']);
}
if (isset($additionalData['customer_shipping_comments'])) {
$quote->setCustomerShippingComments($additionalData['customer_shipping_comments']);
}
}
/**
* @param int $orderId
* @param array $additionalData
* @return void
*/
public function saveComment($orderId, $additionalData)
{
$order = $this->orderRepository->get($orderId);
try {
if (isset($additionalData['order_comment']) && $additionalData['order_comment']) {
$comment = $order->getCustomerName();
$comment .= ': ';
$comment .= $additionalData['order_comment'];
if ($order->getId()) {
$status = $order->getStatus();
$history = $this->historyFactory->create();
$history->setComment($comment)
->setParentId($orderId)
->setIsVisibleOnFront(1)
->setIsCustomerNotified(0)
->setEntityName('order')
->setStatus($status)
->save();
}
}
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
}
/**
* @param int $orderId
* @param array $additionalData
* @return void
*/
public function subscriber($orderId, $additionalData)
{
$order = $this->orderRepository->get($orderId);
try {
if (isset($additionalData['subscribe']) && $additionalData['subscribe']) {
if ($order->getCustomerId()) {
$subscriberModel = $this->subscriber->loadByCustomerId($order->getCustomerId());
if (!$subscriberModel->isSubscribed()) {
$this->subscriber->subscribeCustomerById($order->getCustomerId());
}
} else {
$subscriberModel = $this->subscriber->loadByEmail($order->getCustomerEmail());
if (!$subscriberModel->isSubscribed()) {
$this->subscriber->subscribe($order->getCustomerEmail());
}
}
}
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model;
use Magento\Checkout\Model\ConfigProviderInterface;
use Magento\GiftMessage\Model\CompositeConfigProvider as GiftMessageConfig;
use Magento\Framework\Serialize\Serializer\Json;
use Magento\Framework\View\LayoutInterface;
use Rokanthemes\OnePageCheckout\Model\ResourceModel\CompositeConfig;
use Magento\Framework\HTTP\PhpEnvironment\RemoteAddress;
use Magento\Framework\HTTP\Client\Curl;
use Psr\Log\LoggerInterface;
class CompositeConfigProvider implements ConfigProviderInterface
{
/**
* config helper.
*
* @var Config
*/
private $configHelper;
/**
* @var GiftMessageConfig
*/
private $configProvider;
/**
* @var Json
*/
private $serializer;
/**
* @var LayoutInterface
*/
private $layout;
/**
* @var CompositeConfig
*/
private $compositeConfig;
/**
* @var RemoteAddress
*/
private $remoteAddress;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var Curl
*/
private $curl;
/**
* CompositeConfigProvider constructor.
* @param \Rokanthemes\OnePageCheckout\Helper\Data $configHelper
* @param GiftMessageConfig $configProvider
* @param Json $serializer
* @param LayoutInterface $layout
* @param CompositeConfig $compositeConfig
* @param RemoteAddress $remoteAddress
* @param Curl $curl
* @param LoggerInterface $logger
*/
public function __construct(
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper,
GiftMessageConfig $configProvider,
Json $serializer,
LayoutInterface $layout,
CompositeConfig $compositeConfig,
RemoteAddress $remoteAddress,
Curl $curl,
LoggerInterface $logger
) {
$this->configHelper = $configHelper;
$this->configProvider = $configProvider;
$this->serializer = $serializer;
$this->layout = $layout;
$this->compositeConfig = $compositeConfig;
$this->remoteAddress = $remoteAddress;
$this->curl = $curl;
$this->logger = $logger;
}
/**
* Get Config
*
* @return array
* @throws \Magento\Framework\Exception\NoSuchEntityException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function getConfig()
{
$output = [];
$helper = $this->configHelper;
if ($helper->getModuleStatus()) {
$config['googleApiAutoComplete'] = false;
$config['googleApiListCountries'] = $this->compositeConfig->getCountryHasRegion();
$config['autoCreateNewAccount']['enable'] = true;
$config['autoCreateNewAccount']['minLength'] = 8;
$config['autoCreateNewAccount']['minCharacterSets'] = 3;
$config['titlePlaceOrder'] = $this->configHelper->getGeneral('title_place_order');
if ($helper->isDisplayField('show_gift_message') && $helper->isMessagesAllowed()) {
$config['giftOptionsConfig'] = $this->getGiftOptionsConfigJson();
}
$output['OnePageCheckout'] = $config;
$output['paypal_in_context'] = false;
$output['rewrite_email_element'] = true;
$output['opcWidget'] = $this->getOpcWidget();
}
return $output;
}
/**
* Get Widget
*
* @return array
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
private function getOpcWidget()
{
$result = [];
if($this->configHelper->isDisplayField('show_widget_box') && $this->configHelper->getGeneral('widget_after_placeorder'))
{
$result['widget_after_placeorder'][] =
$this->layout->createBlock(\Magento\Cms\Block\Block::class)
->setBlockId($this->configHelper->getGeneral('widget_after_placeorder'))->toHtml();
}
return $result;
}
/**
* Retrieve gift message configuration
*
* @return string
*/
private function getGiftOptionsConfigJson()
{
return $this->configProvider->getConfig();
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model;
use Rokanthemes\OnePageCheckout\Api\GuestUpdateItemManagementInterface;
use Magento\Quote\Model\QuoteIdMaskFactory;
use Rokanthemes\OnePageCheckout\Api\UpdateItemManagementInterface;
/**
* Class GuestUpdateItemManagement
*
* @package Rokanthemes\OnePageCheckout\Model
*/
class GuestUpdateItemManagement implements GuestUpdateItemManagementInterface
{
/**
* @var \Magento\Quote\Model\QuoteIdMaskFactory
*/
private $quoteIdMaskFactory;
/**
* @var \Rokanthemes\OnePageCheckout\Api\UpdateItemManagementInterface
*/
private $updateItemManagement;
/**
* @param QuoteIdMaskFactory $quoteIdMaskFactory
* @param UpdateItemManagementInterface $updateItemManagement
*/
public function __construct(
QuoteIdMaskFactory $quoteIdMaskFactory,
UpdateItemManagementInterface $updateItemManagement
) {
$this->quoteIdMaskFactory = $quoteIdMaskFactory;
$this->updateItemManagement = $updateItemManagement;
}
/**
* {@inheritdoc}
*/
public function update($cartId, \Magento\Quote\Api\Data\EstimateAddressInterface $address, $itemId, $qty)
{
$quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id');
$quoteId = (int) $quoteIdMask->getQuoteId();
return $this->updateItemManagement->update($quoteId, $address, $itemId, $qty);
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model\ResourceModel;
class CompositeConfig
{
/**
* @var array
*/
protected $tableNames = [];
/**
* @var ResourceConnection
*/
protected $resourceConnection;
/**
* @var \Magento\Framework\DB\Adapter\AdapterInterface
*/
protected $readAdapter;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* compositeConfig constructor.
* @param \Magento\Framework\App\ResourceConnection $resourceConnection
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
*/
public function __construct(
\Magento\Framework\App\ResourceConnection $resourceConnection,
\Magento\Store\Model\StoreManagerInterface $storeManager
) {
$this->resourceConnection = $resourceConnection;
$this->storeManager = $storeManager;
$this->readAdapter = $this->resourceConnection->getConnection('core_read');
}
/**
* Get Widget
*
* @return array
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function getOpcWidget()
{
$storeId = $this->storeManager->getStore()->getId();
$select = $this->readAdapter->select()
->from(
['t1' => $this->getTableName('widget_instance_page')],
['t1.block_reference']
)->joinLeft(
['t2' => $this->getTableName('widget_instance')],
't1.instance_id = t2.instance_id',
['t2.widget_parameters']
)->where("t1.layout_handle = 'rokanthemes_opc'")
->where("FIND_IN_SET(0, store_ids) OR FIND_IN_SET(" . $storeId . ", store_ids)")
->order('t2.sort_order ASC')
->order('t2.instance_id ASC');
// @codingStandardsIgnoreStart
return $this->readAdapter->fetchAll($select);
// @codingStandardsIgnoreEnd
}
/**
* Get Country
*
* @return array
*/
public function getCountryHasRegion()
{
// @codingStandardsIgnoreStart
$select = $this->readAdapter->select()
->from(
[$this->getTableName('directory_country_region')],
'country_id'
)->group('country_id');
// @codingStandardsIgnoreEnd
$result = $this->readAdapter->fetchCol($select);
return $result;
}
/**
* Get Table Name
*
* @param String $entity
* @return bool|mixed
*/
public function getTableName($entity)
{
if (!isset($this->tableNames[$entity])) {
try {
$this->tableNames[$entity] = $this->resourceConnection->getTableName($entity);
} catch (\Exception $e) {
return false;
}
}
return $this->tableNames[$entity];
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model;
use Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface;
use Magento\Framework\Model\AbstractExtensibleModel;
/**
* Class GuestUpdateItemManagement
*
* @package Rokanthemes\OnePageCheckout\Model
*/
class UpdateItemDetails extends AbstractExtensibleModel implements UpdateItemDetailsInterface
{
/**
* {@inheritdoc}
*/
public function getPaymentMethods()
{
return $this->getData(self::PAYMENT_METHODS);
}
/**
* {@inheritdoc}
*/
public function setPaymentMethods($paymentMethods)
{
return $this->setData(self::PAYMENT_METHODS, $paymentMethods);
}
/**
* {@inheritdoc}
*/
public function getTotals()
{
return $this->getData(self::TOTALS);
}
/**
* {@inheritdoc}
*/
public function setTotals($totals)
{
return $this->setData(self::TOTALS, $totals);
}
/**
* {@inheritdoc}
*/
public function getShippingMethods()
{
return $this->getData(self::SHIPPING_METHODS);
}
/**
* {@inheritdoc}
*/
public function setShippingMethods($shippingMethods)
{
return $this->setData(self::SHIPPING_METHODS, $shippingMethods);
}
/**
* {@inheritdoc}
*/
public function getMessage()
{
return $this->getData(self::MESSAGE);
}
/**
* {@inheritdoc}
*/
public function setMessage($message)
{
return $this->setData(self::MESSAGE, $message);
}
/**
* {@inheritdoc}
*/
public function getStatus()
{
return $this->getData(self::STATUS);
}
/**
* {@inheritdoc}
*/
public function setStatus($status)
{
return $this->setData(self::STATUS, $status);
}
/**
* {@inheritdoc}
*/
public function getHasError()
{
return $this->getData(self::HAS_ERROR);
}
/**
* {@inheritdoc}
*/
public function setHasError($error)
{
return $this->setData(self::HAS_ERROR, $error);
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model;
use Rokanthemes\OnePageCheckout\Api\UpdateItemManagementInterface;
use Magento\Framework\Exception\CouldNotSaveException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Framework\Exception\LocalizedException;
use Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterfaceFactory;
use Magento\Quote\Api\ShippingMethodManagementInterface;
use Magento\Quote\Api\PaymentMethodManagementInterface;
use Magento\Quote\Api\CartTotalRepositoryInterface;
use Magento\Framework\Escaper;
/**
* Class UpdateItemManagement
*
* @package Rokanthemes\OnePageCheckout\Model
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class UpdateItemManagement implements UpdateItemManagementInterface
{
/**
* @var CartRepositoryInterface
*/
private $cartRepository;
/**
* @var UpdateItemDetailsInterfaceFactory
*/
private $updateItemDetails;
/**
* @var ShippingMethodManagementInterface
*/
private $shippingMethodManagement;
/**
* @var PaymentMethodManagementInterface
*/
private $paymentMethodManagement;
/**
* @var CartTotalRepositoryInterface
*/
private $cartTotalRepository;
/**
* @var Escaper
*/
private $escaper;
/**
* UpdateItemManagement constructor.
* @param CartRepositoryInterface $cartRepository
* @param UpdateItemDetailsInterfaceFactory $updateItemDetails
* @param ShippingMethodManagementInterface $shippingMethodManagement
* @param PaymentMethodManagementInterface $paymentMethodManagement
* @param CartTotalRepositoryInterface $cartTotalRepository
* @param Escaper $escaper
*/
public function __construct(
CartRepositoryInterface $cartRepository,
UpdateItemDetailsInterfaceFactory $updateItemDetails,
ShippingMethodManagementInterface $shippingMethodManagement,
PaymentMethodManagementInterface $paymentMethodManagement,
CartTotalRepositoryInterface $cartTotalRepository,
Escaper $escaper
) {
$this->cartRepository = $cartRepository;
$this->updateItemDetails = $updateItemDetails;
$this->shippingMethodManagement = $shippingMethodManagement;
$this->paymentMethodManagement = $paymentMethodManagement;
$this->cartTotalRepository = $cartTotalRepository;
$this->escaper = $escaper;
}
/**
* @param int $cartId
* @param \Magento\Quote\Api\Data\EstimateAddressInterface $address
* @param int $itemId
* @param float $qty
* @return \Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface
* @throws CouldNotSaveException
* @throws NoSuchEntityException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function update(
$cartId,
\Magento\Quote\Api\Data\EstimateAddressInterface $address,
$itemId,
$qty
) {
$status = false;
/** @var \Magento\Quote\Model\Quote $quote */
$quote = $this->cartRepository->getActive($cartId);
if (!$quote) {
throw new NoSuchEntityException(__('This quote does not exist.'));
}
$quoteItem = $quote->getItemById($itemId);
if (!$quoteItem) {
throw new NoSuchEntityException(__('We can\'t find the quote item.'));
}
try {
if (!$qty || $qty <= 0) {
$quote->removeItem($itemId);
$this->cartRepository->save($quote);
$status = true;
$message = __(
'%1 was removed in your shopping cart.',
$this->escaper->escapeHtml($quoteItem->getProduct()->getName())
);
} else {
$quoteItem->setQty($qty);
if ($quoteItem->getHasError()) {
throw new CouldNotSaveException(__($quoteItem->getMessage()));
} else {
$quoteItem->save();
$status = true;
$message = __(
'%1 was updated in your shopping cart.',
$this->escaper->escapeHtml($quoteItem->getProduct()->getName())
);
}
}
$this->cartRepository->save($quote);
} catch (LocalizedException $e) {
$message = $e->getMessage();
} catch (\Exception $e) {
$message = $e->getMessage();
}
return $this->getUpdateCartDetails($quote, $address, $cartId, $message, $status);
}
/**
* @param \Magento\Quote\Model\Quote $quote
* @param \Magento\Quote\Api\Data\EstimateAddressInterface $address
* @param int $quoteId
* @param string $message
* @param boolean $status
* @return \Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface
* @throws NoSuchEntityException
*/
private function getUpdateCartDetails($quote, $address, $quoteId, $message, $status)
{
$cartDetails = $this->updateItemDetails->create();
$paymentMethods = $this->paymentMethodManagement->getList($quoteId);
$totals = $this->cartTotalRepository->get($quoteId);
$shippingAddress = $quote->getShippingAddress();
if ($shippingAddress && $shippingAddress->getCustomerAddressId()) {
$shippingMethods = $this->shippingMethodManagement->estimateByAddressId(
$quoteId,
$shippingAddress->getCustomerAddressId()
);
} else {
$shippingMethods = $this->shippingMethodManagement->estimateByAddress($quoteId, $address);
}
$cartDetails->setShippingMethods($shippingMethods);
$cartDetails->setPaymentMethods($paymentMethods);
$cartDetails->setTotals($totals);
$cartDetails->setMessage($message);
$cartDetails->setStatus($status);
if (!$quote->hasItems() || $quote->getHasError() || !$quote->validateMinimumAmount()) {
$cartDetails->setHasError(true);
}
return $cartDetails;
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Observer\Admin;
use Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\View\LayoutInterface;
class CoreLayoutRenderElementObserver implements ObserverInterface
{
/**
* @var LayoutInterface
*/
private $layout;
/**
* One step checkout config helper
*
* @var Config
*/
private $configHelper;
public function __construct(
LayoutInterface $layout,
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->layout = $layout;
$this->configHelper = $configHelper;
}
/**
* Execute observer
*
* @param EventObserver $observer
* @return void
*/
public function execute(EventObserver $observer)
{
if ($observer->getElementName() == 'order_shipping_view' &&
$this->configHelper->getModuleStatus() ) {
$orderShippingViewBlock = $observer->getLayout()->getBlock($observer->getElementName());
$order = $orderShippingViewBlock->getOrder();
$deliveryBlock = $this->layout->createBlock(\Magento\Framework\View\Element\Template::class);
$date = $order->getCustomerShippingDate();
$deliveryBlock->setCustomerShippingDate($date)
->setCustomerShippingComments($order->getCustomerShippingComments())
->setActiveJs(true)
->setTemplate('Rokanthemes_OnePageCheckout::delivery.phtml');
$html = $observer->getTransport()->getOutput() . $deliveryBlock->toHtml();
$observer->getTransport()->setOutput($html);
}
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
class SalesModelServiceQuoteSubmitBeforeObserver implements ObserverInterface
{
/**
* @var \Rokanthemes\OnePageCheckout\Helper\Data|Config
*/
private $configHelper;
public function __construct(
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->configHelper = $configHelper;
}
/**
* @param Observer $observer
* @return $this|void
*/
public function execute(Observer $observer)
{
$quote = $observer->getEvent()->getQuote();
$order = $observer->getEvent()->getOrder();
if ($this->configHelper->getModuleStatus()) {
$order->setCustomerShippingDate($quote->getCustomerShippingDate());
$order->setCustomerShippingComments($quote->getCustomerShippingComments());
}
return $this;
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Plugin\Checkout\Controller\Index;
use Magento\Framework\Controller\Result\RedirectFactory;
use Magento\Checkout\Controller\Index\Index as CheckoutIndex;
use Magento\Framework\UrlInterface;
class Index
{
/**
* @var RedirectFactory
*/
private $resultRedirectFactory;
/**
* One step checkout helper
*
* @var Config
*/
private $configHelper;
/**
* @var UrlInterface
*/
private $urlBuilder;
/**
* @param RedirectFactory $resultRedirectFactory
* @param Config $configHelper
* @param UrlInterface $urlBuilder
*/
public function __construct(
RedirectFactory $resultRedirectFactory,
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper,
UrlInterface $urlBuilder
) {
$this->resultRedirectFactory = $resultRedirectFactory;
$this->configHelper = $configHelper;
$this->urlBuilder = $urlBuilder;
}
/**
* @param CheckoutIndex $subject
* @param callable $proceed
* @return mixed
* @SuppressWarnings(PHPMD.UnusedLocalVariable)
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function aroundExecute(
CheckoutIndex $subject,
$proceed
) {
if ($this->configHelper->getModuleStatus()) {
$path = 'onepagecheckout';
$router = $this->configHelper->getConfigUrl();
if ($router) {
$router = preg_replace('/\s+/', '', $router);
$router = preg_replace('/\/+/', '', $router);
$path = trim($router, '/');
}
$url = trim($this->urlBuilder->getUrl($path), '/');
return $this->resultRedirectFactory->create()->setUrl($url);
} else {
return $proceed();
}
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Plugin\Checkout\Helper;
class Data
{
/**
* config helper.
*
* @var Config
*/
private $configHelper;
/**
* @param Config $configHelper
*/
public function __construct(
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->configHelper = $configHelper;
}
/**
* @param \Magento\Checkout\Helper\Data $subject
* @param callable $proceed
* @return bool
* @SuppressWarnings(PHPMD.UnusedLocalVariable)
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterIsDisplayBillingOnPaymentMethodAvailable(
\Magento\Checkout\Helper\Data $subject,
$result
) {
if ($this->configHelper->getModuleStatus()) {
$result = false;
}
return $result;
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Plugin\Checkout\Model;
use Rokanthemes\OnePageCheckout\Model\AdditionalData;
use Magento\Quote\Api\CartRepositoryInterface;
class CustomerAdditionalData
{
/**
* @var AdditionalData
*/
private $additionalDataModel;
/**
* @var CartRepositoryInterface
*/
private $cartRepository;
/**
* @var Magento\Checkout\Model\SessionFactory
*/
private $checkoutSession;
/**
* One step checkout helper
*
* @var Config
*/
private $configHelper;
/**
* CustomerAdditionalData constructor.
* @param AdditionalData $additionalDataModel
* @param CartRepositoryInterface $cartRepository
* @param \Magento\Checkout\Model\SessionFactory $checkoutSession
* @param Config $configHelper
*/
public function __construct(
AdditionalData $additionalDataModel,
CartRepositoryInterface $cartRepository,
\Magento\Checkout\Model\SessionFactory $checkoutSession,
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->additionalDataModel = $additionalDataModel;
$this->cartRepository = $cartRepository;
$this->checkoutSession = $checkoutSession;
$this->configHelper = $configHelper;
}
public function aroundSavePaymentInformationAndPlaceOrder(
\Magento\Checkout\Api\PaymentInformationManagementInterface $subject,
\Closure $proceed,
$cartId,
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
if ($paymentMethod->getExtensionAttributes() !== null
&& $this->configHelper->getModuleStatus()
&& $paymentMethod->getExtensionAttributes()->getRokanthemesOpc() !== null
) {
$additionalData = $paymentMethod->getExtensionAttributes()->getRokanthemesOpc();
$orderId = $proceed($cartId, $paymentMethod, $billingAddress);
if (!empty($additionalData) && isset($additionalData['order_comment'])) {
$this->additionalDataModel->saveComment($orderId, $additionalData);
}
if (!empty($additionalData)
&& $this->configHelper->isDisplayField('show_subscribe_newsletter')
) {
$this->additionalDataModel->subscriber($orderId, $additionalData);
}
} else {
return $proceed($cartId, $paymentMethod, $billingAddress);
}
}
public function beforeSavePaymentInformation(
\Magento\Checkout\Api\PaymentInformationManagementInterface $subject,
$cartId,
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
if ($paymentMethod->getExtensionAttributes() !== null
&& $this->configHelper->getModuleStatus()
&& $paymentMethod->getExtensionAttributes()->getRokanthemesOpc() !== null
) {
$additionalData = $paymentMethod->getExtensionAttributes()->getRokanthemesOpc();
$quote = $this->cartRepository->getActive($cartId);
if (!empty($additionalData)) {
$this->additionalDataModel->saveDelivery($quote, $additionalData);
if (in_array($paymentMethod->getMethod(), $this->configHelper->getPaymentOnlineMethods())) {
$this->checkoutSession->create()->setRokanthemesOpcAdditionalData($additionalData);
}
}
}
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Plugin\Checkout\Model;
use Rokanthemes\OnePageCheckout\Model\AdditionalData;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Quote\Model\QuoteIdMaskFactory;
class GuestAdditionalData
{
/**
* @var AdditionalData
*/
private $additionalDataModel;
/**
* @var CartRepositoryInterface
*/
private $cartRepository;
/**
* @var QuoteIdMaskFactory
*/
private $quoteIdMaskFactory;
/**
* @var Magento\Checkout\Model\SessionFactory
*/
private $checkoutSession;
/**
* One step checkout helper
*
* @var Config
*/
private $configHelper;
/**
* GuestAdditionalData constructor.
* @param AdditionalData $additionalDataModel
* @param CartRepositoryInterface $cartRepository
* @param QuoteIdMaskFactory $quoteIdMaskFactory
* @param \Magento\Checkout\Model\SessionFactory $checkoutSession
* @param \Rokanthemes\OnePageCheckout\Helper\Data $configHelper
*/
public function __construct(
AdditionalData $additionalDataModel,
CartRepositoryInterface $cartRepository,
QuoteIdMaskFactory $quoteIdMaskFactory,
\Magento\Checkout\Model\SessionFactory $checkoutSession,
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->additionalDataModel = $additionalDataModel;
$this->cartRepository = $cartRepository;
$this->quoteIdMaskFactory = $quoteIdMaskFactory;
$this->checkoutSession = $checkoutSession;
$this->configHelper = $configHelper;
}
public function aroundSavePaymentInformationAndPlaceOrder(
\Magento\Checkout\Api\GuestPaymentInformationManagementInterface $subject,
\Closure $proceed,
$cartId,
$email,
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
if ($paymentMethod->getExtensionAttributes() !== null
&& $this->configHelper->getModuleStatus()
&& $paymentMethod->getExtensionAttributes()->getRokanthemesOpc() !== null
) {
$additionalData = $paymentMethod->getExtensionAttributes()->getRokanthemesOpc();
$orderId = $proceed($cartId, $email, $paymentMethod, $billingAddress);
if (!empty($additionalData) && isset($additionalData['order_comment'])) {
$this->additionalDataModel->saveComment($orderId, $additionalData);
}
if (!empty($additionalData)
&& $this->configHelper->isDisplayField('show_subscribe_newsletter')
) {
$this->additionalDataModel->subscriber($orderId, $additionalData);
}
} else {
return $proceed($cartId, $email, $paymentMethod, $billingAddress);
}
}
public function beforeSavePaymentInformation(
\Magento\Checkout\Api\GuestPaymentInformationManagementInterface $subject,
$cartId,
$email,
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
if ($paymentMethod->getExtensionAttributes() !== null
&& $this->configHelper->getModuleStatus()
&& $paymentMethod->getExtensionAttributes()->getRokanthemesOpc() !== null
) {
$additionalData = $paymentMethod->getExtensionAttributes()->getRokanthemesOpc();
$quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id');
$quote = $this->cartRepository->getActive($quoteIdMask->getQuoteId());
if (!empty($additionalData)) {
$this->additionalDataModel->saveDelivery($quote, $additionalData);
if (in_array($paymentMethod->getMethod(), $this->configHelper->getPaymentOnlineMethods())) {
$this->checkoutSession->create()->setRokanthemesOpcAdditionalData($additionalData);
}
}
}
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Setup;
use Magento\Framework\DB\Ddl\Table;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Quote\Setup\QuoteSetupFactory;
use Magento\Sales\Setup\SalesSetupFactory;
class InstallData implements InstallDataInterface
{
/**
* @var Magento\Sales\Setup\SalesSetupFactory
*/
protected $_salesSetupFactory;
/**
* @var Magento\Quote\Setup\QuoteSetupFactory
*/
protected $_quoteSetupFactory;
/**
* @param SalesSetupFactory $salesSetupFactory
* @param QuoteSetupFactory $quoteSetupFactory
*/
public function __construct(
SalesSetupFactory $salesSetupFactory,
QuoteSetupFactory $quoteSetupFactory
) {
$this->_salesSetupFactory = $salesSetupFactory;
$this->_quoteSetupFactory = $quoteSetupFactory;
}
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
$installer = $setup;
$installer->startSetup();
// @var \Magento\Sales\Setup\SalesSetup $salesInstaller
$columnExist = $installer->getConnection()->tableColumnExists(
$installer->getTable('sales_order'),
'customer_shipping_date'
);
if (!$columnExist) {
$installer->getConnection()->addColumn(
$installer->getTable('quote'),
'customer_shipping_date',
[
'type' => Table::TYPE_DATETIME,
'nullable' => true,
'comment' => 'Customer Shipping Delivery Date'
]
);
$installer->getConnection()->addColumn(
$installer->getTable('quote'),
'customer_shipping_comments',
[
'type' => Table::TYPE_TEXT,
'nullable' => true,
'comment' => 'Customer Shipping Delivery Comment'
]
);
$installer->getConnection()->addColumn(
$installer->getTable('sales_order'),
'customer_shipping_date',
[
'type' => Table::TYPE_DATETIME,
'nullable' => true,
'comment' => 'Customer Shipping Delivery Date'
]
);
$installer->getConnection()->addColumn(
$installer->getTable('sales_order'),
'customer_shipping_comments',
[
'type' => Table::TYPE_TEXT,
'nullable' => true,
'comment' => 'Customer Shipping Delivery Comment'
]
);
$installer->getConnection()->addColumn(
$installer->getTable('sales_order_grid'),
'customer_shipping_date',
[
'type' => Table::TYPE_DATETIME,
'nullable' => true,
'comment' => 'Customer Shipping Delivery Date'
]
);
}
$setup->endSetup();
}
}
{
"name": "rokanthemes/module-onepagecheckout",
"description": "",
"type": "magento2-module",
"license": "OSL-3.0",
"authors": [
],
"minimum-stability": "dev",
"require": {},
"autoload": {
"files": [
"registration.php"
],
"psr-4": {
"Rokanthemes\\OnePageCheckout\\": ""
}
}
}
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
<acl>
<resources>
<resource id="Magento_Backend::admin">
<resource id="Magento_Backend::stores">
<resource id="Magento_Backend::stores_settings">
<resource id="Magento_Config::config">
<resource id="Rokanthemes_OnePageCheckout::onepagecheckout_config" title="One Page Checkout" />
</resource>
</resource>
</resource>
<resource id="Rokanthemes_RokanBase::rokanbase">
<resource id="Rokanthemes_OnePageCheckout::onepagecheckout" title="One Page Checkout" translate="title" sortOrder="20">
<resource id="Rokanthemes_OnePageCheckout::onepagecheckout_menu_config" title="Configuration" translate="title" sortOrder="10" />
<resource id="Rokanthemes_OnePageCheckout::onepagecheckout_sorting_fields" title="Sorting Fields" translate="title" sortOrder="20" />
</resource>
</resource>
</resource>
</resources>
</acl>
</config>
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="core_layout_render_element">
<observer name="rokanthemes_onepagecheckout_core_layout_render_element" instance="Rokanthemes\OnePageCheckout\Observer\Admin\CoreLayoutRenderElementObserver" />
</event>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
<menu>
<add id="Rokanthemes_OnePageCheckout::onepagecheckout" title="One Page Checkout" module="Rokanthemes_OnePageCheckout" sortOrder="20" parent="Rokanthemes_RokanBase::rokanbase" resource="Rokanthemes_OnePageCheckout::onepagecheckout" />
<add id="Rokanthemes_OnePageCheckout::onepagecheckout_menu_config" title="Configuration" module="Rokanthemes_OnePageCheckout" sortOrder="10" parent="Rokanthemes_OnePageCheckout::onepagecheckout" resource="Rokanthemes_OnePageCheckout::onepagecheckout_menu_config" action="adminhtml/system_config/edit/section/onepagecheckout" />
<add id="Rokanthemes_OnePageCheckout::onepagecheckout_sorting_fields" title="Sort Address Fields" module="Rokanthemes_OnePageCheckout" sortOrder="10" parent="Rokanthemes_OnePageCheckout::onepagecheckout" resource="Rokanthemes_OnePageCheckout::onepagecheckout_sorting_fields" action="onepagecheckout/field/manage" />
</menu>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="onepagecheckout" frontName="onepagecheckout">
<module name="Rokanthemes_OnePageCheckout" before="Magento_Backend"/>
</route>
</router>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
<section id="onepagecheckout" translate="label" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1">
<class>separator-top</class>
<label>One Page Checkout</label>
<tab>sales</tab>
<resource>Rokanthemes_OnePageCheckout::onepagecheckout_config</resource>
<group id="general" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>General Options</label>
<field id="enabled" translate="label" type="select" sortOrder="20" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Enable Express Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
</field>
<field id="seourl" translate="label" type="text" sortOrder="30" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Seo Url</label>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="page_title" translate="label" type="text" sortOrder="40" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Page Title</label>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="short_description" translate="label" type="textarea" sortOrder="45" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Short Description</label>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="show_order_comment" translate="label" type="select" sortOrder="50" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Order Comment on Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<!--field id="title_box_order_comment" translate="label" type="text" sortOrder="55" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Title Box Order Comment</label>
<depends>
<field id="enabled">1</field>
<field id="show_order_comment">1</field>
</depends>
</field-->
<field id="show_subscribe_newsletter" translate="label" type="select" sortOrder="60" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Checkbox Subscribe on Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="title_box_subscribe" translate="label" type="text" sortOrder="65" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Title Box Subscribe Newletter</label>
<depends>
<field id="enabled">1</field>
<field id="show_subscribe_newsletter">1</field>
</depends>
</field>
<field id="default_newletter_checkbox" translate="label" type="select" sortOrder="70" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Default checkbox Subscribe on Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
<field id="show_subscribe_newsletter">1</field>
</depends>
</field>
<field id="show_discount_box" translate="label" type="select" sortOrder="80" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Discount Box on Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="show_gift_message" translate="label" type="select" sortOrder="80" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Gift Message on Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="show_widget_box" translate="label" type="select" sortOrder="90" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Widget After Place Order</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="widget_after_placeorder" translate="label" type="select" sortOrder="100" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Cms Show after Place Order</label>
<source_model>Magento\Cms\Model\Config\Source\Block</source_model>
<depends>
<field id="enabled">1</field>
<field id="show_widget_box">1</field>
</depends>
</field>
<field id="show_shipping_delivery_date" translate="label" type="select" sortOrder="100" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Shipping Delivery Date</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="title_box_shipping_delivery_date" translate="label" type="text" sortOrder="110" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Title Box Shipping Delivery Date</label>
<depends>
<field id="enabled">1</field>
<field id="show_shipping_delivery_date">1</field>
</depends>
</field>
<field id="show_shipping_delivery_comment" translate="label" type="select" sortOrder="120" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Shipping Delivery Comment</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="title_box_shipping_delivery_comment" translate="label" type="text" sortOrder="130" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Title Box Shipping Delivery Comment</label>
<depends>
<field id="enabled">1</field>
<field id="show_shipping_delivery_comment">1</field>
</depends>
</field>
<field id="show_full_layout" translate="label" type="select" sortOrder="140" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show full Header and Footer</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="title_place_order" translate="label" type="text" sortOrder="150" showInDefault="1" showInWebsite="1"
showInStore="1" >
<label>Title Button Place Order</label>
<depends>
<field id="enabled">1</field>
</depends>
</field>
</group>
</section>
</system>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
<default>
<onepagecheckout>
<general>
<enabled>1</enabled>
<seourl>expresscheckout.html</seourl>
<page_title>Express Checkout</page_title>
<show_shipping_delivery_date>1</show_shipping_delivery_date>
<show_shipping_delivery_comment>1</show_shipping_delivery_comment>
<show_order_comment>1</show_order_comment>
<show_subscribe_newsletter>1</show_subscribe_newsletter>
<show_gift_message>1</show_gift_message>
<default_newletter_checkbox>0</default_newletter_checkbox>
<show_discount_box>1</show_discount_box>
<title_box_shipping_delivery_date>Shipping Delivery Date</title_box_shipping_delivery_date>
<title_box_shipping_delivery_comment>Shipping Delivery Comment</title_box_shipping_delivery_comment>
<title_box_order_comment>Order Comment</title_box_order_comment>
<title_box_subscribe>Check To Subscribe Order Newsletter</title_box_subscribe>
<title_place_order>Place Order</title_place_order>
</general>
</onepagecheckout>
</default>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Rokanthemes\OnePageCheckout\Api\UpdateItemManagementInterface"
type="Rokanthemes\OnePageCheckout\Model\UpdateItemManagement"/>
<preference for="Rokanthemes\OnePageCheckout\Api\GuestUpdateItemManagementInterface"
type="Rokanthemes\OnePageCheckout\Model\GuestUpdateItemManagement"/>
<preference for="Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface"
type="Rokanthemes\OnePageCheckout\Model\UpdateItemDetails"/>
<type name="Magento\Checkout\Api\PaymentInformationManagementInterface">
<plugin name="rokanthemes_opc_additional_data" type="Rokanthemes\OnePageCheckout\Plugin\Checkout\Model\CustomerAdditionalData"/>
</type>
<type name="Magento\Checkout\Api\GuestPaymentInformationManagementInterface">
<plugin name="rokanthemes_opc_guest_additional_data"
type="Rokanthemes\OnePageCheckout\Plugin\Checkout\Model\GuestAdditionalData"/>
</type>
<virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid" type="Magento\Sales\Model\ResourceModel\Grid">
<arguments>
<argument name="columns" xsi:type="array">
<item name="customer_shipping_date" xsi:type="string">sales_order.customer_shipping_date</item>
</argument>
</arguments>
</virtualType>
</config>
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="sales_model_service_quote_submit_before">
<observer name="rokanthemes_onepagecheckout_sales_model_service_quote_submit_before" instance="Rokanthemes\OnePageCheckout\Observer\SalesModelServiceQuoteSubmitBeforeObserver" shared="false" />
</event>
<event name="sales_order_place_after">
<observer name="rokanthemes_onepagecheckout_sales_order_place_after" instance="Rokanthemes\OnePageCheckout\Observer\SalesOrderPlaceAfterObserver" />
</event>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Quote\Api\Data\PaymentInterface">
<attribute code="rokanthemes_opc" type="string[]" />
</extension_attributes>
<extension_attributes for="Magento\Sales\Api\Data\OrderInterface">
<attribute code="customer_shipping_date" type="string" />
<attribute code="customer_shipping_comments" type="string" />
</extension_attributes>
<extension_attributes for="Magento\Sales\Api\Data\InvoiceInterface">
<attribute code="customer_shipping_date" type="string" />
<attribute code="customer_shipping_comments" type="string" />
</extension_attributes>
<extension_attributes for="Magento\Sales\Api\Data\ShipmentInterface">
<attribute code="customer_shipping_date" type="string" />
<attribute code="customer_shipping_comments" type="string" />
</extension_attributes>
<extension_attributes for="Magento\Sales\Api\Data\CreditmemoInterface">
<attribute code="customer_shipping_date" type="string" />
<attribute code="customer_shipping_comments" type="string" />
</extension_attributes>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="\Magento\Checkout\Block\Checkout\LayoutProcessor">
<plugin name="onepagecheckout_checkout_layout_processor" type="Rokanthemes\OnePageCheckout\Plugin\Checkout\Block\Checkout\LayoutProcessor" />
</type>
<type name="\Magento\Checkout\Helper\Data">
<plugin name="onepagecheckout_checkout_helper_data" type="Rokanthemes\OnePageCheckout\Plugin\Checkout\Helper\Data" />
</type>
<type name="Magento\Checkout\Model\CompositeConfigProvider">
<arguments>
<argument name="configProviders" xsi:type="array">
<item name="onepagecheckout_checkout_composite_config" xsi:type="object">Rokanthemes\OnePageCheckout\Model\CompositeConfigProvider</item>
</argument>
</arguments>
</type>
<type name="Magento\Framework\App\RouterList">
<arguments>
<argument name="routerList" xsi:type="array">
<item name="onepagecheckout" xsi:type="array">
<item name="class" xsi:type="string">Rokanthemes\OnePageCheckout\Controller\Router</item>
<item name="disable" xsi:type="boolean">false</item>
<item name="sortOrder" xsi:type="string">90</item>
</item>
</argument>
</arguments>
</type>
<type name="Magento\Checkout\Controller\Index\Index">
<plugin name="onepagecheckout_checkout_redirect_link"
type="Rokanthemes\OnePageCheckout\Plugin\Checkout\Controller\Index\Index" />
</type>
</config>
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="standard">
<route frontName="onepagecheckout" id="onepagecheckout">
<module name="Rokanthemes_OnePageCheckout"/>
</route>
</router>
</config>
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Rokanthemes_OnePageCheckout" setup_version="1.0.0" />
</config>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
<route url="/V1/rokanthemes-opc/carts/mine/update-item-qty" method="POST">
<service class="Rokanthemes\OnePageCheckout\Api\UpdateItemManagementInterface" method="update"/>
<resources>
<resource ref="self"/>
</resources>
<data>
<parameter name="cartId" force="true">%cart_id%</parameter>
</data>
</route>
<route url="/V1/rokanthemes-opc/guest-carts/:cartId/update-item-qty" method="POST">
<service class="Rokanthemes\OnePageCheckout\Api\GuestUpdateItemManagementInterface" method="update"/>
<resources>
<resource ref="anonymous"/>
</resources>
</route>
</routes>
<?php
use Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Rokanthemes_OnePageCheckout', __DIR__);
<?xml version="1.0" encoding="UTF-8"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="admin-1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<head>
<css src="Rokanthemes_OnePageCheckout::css/style.css"/>
<css src="Rokanthemes_OnePageCheckout::css/jquery-ui.min.css"/>
</head>
<body>
<referenceContainer name="content">
<block class="Rokanthemes\OnePageCheckout\Block\Adminhtml\Field\Tabs" name="admin.field.tabs" template="Rokanthemes_OnePageCheckout::field/tabs.phtml">
<block class="Rokanthemes\OnePageCheckout\Block\Adminhtml\Field\Address" name="admin.field.address"/>
</block>
</referenceContainer>
</body>
</page>
<div class="customer_shipping_delivery" style="display:none;">
<?php
$date = $block->getCustomerShippingDate();
if ($date && $date != '0000-00-00 00:00:00') :
?>
<div id="shipping-delivery-date">
<br />
<strong><?= $block->escapeHtml(__('Customer Delivery Date:')) ?></strong>
<span><?= $block->formatDate($date, \IntlDateFormatter::MEDIUM); ?></span>
</div>
<?php endif; ?>
<?php if ($comment = $block->getCustomerShippingComments()) : ?>
<div id="shipping-delivery-comment">
<br />
<strong><?= $block->escapeHtml(__('Customer Delivery Comment:')) ?></strong>
<span><?php echo $comment; ?></span>
</div>
<?php endif; ?>
</div>
<?php if ($block->getActiveJs()) : ?>
<script type="text/x-magento-init">
{
"body": {
"Rokanthemes_OnePageCheckout/js/shippingdelivery": {}
}
}
</script>
<?php endif; ?>
<?php
/** @var \Rokanthemes\OnePageCheckout\Block\Adminhtml\Field\AbstractField $block */
?>
<div id="<?= $block->escapeQuote($block->getBlockId()) ?>" class="admin-field-container">
<?php if ($block->isVisible() && $block->hasFields()) : ?>
<div class="containment row">
<div class="field-wrapper available-wrapper col-m-4">
<div><?= __('Area Removed'); ?></div>
<ul class="sortable-list ui-sortable">
<?php foreach ($block->getAvailableFields() as $field) : ?>
<li class="sortable-item" id="<?= $block->escapeQuote($field->getId()) ?>"
data-code="<?= $block->escapeQuote($field->getAttributeCode()) ?>">
<div class="attribute-label">
<span><?= $block->escapeHtml($field->getFrontendLabel()) ?></span>
<div class="attribute-required">
<input type="checkbox" title="<?= $block->escapeQuote(__('Is Required?')) ?>"
<?php if ($field->getIsRequired()) {
echo ' checked';
} ?>>
</div>
</div>
</li>
<?php endforeach; ?>
</ul>
</div>
<div class="field-wrapper sorted-wrapper col-m-8">
<div><?= __('Area Sorting'); ?></div>
<ul class="sortable-list ui-sortable">
<?php foreach ($block->getSortedFields() as $field) : ?>
<li class="sortable-item <?= $block->escapeQuote($field->getColStyle()) ?>"
id="<?= $block->escapeQuote($field->getId()) ?>"
data-code="<?= $block->escapeQuote($field->getAttributeCode()) ?>">
<div class="attribute-label">
<span><?= $block->escapeHtml($field->getFrontendLabel()) ?></span>
<?php if ($field->getId()) : ?>
<div class="attribute-required">
<input type="checkbox" title="<?= $block->escapeQuote(__('Is Required?')) ?>"
<?php if ($field->getIsRequiredMp()) {
echo ' checked';
} ?>>
</div>
<?php endif; ?>
</div>
</li>
<?php endforeach; ?>
</ul>
</div>
</div>
<script type="text/x-magento-init">
{
"*": {
"Rokanthemes_OnePageCheckout/js/field-position": {
"blockId": "<?= /** @noEscape */ $block->getBlockId() ?>"
}
}
}
</script>
<?php else : ?>
<div class="messages">
<div class="message message-info info">
<span><?= /** @noEscape */ $block->getNoticeMessage() ?></span>
</div>
</div>
<?php endif; ?>
</div>
<div id="position-save-messages" class="messages"></div>
<div id="admin-field-tabs" class="row">
<a class="button action-default col-m-12" href="#address-information">
<i class="fa fa-home"></i>
<span><?= $block->escapeHtml(__('Address Information')) ?></span>
</a>
</div>
<div id="field-position-sortable">
<?= $block->getChildHtml() ?>
</div>
<script type="text/x-magento-init">
{
"*": {
"Rokanthemes_OnePageCheckout/js/field-tabs": {
"url": "<?= $block->escapeUrl($block->getAjaxUrl()) ?>"
}
}
}
</script>
#field-position-sortable .suggest-position {
background: #cccccc;
height: 4rem;
float: left;
}
/* ------------------------------------------------------------------- */
/* General */
.field-wrapper.sorted-wrapper {
background-color: #fafafa;
border-left: none;
}
.field-wrapper.available-wrapper {
background-color: #e3e3e3;
border-right: none;
}
.field-wrapper {
display: table-cell;
vertical-align: top;
float: unset;
border: 1px solid #adadad;
border-top: none;
}
.field-wrapper ul {
width: 100%;
min-height: 450px;
padding-top: 5px;
list-style-type: none;
}
.field-wrapper ul li {
width: 48%;
margin: 1%;
}
.field-wrapper ul li.wide {
width: 98%;
}
.field-wrapper ul li.medium {
width: 72%;
}
.field-wrapper ul li.short {
width: 23%;
}
.field-wrapper.available-wrapper ul li {
width: 96%;
margin: 2%;
}
.field-wrapper ul li .attribute-label {
border: 1px solid #cccccc;
text-align: center;
padding: 10px 10px;
cursor: move;
background: #ffffff;
height: 20px !important;
box-sizing: content-box;
}
.field-wrapper ul li.ui-state-disabled {
opacity: 1;
}
.field-wrapper ul li.ui-state-disabled .attribute-label {
background-color: #514943;
border-color: #514943;
color: #ffffff;
}
.available-wrapper .ui-resizable-handle {
display: none !important;
}
#field-position-sortable .ui-resizable-s {
display: none !important;
}
/* Containment area */
.ui-resizable-border {
border: 1px dotted #cccccc;
}
#admin-field-tabs a {
padding: 5px;
font-size: 2rem;
line-height: 1.5;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
#admin-field-tabs a._active {
background-color: #1979c3;
border-color: #1979c3;
color: #ffffff;
}
#field-position-sortable .attribute-required {
position: absolute;
top: 3px;
right: 3px;
}
.available-wrapper .attribute-required, .admin-field-container {
display: none;
}
.admin-field-container .containment.row {
display: flex;
}
.f-left {
float: left;
}
#field-position-sortable > .admin-field-container > .messages {
margin-top: 3rem;
}
#field-position-sortable > .admin-field-container > .messages > .message:last-child {
margin: 0;
}
define(['jquery', 'jquery/ui'], function ($) {
'use strict';
$.widget('admin.field_position', {
_create: function () {
this.initGrid();
},
initGrid: function () {
var selector = '#' + this.options.blockId + ' ',
list = $(selector + '.sortable-list'),
field, elemWidth;
var options = {
tolerance: 'pointer',
connectWith: '.sortable-list',
dropOnEmpty: true,
containment: 'body',
cancel: '.ui-state-disabled',
placeholder: 'suggest-position',
zIndex: 10,
scroll: false,
start: function (e, hash) {
if (hash.item.hasClass('wide')) {
hash.placeholder.addClass('wide');
}
if (hash.item.hasClass('medium')) {
hash.placeholder.addClass('medium');
}
if (hash.item.hasClass('short')) {
hash.placeholder.addClass('short');
}
}
};
if (this.options.blockId === 'admin-order-summary') {
options.items = 'li:not(.ui-state-disabled)';
}
list.sortable(options);
$(selector + '.sortable-list li').disableSelection();
$(selector + '.sortable-list li').addClass('f-left');
$(selector + '.containment ul li .attribute-label').resizable({
maxHeight: 40,
minHeight: 40,
zIndex: 10,
cancel: '.ui-state-disabled',
helper: 'ui-resizable-border',
stop: function (e, ui) {
field = ui.element.parent();
elemWidth = ui.element.width() / 2;
field.removeClass('wide');
field.removeClass('medium');
field.removeClass('short');
if (elemWidth < field.width() * 0.3) {
field.addClass('short');
} else if (elemWidth > field.width() * 0.6 && elemWidth < field.width() * 0.8) {
field.addClass('medium');
} else if (elemWidth > field.width() * 0.8) {
field.addClass('wide');
}
ui.element.css({width: ''});
}
});
}
});
return $.admin.field_position;
});
define(['jquery'], function ($) {
'use strict';
$.widget('admin.field_tabs', {
_create: function () {
this.initTabEvent();
this.initSaveEvent();
},
initTabEvent: function () {
var elem = $('#admin-field-tabs .action-default');
$('.admin-field-container').show();
elem.on('click', function () {
elem.removeClass('_active');
$(this).addClass('_active');
return false;
});
},
initSaveEvent: function () {
var self = this;
$('.admin-save-position').on('click', function () {
self.savePosition(self.options.url);
});
},
savePosition: function (url) {
var self = this,
fields = [],
oaFields = [],
field = {},
parent = null;
$('#position-save-messages').html('');
$('.sorted-wrapper .sortable-item').each(function (index, el) {
parent = $(el).parents('.admin-field-container');
field = {
code: $(el).attr('data-code'),
colspan: self.getColspan($(el)),
required: !!$(el).find('.attribute-required input').is(':checked')
};
if ($(el).parents('#admin-address-information').length) {
fields.push(field);
}
});
$.ajax({
method: 'post',
showLoader: true,
url: url,
data: {
fields: JSON.stringify(fields)
},
success: function (response) {
$('#position-save-messages').html(
'<div class="message message-' + response.type + ' ' + response.type + ' ">' +
'<span>' + response.message + '</span>' +
'</div>'
);
}
});
},
getColspan: function (elem) {
if (elem.hasClass('wide')) {
return 12;
} else if (elem.hasClass('medium')) {
return 9;
} else if (elem.hasClass('short')) {
return 3;
}
return 6;
}
});
return $.admin.field_tabs;
});
define([
'jquery'
], function ($) {
'use strict';
if ($('#shipping-delivery-date').length) {
var date = $('#shipping-delivery-date').detach();
$('.order-shipping-method').append(date);
}
if ($('#shipping-delivery-comment').length) {
var comment = $('#shipping-delivery-comment').detach();
$('.order-shipping-method').append(comment);
}
});
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="sidebar.additional" remove="true"/>
<referenceBlock name="top.search" remove="true"/>
<referenceBlock name="minicart" remove="true"/>
<referenceContainer name="footer-container" remove="true"/>
<referenceBlock name="header.panel.wrapper" remove="true"/>
</body>
</page>
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<attribute name="class" value="rokanthemes-onepagecheckout-full"/>
<attribute name="class" value="checkout-index-index"/>
</body>
</page>
var config = {
map: {
'*': {
'Magento_Checkout/template/billing-address/form.html':
'Rokanthemes_OnePageCheckout/template/billing-address/form.html',
'Magento_Checkout/js/model/shipping-rate-service':
'Rokanthemes_OnePageCheckout/js/model/shipping-rate-service',
'Magento_Checkout/js/action/get-payment-information':
'Rokanthemes_OnePageCheckout/js/action/get-payment-information'
}
},
config: {
mixins: {
'Magento_Checkout/js/action/place-order': {
'Rokanthemes_OnePageCheckout/js/model/place-order-mixin': true,
'Magento_CheckoutAgreements/js/model/place-order-mixin': false
},
'Magento_Checkout/js/model/step-navigator': {
'Rokanthemes_OnePageCheckout/js/model/step-navigator-mixin': true
},
'Magento_Checkout/js/action/set-payment-information': {
'Magento_CheckoutAgreements/js/model/set-payment-information-mixin': false,
'Rokanthemes_OnePageCheckout/js/model/set-payment-information-mixin': true
},
'Magento_Checkout/js/model/shipping-rates-validation-rules': {
'Rokanthemes_OnePageCheckout/js/model/shipping-rates-validation-rules-mixin': true
},
'Magento_Paypal/js/in-context/express-checkout-wrapper': {
'Rokanthemes_OnePageCheckout/js/paypal/in-context/express-checkout-wrapper-mixin': true
},
'Magento_Paypal/js/view/payment/method-renderer/in-context/checkout-express': {
'Rokanthemes_OnePageCheckout/js/paypal/view/payment/method-renderer/in-context/checkout-express-mixin': true
},
'Amazon_Payment/js/view/payment/list': {
'Rokanthemes_OnePageCheckout/js/amazon-pay/view/payment-list': true
},
'Amazon_Payment/js/view/checkout-revert': {
'Rokanthemes_OnePageCheckout/js/amazon-pay/view/checkout-revert-rewrite': true
}
}
}
};
<?php
/**
* @var $block \Rokanthemes\OnePageCheckout\Block\Config
*/
?>
<div class="short-description">
<?= $block->getShortDescription() ?>
</div>
define([
'jquery',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/url-builder',
'mage/storage',
'Magento_Checkout/js/model/error-processor',
'Magento_Customer/js/model/customer',
'Magento_Checkout/js/model/payment/method-converter',
'Magento_Checkout/js/model/payment-service'
], function ($, quote, urlBuilder, storage, errorProcessor, customer, methodConverter, paymentService) {
'use strict';
return function (deferred, messageContainer) {
var serviceUrl;
deferred = deferred || $.Deferred();
/**
* Checkout for guest and registered customer.
*/
if (!customer.isLoggedIn()) {
serviceUrl = urlBuilder.createUrl('/guest-carts/:cartId/payment-information', {
cartId: quote.getQuoteId()
});
} else {
serviceUrl = urlBuilder.createUrl('/carts/mine/payment-information', {});
}
if (!window.isPlaceOrderDispatched) {
window.isPlaceOrderDispatched = false;
return storage.get(
serviceUrl, false
).done(function (response) {
quote.setTotals(response.totals);
paymentService.setPaymentMethods(methodConverter(response['payment_methods']));
deferred.resolve();
}).fail(function (response) {
errorProcessor.process(response, messageContainer);
deferred.reject();
});
}
};
});
define([
'Rokanthemes_OnePageCheckout/js/model/url-builder',
'mage/storage',
'Magento_Ui/js/model/messageList',
'Magento_Checkout/js/model/error-processor',
'mage/url',
'Magento_Checkout/js/model/quote',
'underscore'
], function (urlBuilder, storage, messageList, errorProcessor, url, quote, _) {
'use strict';
return function (giftMessage, remove) {
var serviceUrl;
url.setBaseUrl(giftMessage.getConfigValue('baseUrl'));
if (giftMessage.getConfigValue('isCustomerLoggedIn')) {
serviceUrl = urlBuilder.createUrl('/carts/mine/gift-message', {});
if (giftMessage.itemId != 'orderLevel') { //eslint-disable-line eqeqeq
serviceUrl = urlBuilder.createUrl('/carts/mine/gift-message/:itemId', {
itemId: giftMessage.itemId
});
}
} else {
serviceUrl = urlBuilder.createUrl('/guest-carts/:cartId/gift-message', {
cartId: quote.getQuoteId()
});
if (giftMessage.itemId != 'orderLevel') { //eslint-disable-line eqeqeq
serviceUrl = urlBuilder.createUrl(
'/guest-carts/:cartId/gift-message/:itemId',
{
cartId: quote.getQuoteId(), itemId: giftMessage.itemId
}
);
}
}
messageList.clear();
storage.post(
serviceUrl,
JSON.stringify({
'gift_message': giftMessage.getSubmitParams(remove)
})
).done(function () {
giftMessage.reset();
_.each(giftMessage.getAfterSubmitCallbacks(), function (callback) {
if (_.isFunction(callback)) {
callback();
}
});
}).fail(function (response) {
errorProcessor.process(response);
});
};
});
define(
[
'jquery',
'Magento_Checkout/js/model/quote',
'Rokanthemes_OnePageCheckout/js/model/resource-url-manager',
'mage/storage',
'Magento_Checkout/js/model/error-processor',
'Magento_Customer/js/model/customer',
'Magento_Checkout/js/model/payment/method-converter',
'Magento_Checkout/js/model/payment-service',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/model/full-screen-loader',
'uiRegistry'
],
function ($,
quote,
resourceUrlManager,
storage,
errorProcessor,
customer,
methodConverter,
paymentService,
shippingService,
opcLoader,
registry) {
'use strict';
return function () {
opcLoader.startLoader();
return storage.post(
resourceUrlManager.getUrlForUpdatePaymentTotalInformation(quote)
).done(
function (response) {
var options, paths;
if (response.redirect_url) {
window.location.href = response.redirect_url;
return;
}
// remove downloadable options on cart item reload
$('#downloadable-links-list').remove();
$('#links-advice-container').remove();
if (response.image_data) {
registry.get('checkout.sidebar.summary.cart_items.details.thumbnail').imageData
= JSON.parse(response.image_data);
}
if (response.options) {
options = JSON.parse(response.options);
response.totals.items.forEach(function (item) {
item.rkopc = options[item.item_id];
});
}
if (response.request_path) {
paths = JSON.parse(response.request_path);
response.totals.items.forEach(function (item) {
item.request_path = paths[item.item_id];
});
}
quote.setTotals(response.totals);
paymentService.setPaymentMethods(methodConverter(response.payment_methods));
}
).fail(
function (response) {
errorProcessor.process(response);
}
).always(
function () {
opcLoader.stopLoader();
}
);
};
}
);
define([
'Magento_Checkout/js/model/quote',
'Rokanthemes_OnePageCheckout/js/model/shipping-save-processor'
], function (quote, shippingSaveProcessor) {
'use strict';
return function () {
return shippingSaveProcessor.saveShippingInformation(quote.shippingAddress().getType());
};
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment