Commit 94a98b12 by lmf

增加onepagecheckout插件

parent d6818c77
......@@ -137,13 +137,13 @@ class Add extends \Magento\Checkout\Controller\Cart implements HttpPostActionInt
);
if (!$this->_checkoutSession->getNoCartRedirect(true)) {
if ($this->shouldRedirectToCart()) {
$message = __(
'You added %1 to your shopping cart.',
$product->getName()
);
$this->messageManager->addSuccessMessage($message);
}
// if ($this->shouldRedirectToCart()) {
// $message = __(
// 'You added %1 to your shopping cart.',
// $product->getName()
// );
// $this->messageManager->addSuccessMessage($message);
// }
if ($this->cart->getQuote()->getHasError()) {
$errors = $this->cart->getQuote()->getErrors();
foreach ($errors as $error) {
......
......@@ -65,7 +65,7 @@ Message,Message
"Print receipt","Print receipt"
"Apply Discount Code","Apply Discount Code"
"Enter discount code","Enter discount code"
"Apply Discount","Apply Discount"
"Apply Discount","Apply Code"
"Cancel Coupon","Cancel Coupon"
"Shopping Cart Items","Shopping Cart Items"
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