Commit 94a98b12 by lmf

增加onepagecheckout插件

parent d6818c77
...@@ -137,13 +137,13 @@ class Add extends \Magento\Checkout\Controller\Cart implements HttpPostActionInt ...@@ -137,13 +137,13 @@ class Add extends \Magento\Checkout\Controller\Cart implements HttpPostActionInt
); );
if (!$this->_checkoutSession->getNoCartRedirect(true)) { if (!$this->_checkoutSession->getNoCartRedirect(true)) {
if ($this->shouldRedirectToCart()) { // if ($this->shouldRedirectToCart()) {
$message = __( // $message = __(
'You added %1 to your shopping cart.', // 'You added %1 to your shopping cart.',
$product->getName() // $product->getName()
); // );
$this->messageManager->addSuccessMessage($message); // $this->messageManager->addSuccessMessage($message);
} // }
if ($this->cart->getQuote()->getHasError()) { if ($this->cart->getQuote()->getHasError()) {
$errors = $this->cart->getQuote()->getErrors(); $errors = $this->cart->getQuote()->getErrors();
foreach ($errors as $error) { foreach ($errors as $error) {
......
...@@ -65,7 +65,7 @@ Message,Message ...@@ -65,7 +65,7 @@ Message,Message
"Print receipt","Print receipt" "Print receipt","Print receipt"
"Apply Discount Code","Apply Discount Code" "Apply Discount Code","Apply Discount Code"
"Enter discount code","Enter discount code" "Enter discount code","Enter discount code"
"Apply Discount","Apply Discount" "Apply Discount","Apply Code"
"Cancel Coupon","Cancel Coupon" "Cancel Coupon","Cancel Coupon"
"Shopping Cart Items","Shopping Cart Items" "Shopping Cart Items","Shopping Cart Items"
Item,Item Item,Item
......
<?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
}
}
}
};
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': 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());
};
});
define([
'jquery',
'underscore',
'Rokanthemes_OnePageCheckout/js/model/url-builder',
'mage/storage',
'Magento_Checkout/js/model/error-processor',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/model/totals',
'Rokanthemes_OnePageCheckout/js/model/payment-service',
'mage/url',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/payment/method-converter',
'Magento_Checkout/js/model/payment-service',
'Rokanthemes_OnePageCheckout/js/model/update-item-service',
'Magento_Ui/js/model/messageList',
'Magento_Checkout/js/action/get-totals'
], function (
$,
_,
urlBuilder,
storage,
errorProcessor,
shippingService,
totals,
paymentService,
url,
quote,
methodConverter,
paymentServiceDefault,
updateItemService,
globalMessageList,
getTotalsAction
) {
'use strict';
return function (item) {
var serviceUrl = urlBuilder.getUpdateQtyUrl(),
address = quote.shippingAddress();
shippingService.isLoading(true);
totals.isLoading(true);
paymentService.isLoading(true);
return storage.post(
serviceUrl,
JSON.stringify({
address: {
'region_id': address.regionId,
'region': address.region,
'country_id': address.countryId,
'postcode': address.postcode
},
itemId: parseInt(item.item_id),
qty: parseFloat(item.qty)
})
).done(function (response) {
if (response.has_error && response.status) {
globalMessageList.addSuccessMessage(response);
window.location.replace(url.build('checkout/cart/'));
} else {
if (response.status) {
globalMessageList.addSuccessMessage(response);
updateItemService.hasUpdateResult(true);
shippingService.setShippingRates(response.shipping_methods);
paymentServiceDefault.setPaymentMethods(methodConverter(response.payment_methods));
updateItemService.hasUpdateResult(false);
response.totals.coupon_code ? paymentService.isAppliedCoupon(true) : paymentService.isAppliedCoupon(false);
var deferred = $.Deferred();
getTotalsAction([], deferred);
$('.items-in-cart').find('[data-bind="text: getCartSummaryItemsCount()"]')
.text(response['totals']['items_qty']);
} else {
globalMessageList.addErrorMessage(response);
}
}
}).fail(function (response) {
errorProcessor.process(response);
}).always(function () {
shippingService.isLoading(false);
totals.isLoading(false);
paymentService.isLoading(false);
});
};
});
define([
'Rokanthemes_OnePageCheckout/js/model/shipping-save-processor/validate'
], function (validateProcessor) {
'use strict';
return function () {
return validateProcessor.saveShippingInformation();
};
});
define([
'jquery',
'underscore',
'ko',
'uiComponent',
'Amazon_Payment/js/model/storage',
'mage/storage',
'Magento_Checkout/js/model/error-processor',
'Magento_Checkout/js/model/url-builder',
'Magento_Checkout/js/model/full-screen-loader',
], function (
$,
_,
ko,
Component,
amazonStorage,
storage,
errorProcessor,
urlBuilder,
fullScreenLoader,
) {
'use strict';
var mixin = {
/**
* Revert checkout
*/
revertCheckout: function () {
var serviceUrl = urlBuilder.createUrl('/amazon/order-ref', {});
fullScreenLoader.startLoader();
storage.delete(
serviceUrl
).done(
function () {
amazonStorage.amazonlogOut();
fullScreenLoader.stopLoader();
// Amazon pay hot-fix: reload page after Customer click "Return to standard checkout"
// to reload other payment method
location.reload();
}
).fail(
function (response) {
fullScreenLoader.stopLoader();
errorProcessor.process(response);
}
);
}
};
return function (target) {
return target.extend(mixin);
};
});
define([
'jquery',
'underscore'
], function (
$,
_
) {
'use strict';
var mixin = {
/**
* @param {Object} group
* @returns {Boolean}
*/
showFormShared: function (group) {
var isShow = false,
self = this;
if (self.paymentGroupsList().length) {
if (_.first(self.paymentGroupsList()).alias == group().alias) {
isShow = true;
}
}
return isShow;
},
};
return function (target) {
return target.extend(mixin);
};
});
(function ($) {
$.fn.extend({
sliderAccess: function (options) {
options = options || {};
options.touchonly = options.touchonly !== undefined ? options.touchonly : true;
if (options.touchonly === true && !("ontouchend" in document))
return $(this);
return $(this).each(function (i, obj) {
var $t = $(this),
o = $.extend({}, {
where: 'after',
step: $t.slider('option', 'step'),
upIcon: 'ui-icon-plus',
downIcon: 'ui-icon-minus',
text: false,
upText: '+',
downText: '-',
buttonset: true,
buttonsetTag: 'span',
speed: 150
}, options),
$buttons = $('<' + o.buttonsetTag + ' class="ui-slider-access">' +
'<button data-icon="' + o.downIcon + '" data-step="-' + o.step + '">' + o.downText + '</button>' +
'<button data-icon="' + o.upIcon + '" data-step="' + o.step + '">' + o.upText + '</button>' +
'</' + o.buttonsetTag + '>');
$buttons.children('button').each(function (j, jobj) {
var $jt = $(this),
timeout = null,
increment = function ($jt, $t, e) {
var step = $jt.data('step'),
curr = $t.slider('value'),
newval = curr += step * 1,
minval = $t.slider('option', 'min'),
maxval = $t.slider('option', 'max');
e.preventDefault();
if (newval < minval || newval > maxval)
return;
$t.slider('value', newval);
$t.slider("option", "slide").call($t, null, {value: newval});
};
$jt.button({
text: o.text,
icons: {primary: $jt.data('icon')}
})
.bind('touchstart mousedown', function (e) {
increment($jt, $t, e);
timeout = setInterval(function () {
increment($jt, $t, e);
}, o.speed);
});
$(document).bind('touchend mouseup', function (e) {
clearInterval(timeout);
return e.type == 'touchend';
});
});
// before or after
$t[o.where]($buttons);
if (o.buttonset) {
$buttons.removeClass('ui-corner-right').removeClass('ui-corner-left').buttonset();
$buttons.eq(0).addClass('ui-corner-left');
$buttons.eq(1).addClass('ui-corner-right');
}
// adjust the width so we don't break the original layout
var bOuterWidth = $buttons.css({
marginLeft: (o.where == 'after' ? 10 : 0),
marginRight: (o.where == 'before' ? 10 : 0)
}).outerWidth(true) + 5;
var tOuterWidth = $t.outerWidth(true);
// support "always" hide the slider
if (o.hideSlider == 'always' || (o.hideSlider == 'touch' && ("ontouchend" in document))) {
$t.css('display', 'none');
} else {
$t.css('display', 'inline-block').width(tOuterWidth - bOuterWidth);
}
});
}
});
})(jQuery);
define([
'jquery',
'uiRegistry',
'underscore'
], function ($, registry, _) {
'use strict';
return function (paymentData) {
var additionalData = {};
var shippingAddressComponent = registry.get('checkout.steps.shipping-step.shippingAddress');
if (!_.isEmpty(shippingAddressComponent)) {
var deliveryDate = shippingAddressComponent.getChild('before-shipping-method-form').getChild('rokanthemes_opc_shipping_delivery_date');
var deliveryComment = shippingAddressComponent.getChild('before-shipping-method-form').getChild('rokanthemes_opc_shipping_delivery_comment');
}
var orderComment = registry.get('checkout.sidebar.rokanthemes_opc_order_comment');
var subscribe = registry.get('checkout.sidebar.subscribe');
if (!_.isUndefined(deliveryDate)) {
additionalData['customer_shipping_date'] = deliveryDate.value();
}
if (!_.isUndefined(deliveryComment)) {
additionalData['customer_shipping_comments'] = deliveryComment.value();
}
if (!_.isUndefined(orderComment)) {
additionalData['order_comment'] = orderComment.value();
}
if (!_.isUndefined(subscribe)) {
additionalData['subscribe'] = subscribe.value();
}
if (!additionalData) {
return;
}
if (paymentData['extension_attributes'] === undefined) {
paymentData['extension_attributes'] = {};
}
console.log(additionalData);
paymentData['extension_attributes']['rokanthemes_opc'] = additionalData;
};
});
define([
'jquery',
'mage/validation'
], function ($) {
'use strict';
var checkoutConfig = window.checkoutConfig,
agreementsConfig = checkoutConfig ? checkoutConfig.checkoutAgreements : {},
agreementsInputPath = '.rokanthemes-onepagecheckout #opc-sidebar div.checkout-agreements input';
return {
/**
* Validate checkout agreements
*
* @returns {Boolean}
*/
validate: function () {
var isValid = true;
if (!agreementsConfig.isEnabled || $(agreementsInputPath).length === 0) {
return true;
}
$(agreementsInputPath).each(function (index, agreementsInput) {
if (!$('#onepagecheckout-form-checkout-agreements').validate({
errorClass: 'mage-error',
errorElement: 'div',
meta: 'validate',
errorPlacement: function (error, element) {
var errorPlacement = element;
if (element.is(':checkbox') || element.is(':radio')) {
errorPlacement = element.siblings('label').last();
}
errorPlacement.after(error);
}
}).element(agreementsInput)) {
isValid = false;
}
});
return isValid;
}
};
});
define([
'jquery'
], function ($) {
'use strict';
var agreementsConfig = window.checkoutConfig.checkoutAgreements;
/** Override default place order action and add agreement_ids to request */
return function (paymentData) {
var agreementForm,
agreementData,
agreementIds;
if (!agreementsConfig.isEnabled) {
return;
}
agreementForm = $('.payment-method._active div[data-role=checkout-agreements] input');
if (!_.isUndefined(window.checkoutConfig.OnePageCheckout) && $('.rokanthemes-onepagecheckout').length) {
agreementForm = $('.rokanthemes-onepagecheckout #opc-sidebar div[data-role=checkout-agreements] input');
}
agreementData = agreementForm.serializeArray();
agreementIds = [];
agreementData.forEach(function (item) {
agreementIds.push(item.value);
});
if (paymentData['extension_attributes'] === undefined) {
paymentData['extension_attributes'] = {};
}
paymentData['extension_attributes']['agreement_ids'] = agreementIds;
};
});
define(['ko'], function (ko) {
'use strict';
var hasLogin = window.checkoutConfig.OnePageCheckout.isAmazonAccountLoggedIn;
return {
isAmazonAccountLoggedIn: ko.observable(hasLogin),
setLogin: function (value) {
return this.isAmazonAccountLoggedIn(value);
}
};
});
define([
'jquery',
'Magento_Customer/js/model/customer',
'Rokanthemes_OnePageCheckout/js/model/save-new-account-information',
'mage/validation'
], function ($, customer, saveNewAccountInformation) {
'use strict';
return {
/**
* Validate checkout agreements
*
* @returns {Boolean}
*/
validate: function () {
var validationResult = true,
createNewAccountCheckBoxId = 'create-new-customer',
loginFormSelector = 'form[data-role=email-with-possible-login]';
if (!customer.isLoggedIn() && $(loginFormSelector + ' #'+createNewAccountCheckBoxId).is(":checked")) {
$(loginFormSelector).validation();
validationResult = Boolean($(loginFormSelector + ' input[name=newcustomerpassword]').valid());
if (validationResult == true) {
validationResult = Boolean($(loginFormSelector + ' input[name=newcustomerpassword_confirmation]').valid());
}
}
saveNewAccountInformation.ajaxSave();
return validationResult;
}
};
});
define([], function () {
'use strict';
return {
/**
* @return {Object}
*/
getRules: function () {
return {
'country_id': {
'required': true
}
};
}
};
});
define([
'jquery',
'mageUtils',
'./default-validation-rules',
'mage/translate'
], function ($, utils, validationRules, $t) {
'use strict';
return {
validationErrors: [],
/**
* @param {Object} address
* @return {Boolean}
*/
validate: function (address) {
var self = this;
this.validationErrors = [];
$.each(validationRules.getRules(), function (field, rule) {
var message;
if (rule.required && utils.isEmpty(address[field])) {
message = $t('Field ') + field + $t(' is required.');
self.validationErrors.push(message);
}
});
return !this.validationErrors.length;
}
};
});
/**
* @api
*/
define([
'Magento_GiftMessage/js/model/gift-message'
], function (GiftMessage) {
'use strict';
window.giftOptionsConfig = window.checkoutConfig.OnePageCheckout.giftOptionsConfig;
return function (itemId) {
return new GiftMessage(itemId);
};
});
define([
'underscore',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/payment/method-list',
'Magento_Checkout/js/action/select-payment-method',
'Magento_Checkout/js/model/payment-service'
], function (_, quote, methodList, selectPaymentMethod, paymentService) {
'use strict';
/**
* Free method filter
* @param {Object} paymentMethod
* @return {Boolean}
*/
var isFreePaymentMethod = function (paymentMethod) {
return paymentMethod.method === 'free';
},
/**
* Grabs the grand total from quote
* @return {Number}
*/
getGrandTotal = function () {
return quote.totals()['grand_total'];
};
return {
/**
* Populate the list of payment methods
* @param {Array} methods
*/
setPaymentMethods: function (methods) {
var freeMethod,
filteredMethods,
methodIsAvailable,
methodNames;
freeMethod = _.find(methods, isFreePaymentMethod);
paymentService.isFreeAvailable = !!freeMethod;
if (freeMethod && getGrandTotal() <= 0) {
methods.splice(0, methods.length, freeMethod);
selectPaymentMethod(freeMethod);
}
filteredMethods = _.without(methods, freeMethod);
if (filteredMethods.length === 1) {
selectPaymentMethod(filteredMethods[0]);
} else if (quote.paymentMethod()) {
methodIsAvailable = methods.some(function (item) {
return item.method === quote.paymentMethod().method;
});
//Unset selected payment method if not available
if (!methodIsAvailable) {
selectPaymentMethod(null);
}
}
/**
* Overwrite methods with existing methods to preserve ko array references.
* This prevent ko from re-rendering those methods.
*/
methodNames = _.pluck(methods, 'method');
_.map(methodList(), function (existingMethod) {
var existingMethodIndex = methodNames.indexOf(existingMethod.method);
if (existingMethodIndex !== -1) {
methods[existingMethodIndex] = existingMethod;
}
});
methodList(methods);
}
};
});
define([
'ko',
'Magento_Checkout/js/model/quote'
], function (ko, quote) {
'use strict';
var totals = quote.getTotals(),
couponCode = ko.observable(null);
if (totals()) {
couponCode(totals()['coupon_code']);
}
return {
isLoading: ko.observable(false),
isAppliedCoupon: ko.observable(couponCode() != null)
}
});
define([
'jquery',
'underscore',
'mage/utils/wrapper',
'Rokanthemes_OnePageCheckout/js/model/additional-data',
'Rokanthemes_OnePageCheckout/js/model/agreements-assigner'
], function ($, _, wrapper, additionalData, agreementsAssigner) {
'use strict';
return function (placeOrderAction) {
return wrapper.wrap(placeOrderAction, function (originalAction, paymentData, messageContainer) {
if (!_.isUndefined(window.checkoutConfig.OnePageCheckout)) {
additionalData(paymentData);
}
agreementsAssigner(paymentData);
return originalAction(paymentData, messageContainer);
});
};
});
define(
[
'jquery',
'Magento_Checkout/js/model/resource-url-manager'
],
function ($, resourceUrlManager) {
"use strict";
return $.extend({
/** Get url for update item qty and remove item */
getUrlForUpdatePaymentTotalInformation: function (quote) {
var params = this.getCheckoutMethod() === 'guest' ? {cartId: quote.getQuoteId()} : {};
var urls = {
'guest': '/guest-carts/:cartId/payment-total-information',
'customer': '/carts/mine/payment-total-information'
};
return this.getUrl(urls, params);
}
}, resourceUrlManager);
}
);
define([
'jquery',
'ko',
'uiComponent',
'Magento_Checkout/js/model/full-screen-loader',
'mage/url'
], function (
$,
ko,
Component,
fullScreenLoader,
urlBuilder
) {
return {
ajaxSave: function () {
var createNewAccountCheckBoxId = 'create-new-customer',
loginFormSelector = 'form[data-role=email-with-possible-login]';
var data = {};
if ($(loginFormSelector + ' #' + createNewAccountCheckBoxId).is(":checked")) {
data['email'] = $(loginFormSelector + ' input[name=username]').val();
data['pass'] = $(loginFormSelector + ' input[name=newcustomerpassword]').val();
data['confirmpass'] = $(loginFormSelector + ' input[name=newcustomerpassword_confirmation]').val();
}
var saveUrl = 'onepagecheckout/account/save';
fullScreenLoader.startLoader();
$.ajax({
url: urlBuilder.build(saveUrl),
data: data,
type: 'post',
dataType: 'json',
/** @inheritdoc */
success: function (response) {
fullScreenLoader.stopLoader();
},
/** @inheritdoc */
error: function () {
alert({
content: $.mage.__('Sorry, something went wrong. Please try again later.')
});
}
});
}
};
});
define([
'jquery',
'mage/utils/wrapper',
'Rokanthemes_OnePageCheckout/js/model/additional-data',
'Rokanthemes_OnePageCheckout/js/model/agreements-assigner',
'underscore',
'Magento_Checkout/js/checkout-data',
], function ($, wrapper, additionalData, agreementsAssigner, _, checkoutData) {
'use strict';
return function (placeOrderAction) {
/** Override place-order-mixin for set-payment-information action as they differs only by method signature */
return wrapper.wrap(placeOrderAction, function (originalAction, messageContainer, paymentData) {
if (!_.isUndefined(window.checkoutConfig.OnePageCheckout)) {
additionalData(paymentData);
}
agreementsAssigner(paymentData);
// only send request when email is filled
if (window.checkoutConfig.isCustomerLoggedIn &&
!_.isEmpty(checkoutData.getSelectedShippingAddress())) {
return originalAction(messageContainer, paymentData);
}
if (!_.isEmpty(checkoutData.getValidatedEmailValue())) {
return originalAction(messageContainer, paymentData);
}
return originalAction(messageContainer, paymentData);
});
};
});
define([
'Magento_Checkout/js/model/resource-url-manager',
'Magento_Checkout/js/model/quote',
'mage/storage',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/model/shipping-rate-registry',
'Magento_Checkout/js/model/error-processor'
], function (resourceUrlManager, quote, storage, shippingService, rateRegistry, errorProcessor) {
'use strict';
return function (address) {
shippingService.isLoading(true);
return storage.post(
resourceUrlManager.getUrlForEstimationShippingMethodsByAddressId(),
JSON.stringify({
addressId: address.customerAddressId
}),
false
).done(function (result) {
console.log('register');
rateRegistry.set(address.getKey(), result);
shippingService.setShippingRates(result);
}).fail(function (response) {
console.log('cccc');
shippingService.setShippingRates([]);
errorProcessor.process(response);
}).always(function () {
console.log('ddd');
shippingService.isLoading(false);
}
);
}
});
define([
'Magento_Checkout/js/model/resource-url-manager',
'Magento_Checkout/js/model/quote',
'mage/storage',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/model/shipping-rate-registry',
'Magento_Checkout/js/model/error-processor'
], function (resourceUrlManager, quote, storage, shippingService, rateRegistry, errorProcessor) {
'use strict';
return function (address) {
var serviceUrl, payload;
shippingService.isLoading(true);
serviceUrl = resourceUrlManager.getUrlForEstimationShippingMethodsForNewAddress(quote);
payload = JSON.stringify({
address: {
'street': address.street,
'city': address.city,
'region_id': address.regionId,
'region': address.region,
'country_id': address.countryId,
'postcode': address.postcode,
'email': address.email,
'customer_id': address.customerId,
'firstname': address.firstname,
'lastname': address.lastname,
'middlename': address.middlename,
'prefix': address.prefix,
'suffix': address.suffix,
'vat_id': address.vatId,
'company': address.company,
'telephone': address.telephone,
'fax': address.fax,
'custom_attributes': address.customAttributes,
'save_in_address_book': address.saveInAddressBook
}
}
);
return storage.post(
serviceUrl, payload, false
).done(function (result) {
rateRegistry.set(address.getCacheKey(), result);
shippingService.setShippingRates(result);
}).fail(function (response) {
shippingService.setShippingRates([]);
errorProcessor.process(response);
}).always(function () {
shippingService.isLoading(false);
});
}
});
define([
'jquery',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/shipping-rate-processor/new-address',
'Magento_Checkout/js/model/shipping-rate-processor/customer-address'
], function ($, quote, defaultProcessor, customerAddressProcessor) {
'use strict';
var processors = [];
processors.default = defaultProcessor;
processors['customer-address'] = customerAddressProcessor;
quote.shippingAddress.subscribe(function () {
if (typeof window.shippingAddress === "undefined" || $.isEmptyObject(window.shippingAddress)) {
var type = quote.shippingAddress().getType();
if (processors[type]) {
processors[type].getRates(quote.shippingAddress());
} else {
processors.default.getRates(quote.shippingAddress());
}
}
});
return {
/**
* @param {String} type
* @param {*} processor
*/
registerProcessor: function (type, processor) {
processors[type] = processor;
}
};
});
define(['jquery'], function ($) {
'use strict';
return function (target) {
target.getObservableFields = function () {
var self = this,
observableFields = [];
$.each(self.getRules(), function (carrier, fields) {
$.each(fields, function (field) {
if (observableFields.indexOf(field) === -1) {
observableFields.push(field);
}
});
});
observableFields.push('telephone'); // Load shipping method on Phone Number change
return observableFields;
};
return target;
};
});
define([
'jquery',
'ko',
'underscore',
'Magento_Checkout/js/model/shipping-rates-validation-rules',
'Magento_Checkout/js/model/address-converter',
'Magento_Checkout/js/action/select-shipping-address',
'Magento_Checkout/js/model/postcode-validator',
'Rokanthemes_OnePageCheckout/js/model/default-validator',
'mage/translate',
'uiRegistry',
'Magento_Checkout/js/model/shipping-address/form-popup-state',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/shipping-rates-validator'
], function (
$,
ko,
_,
shippingRatesValidationRules,
addressConverter,
selectShippingAddress,
postcodeValidator,
defaultValidator,
$t,
uiRegistry,
formPopUpState,
quote,
shippingRatesValidator
) {
'use strict';
var validators = [],
postcodeElement = null,
postcodeElementName = 'postcode';
validators.push(defaultValidator);
shippingRatesValidator.doElementBinding = function (element, force, delay) {
var observableFields = shippingRatesValidationRules.getObservableFields();
if (_.isUndefined(delay)) {
if (element.index === 'country_id' || element.index === 'region_id') {
delay = 0;
} else {
delay = 700;
}
}
if (element && (observableFields.indexOf(element.index) !== -1 || force)) {
if (element.index !== postcodeElementName) {
this.bindHandler(element, delay);
}
}
if (element.index === postcodeElementName) {
this.bindHandler(element, delay);
postcodeElement = element;
}
};
return shippingRatesValidator;
});
define([
'Rokanthemes_OnePageCheckout/js/model/shipping-save-processor/default'
], function (defaultProcessor) {
'use strict';
var processors = [];
processors['default'] = defaultProcessor;
return {
/**
* @param {String} type
* @param {*} processor
*/
registerProcessor: function (type, processor) {
processors[type] = processor;
},
/**
* @param {String} type
* @return {Array}
*/
saveShippingInformation: function (type) {
var rates = [];
if (processors[type]) {
rates = processors[type].saveShippingInformation();
} else {
rates = processors['default'].saveShippingInformation();
}
return rates;
}
};
});
define([
'ko',
'underscore',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/resource-url-manager',
'mage/storage',
'Rokanthemes_OnePageCheckout/js/model/payment-service-default',
'Magento_Checkout/js/model/payment/method-converter',
'Magento_Checkout/js/model/error-processor',
'Magento_Checkout/js/action/select-billing-address',
'Rokanthemes_OnePageCheckout/js/model/shipping-save-processor/payload-extender',
'Magento_Customer/js/model/customer'
], function (
ko,
_,
quote,
resourceUrlManager,
storage,
paymentService,
methodConverter,
errorProcessor,
selectBillingAddressAction,
payloadExtender,
customer
) {
'use strict';
return {
/**
* @return {jQuery.Deferred}
*/
saveShippingInformation: function () {
var payload;
if (!quote.billingAddress()) {
selectBillingAddressAction(quote.shippingAddress());
}
var billingAddress = quote.billingAddress();
if (!customer.isLoggedIn()) {
if (billingAddress) {
if (!_.isUndefined(billingAddress.street)) {
if (billingAddress.street.length == 0) {
delete billingAddress.street;
}
} else {
delete billingAddress.street;
}
}
}
payload = {
addressInformation: {
'shipping_address': quote.shippingAddress(),
'billing_address': quote.billingAddress(),
'shipping_method_code': quote.shippingMethod()['method_code'],
'shipping_carrier_code': quote.shippingMethod()['carrier_code']
}
};
payloadExtender(payload);
return storage.post(
resourceUrlManager.getUrlForSetShippingInformation(quote),
JSON.stringify(payload)
).done(
function (response) {
quote.setTotals(response.totals);
paymentService.setPaymentMethods(methodConverter(response['payment_methods']));
}
).fail(
function (response) {
errorProcessor.process(response);
}
);
}
};
});
define([
'jquery'
], function ($) {
'use strict';
return function (payload) {
payload.addressInformation['extension_attributes'] = {};
if ($('#shipping #customer_shipping_date').length || $('#opc-shipping_method #customer_shipping_date').length) {
payload.addressInformation['extension_attributes']['customer_shipping_date'] = $('#customer_shipping_date').val();
}
if ($('#shipping #customer_shipping_comments').length || $('#opc-shipping_method #customer_shipping_comments').length) {
payload.addressInformation['extension_attributes']['customer_shipping_comments'] = $('#customer_shipping_comments').val();
}
if ($('#shipping #delivery_time_slot').length || $('#opc-shipping_method #delivery_time_slot').length) {
payload.addressInformation['extension_attributes']['delivery_time_slot'] = $('#delivery_time_slot').val();
}
return payload;
};
});
define([
'ko',
'underscore',
'Magento_Checkout/js/model/quote',
'mage/storage',
'Magento_Checkout/js/model/error-processor',
'Magento_Checkout/js/action/select-billing-address',
'Magento_Checkout/js/model/resource-url-manager',
'Rokanthemes_OnePageCheckout/js/model/shipping-save-processor/payload-extender',
'Magento_Customer/js/model/customer'
], function (
ko,
_,
quote,
storage,
errorProcessor,
selectBillingAddressAction,
resourceUrlManager,
payloadExtender,
customer
) {
'use strict';
return {
/**
* @return {jQuery.Deferred}
*/
saveShippingInformation: function () {
var payload;
if (!quote.billingAddress()) {
selectBillingAddressAction(quote.shippingAddress());
}
var billingAddress = quote.billingAddress();
if (!customer.isLoggedIn()) {
if (billingAddress) {
if (!_.isUndefined(billingAddress.street)) {
if (billingAddress.street.length == 0) {
delete billingAddress.street;
}
} else {
delete billingAddress.street;
}
}
}
payload = {
addressInformation: {
'shipping_address': quote.shippingAddress(),
'billing_address': quote.billingAddress(),
'shipping_method_code': quote.shippingMethod()['method_code'],
'shipping_carrier_code': quote.shippingMethod()['carrier_code']
}
};
payloadExtender(payload);
return storage.post(
resourceUrlManager.getUrlForSetShippingInformation(quote),
JSON.stringify(payload)
).fail(
function (response) {
errorProcessor.process(response);
}
);
}
};
});
define([
'underscore'
], function (_) {
'use strict';
return function (stepNavigator) {
if (!_.isUndefined(window.checkoutConfig.OnePageCheckout)) {
stepNavigator.isProcessed = function () {
return true;
};
}
return stepNavigator;
};
});
define([
'jquery',
'ko',
'Magento_Checkout/js/model/step-navigator'
], function ($, ko, stepNavigator) {
'use strict';
var steps = ko.observableArray();
return {
/**
* @param {String} code
* @param {*} alias
* @param {*} title
* @param {Function} isVisible
* @param {*} navigate
* @param {*} sortOrder
*/
registerStep: function (code, alias, title, isVisible, navigate, sortOrder) {
var hash, active;
if ($.inArray(code, stepNavigator.validCodes) !== -1) {
throw new DOMException('Step code [' + code + '] already registered in step navigator');
}
if (alias != null) {
if ($.inArray(alias, stepNavigator.validCodes) !== -1) {
throw new DOMException('Step code [' + alias + '] already registered in step navigator');
}
stepNavigator.validCodes.push(alias);
}
stepNavigator.validCodes.push(code);
steps.push({
code: code,
alias: alias != null ? alias : code,
title: title,
isVisible: isVisible,
navigate: navigate,
sortOrder: sortOrder
});
active = stepNavigator.getActiveItemIndex();
steps.each(function (elem, index) {
if (active !== index && elem.code !== 'payment') {
elem.isVisible(false);
}
});
stepNavigator.stepCodes.push(code);
hash = window.location.hash.replace('#', '');
if (hash != '' && hash != code) {
isVisible(false);
}
}
};
});
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