Magento enregistre un compte à la caisse

8

Est-ce que quelqu'un sait s'il est possible de déplacer l'étape d'enregistrement du client vers la caisse comme dans la caisse d'origine de Magento 1? Vous cherchez une extension qui fera cela pour moi ou des conseils sur la façon dont je pourrais y parvenir.

Jason
la source
Vous pouvez ajouter des étapes pour passer
harri
Une fois le paiement terminé, magento donne également la possibilité de créer un compte à partir des détails fournis lors du paiement sur la page de réussite.
harri
@harri Je sais que cela fonctionne, mais nous avons un client qui souhaite que l'enregistrement se fasse en même temps que la commande.
Jason
@Jason Avez-vous trouvé une solution à cela?
Rohit Kundale
Vérifiez ici github.com/danslo/CleanCheckout
Sohel Rana

Réponses:

1

Je procéderais en créant une étape de paiement qui détecte le temps que vous êtes connecté et affiche ensuite le formulaire en conséquence.

Chargez le formulaire d'inscription dans cette étape via ajax et modifiez l' événement après l' enregistrement en détectant si l'inscription a été redirigée vers la caisse au lieu du tableau de bord.

Je suis allé jusqu'à ajouter une étape de travail qui montre quand il n'est pas connecté pour l'enregistrement et rediriger le succès de l'enregistrement vers la caisse en désactivant l'étape précédente pour une expérience utilisateur fluide.

Offrir une option de connexion si l'utilisateur a un compte mais ne s'est pas connecté à ce stade serait encore amélioré ici.

C'est du code complet si vous voulez vérifier tout cela était beaucoup à inclure dans la réponse:

https://github.com/harrigo/RegisterCheckout

Créez un formulaire d'inscription dans le contrôleur:

Comme les étapes de vérification ont besoin phpd'être exécutées pour obtenir l'url et la clé du formulaire, etc., un contrôleur sera nécessaire pour que nous puissions charger ce formulaire de registre via ajax dans l'étape.

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

    }
}

Controller / Index / Register.php

Ce qui suit rend les blocs d'enregistrement dans le contrôleur afin que nous puissions ensuite appeler ajax dans la caisse.

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

Assurez-vous d'ajouter routes.xml dans le dossier etc / frontend du module.

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

Créez une étape de paiement:

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

Comme c'est la première étape, assurez-vous d'ajouter les mixins comme je l'ai fait dans le module, car les devdocs sont incorrects, ce qui conduit à chaque étape:

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

Cela échouait si le bloc n'avait pas été chargé avant l'appel ajax mais a fini par utiliser quelque chose comme ça pour obtenir notre formulaire d'inscription du contrôleur et le cracher sur l'étape:

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

Il y a beaucoup plus d'étapes ici, suivez simplement les devdocs en vous assurant de faire le mixin mais utilisez ci-dessous pour le mixin car l'exemple devdocs ne fonctionne pas:

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

Les principales différences étaient que les étapes de paiement et d'expédition utilisent isVisible et Visible et devdocs n'utilise que visible dans l'exemple, donc isVisible devait être ajouté pour corriger. A également dû faire des ajustements pour si l'étape était désactivée.

Modifier la redirection d'inscription:

Magento 2 - Rediriger l'utilisateur vers une page spécifique après l'enregistrement

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

Exemple approximatif mais a également dû remplacer le register.phtml pour ajouter la variable de validation de paiement pour déterminer la différence entre les 2 formulaires. Il y avait beaucoup d'étapes que je n'ai pas montrées mais vérifiez le module que j'ai créé pour un exemple complet.

harri
la source