Có ai biết liệu có thể chuyển bước đăng ký của khách hàng sang thanh toán như trong thanh toán Magento 1 ban đầu không? Tìm kiếm một phần mở rộng sẽ làm điều này cho tôi hoặc lời khuyên về cách tôi có thể đạt được điều này.
Có ai biết liệu có thể chuyển bước đăng ký của khách hàng sang thanh toán như trong thanh toán Magento 1 ban đầu không? Tìm kiếm một phần mở rộng sẽ làm điều này cho tôi hoặc lời khuyên về cách tôi có thể đạt được điều này.
Câu trả lời:
Tôi sẽ đi bằng cách tạo một bước kiểm tra, điều này sẽ phát hiện thời tiết bạn đang đăng nhập và sau đó hiển thị biểu mẫu tương ứng.
Tải biểu mẫu đăng ký vào bước này qua ajax và sửa đổi sự kiện sau khi đăng ký phát hiện xem đăng ký có được thực hiện khi thanh toán chuyển hướng trở lại thanh toán thay vì bảng điều khiển.
Tôi đã đi xa hơn khi thêm một bước làm việc cho thấy khi không đăng nhập để đăng ký và chuyển hướng thành công đăng ký trở lại để kiểm tra vô hiệu hóa bước trước đó để có trải nghiệm người dùng mượt mà.
Cung cấp tùy chọn đăng nhập nếu người dùng có tài khoản nhưng chưa đăng nhập ở giai đoạn này sẽ cải thiện hơn nữa tại đây.
Đây là mã đầy đủ nếu bạn muốn kiểm tra tất cả rất nhiều để đưa vào câu trả lời:
Tạo một biểu mẫu đăng ký trong bộ điều khiển:
Vì các bước thanh toán cần một số php
để chạy để lấy url và khóa biểu mẫu, v.v., sẽ cần một bộ điều khiển để chúng tôi có thể tải biểu mẫu đăng ký này qua ajax vào bước này.
<?php
namespace Harrigo\RegisterCheckout\Controller\Index;
use Magento\Framework\Controller\ResultFactory;
class Register extends \Magento\Framework\App\Action\Action
{
protected $resultPageFactory;
/**
* Constructor
*
* @param \Magento\Framework\App\Action\Context $context
* @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
*/
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $resultPageFactory
)
{
$this->resultPageFactory = $resultPageFactory;
$this->_resultFactory = $context->getResultFactory();
parent::__construct($context);
}
/**
* Execute view action
*
* @return \Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
//if (isset($_POST["cart"])) {
$resultLayout = $this->resultFactory->create(ResultFactory::TYPE_LAYOUT);
return $resultLayout;
//}
//$this->_redirect('checkout/');
}
}
Trình điều khiển / Chỉ mục / Đăng ký.php
Dưới đây biểu hiện các khối đăng ký trong bộ điều khiển để sau đó chúng tôi có thể gọi qua ajax vào thanh toán.
<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
<container name="root" label="Root">
<block class="Magento\Framework\View\Element\Js\Components" name="customer_account_create_head_components" template="Magento_Customer::js/components.phtml"/>
<block class="Magento\Customer\Block\Form\Register" name="customer_form_register" template="Harrigo_RegisterCheckout::register.phtml">
<container name="form.additional.info" as="form_additional_info"/>
<container name="customer.form.register.fields.before" as="form_fields_before" label="Form Fields Before" htmlTag="div" htmlClass="customer-form-before"/>
</block>
<block class="Magento\Cookie\Block\RequireCookie" name="require-cookie" template="Magento_Cookie::require_cookie.phtml">
<arguments>
<argument name="triggers" xsi:type="array">
<item name="registerSubmitButton" xsi:type="string">.action.submit</item>
</argument>
</arguments>
</block>
<block class="Magento\Framework\View\Element\Template" name="form_additional_info_customer" template="Magento_Customer::additionalinfocustomer.phtml"/>
</container>
</layout>
/view/frontend/layout/harrigoregister_index_register.xml
Hãy chắc chắn để thêm Routin trong thư mục etc / frontend của mô-đun.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="standard">
<route id="harrigoregister" frontName="harrigoregister">
<module name="Harrigo_RegisterCheckout" />
</route>
</router>
</config>
Tạo một bước thanh toán:
http://devdocs.magento.com/guides/v2.0/howdoi/checkout/checkout_new_step.html
Vì đây là bước đầu tiên, hãy đảm bảo thêm các mixin giống như tôi đã thực hiện trong mô-đun vì devdocs không chính xác ở đây dẫn đến mỗi bước hiển thị:
<!--The 'step_code' value from the .js file should be used-->
<li id="registerstep" data-bind="fadeVisible: isVisible">
<div class="step-title" data-bind="i18n: 'Register'" data-role="title"></div>
<div id="checkout-step-title"
class="step-content"
data-role="content">
<form data-bind="submit: navigateToNextStep" novalidate="novalidate">
<div class="actions-toolbar" id="shipping-method-buttons-container">
<div class="primary">
<button data-role="opc-continue" type="submit" class="button action continue primary">
<span><!-- ko i18n: 'Continue as guest'--><!-- /ko --></span>
</button>
</div>
</div>
</form>
</div>
<div id="registerblock"></div>
</li>
Điều này đã thất bại nếu khối không được tải trước cuộc gọi ajax nhưng cuối cùng lại sử dụng một cái gì đó như thế này để lấy mẫu đăng ký của chúng tôi từ bộ điều khiển và nhổ nó vào bước:
//waits for elements to load in checkout
function waitForElement(elementPath, callBack){
window.setTimeout(function(){
if($(elementPath).length){
callBack(elementPath, $(elementPath));
}else{
waitForElement(elementPath, callBack);
}
},500)
}
//get crosssell products / newsletter
$.ajax({
url: "/harrigoregister/index/register",
type: "post",
data: {
cart: "yes"
},
success: function(response) {
waitForElement("#registerblock",function(){
$("#registerblock").html(response);
});
},
error: function(xhr) {
}
});
Có rất nhiều bước nữa ở đây chỉ cần làm theo devdocs để đảm bảo thực hiện bước mixin nhưng sử dụng bên dưới cho mixin vì ví dụ devdocs không hoạt động:
define(
[
'ko',
'Magento_Customer/js/model/customer'
], function (ko, customer) {
'use strict';
var mixin = {
initialize: function () {
if(!customer.isLoggedIn()) {
this.isVisible = ko.observable(false);
this.visible = ko.observable(false); // set visible to be initially false to have your step show first
}
this._super();
return this;
}
};
return function (target) {
return target.extend(mixin);
};
}
);
Sự khác biệt chính là các bước thanh toán và vận chuyển sử dụng isVisible và Visible và devdocs chỉ sử dụng hiển thị trong ví dụ vì vậy isVisible cần được thêm vào để sửa chữa. Cũng phải điều chỉnh nếu bước bị vô hiệu hóa.
Sửa đổi chuyển hướng đăng ký:
Magento 2 - Chuyển hướng người dùng đến trang cụ thể sau khi đăng ký
<?php
namespace Harrigo\RegisterCheckout\Plugin;
use Magento\Framework\Controller\ResultFactory;
use Magento\Framework\Registry;
use Magento\Framework\UrlInterface;
class Redirect
{
protected $coreRegistry;
protected $url;
protected $resultFactory;
public function __construct(Registry $registry, UrlInterface $url, ResultFactory $resultFactory)
{
$this->coreRegistry = $registry;
$this->url = $url;
$this->resultFactory = $resultFactory;
}
public function aroundGetRedirect ($subject, \Closure $proceed)
{
//need to check out if registration was from checkouit
/** @var \Magento\Framework\Controller\Result\Redirect $result */
if ($_POST['checkout'] = 'true') {
$result = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
$result->setUrl($this->url->getUrl('checkout'));
return $result;
}
return $proceed();
}
}
Ví dụ thô sơ nhưng cũng phải ghi đè register.phtml để thêm biến bài kiểm tra để xác định sự khác biệt giữa 2 biểu mẫu. Ở đó có rất nhiều bước tôi đã không hiển thị nhưng kiểm tra mô-đun tôi đã tạo cho ví dụ đầy đủ.