Magento mendaftar untuk akun di checkout

8

Adakah yang tahu apakah mungkin untuk memindahkan langkah pendaftaran pelanggan ke checkout seperti di checkout Magento 1 asli? Mencari ekstensi yang akan melakukan ini untuk saya atau saran tentang bagaimana saya bisa mencapai ini.

Jason
sumber
Anda dapat menambahkan langkah-langkah untuk checkout dengan mengikuti di sini: devdocs.magento.com/guides/v2.0/howdoi/checkout/…
harri
Setelah menyelesaikan checkout magento juga memberikan opsi sekarang untuk membuat akun dari detail yang disediakan selama checkout di halaman sukses.
harri
@ Harri Saya tahu itu cara kerjanya tetapi kami memiliki klien yang menginginkan pendaftaran terjadi bersamaan dengan pesanan yang dilakukan.
Jason
@Jason Apakah Anda mendapatkan solusi untuk ini?
Rohit Kundale
Lihat di sini github.com/danslo/CleanCheckout
Sohel Rana

Jawaban:

1

Saya akan pergi dengan membuat langkah dalam checkout ini mendeteksi cuaca Anda login dan kemudian menunjukkan bentuk yang sesuai.

Muat formulir pendaftaran ke dalam langkah ini di atas ajax dan ubah acara setelah register yang mendeteksi apakah pendaftaran dilakukan agar checkout diarahkan kembali ke checkout daripada pada dashboard.

Saya sejauh menambahkan langkah kerja yang menunjukkan ketika tidak masuk untuk pendaftaran dan mengarahkan keberhasilan pendaftaran kembali ke checkout menonaktifkan langkah sebelumnya untuk pengalaman pengguna yang lancar.

Menawarkan opsi masuk jika pengguna memiliki akun tetapi belum masuk pada tahap ini akan meningkatkan lebih lanjut di sini.

Ini adalah kode lengkap jika Anda ingin memeriksa semua itu banyak untuk dimasukkan dalam jawaban:

https://github.com/harrigo/RegisterCheckout

Buat formulir daftar di dalam pengontrol:

Karena langkah checkout memerlukan beberapa phpuntuk dijalankan untuk mendapatkan url dan kunci form dll, sebuah kontroler akan diperlukan sehingga kita dapat memuat formulir register ini melalui ajax ke dalam langkah.

<?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/');

    }
}

Kontroler / Indeks / Register.php

Di bawah ini membuat blok registrasi dalam controller sehingga kami dapat memanggil ajax ke checkout.

<?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

Pastikan untuk menambahkan routes.xml dalam folder etc / frontend dari modul.

<?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>

Buat langkah checkout:

http://devdocs.magento.com/guides/v2.0/howdoi/checkout/checkout_new_step.html

Karena ini adalah langkah pertama pastikan untuk menambahkan mixin seperti yang telah saya lakukan dalam modul karena devdocs salah di sini yang mengarah ke setiap langkah yang menunjukkan:

<!--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>

Ini gagal jika blok tidak dimuat sebelum panggilan ajax tetapi akhirnya menggunakan sesuatu seperti ini untuk mendapatkan formulir pendaftaran kami dari controller dan meludahkannya ke langkah:

//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) {
  }
});

Ada banyak langkah di sini cukup ikuti devdocs memastikan untuk melakukan langkah mixin tetapi gunakan di bawah ini untuk mixin karena contoh devdocs tidak berfungsi:

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);
        };
    }
);

Perbedaan utama adalah pembayaran dan pengiriman langkah menggunakan isVisible dan Visible dan devdocs hanya menggunakan terlihat dalam contoh sehingga isVisible perlu ditambahkan untuk diperbaiki. Juga harus melakukan penyesuaian jika langkah dinonaktifkan.

Ubah Pengalihan Pendaftaran:

Magento 2 - Mengarahkan pengguna ke halaman tertentu setelah mendaftar

<?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();
    }
}

Contoh kasar tetapi juga harus mengganti register.phtml untuk menambahkan variabel pos checkout untuk menentukan perbedaan antara 2 formulir. Di sana banyak langkah yang tidak saya tunjukkan tetapi periksa modul yang saya buat untuk contoh lengkap.

harri
sumber