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 php
d'ê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.