Ich würde einen Schritt in der Kasse erstellen, der das Wetter erkennt, bei dem Sie angemeldet sind, und dann das entsprechende Formular anzeigt.
Laden Sie das Registrierungsformular über Ajax in diesen Schritt und ändern Sie das Ereignis nach der Registrierung , um festzustellen, ob bei der Registrierung die Kasse zurück zur Kasse und nicht zum Dashboard umgeleitet wurde.
Ich bin so weit gekommen, einen Arbeitsschritt hinzuzufügen, der anzeigt, wenn ich nicht für die Registrierung angemeldet bin, und den Registrierungserfolg zurück zum Auschecken umzuleiten, wodurch der vorherige Schritt für eine reibungslose Benutzererfahrung deaktiviert wurde.
Das Anbieten einer Anmeldeoption, wenn der Benutzer ein Konto hat, sich aber zu diesem Zeitpunkt noch nicht angemeldet hat, würde sich hier weiter verbessern.
Dies ist vollständiger Code, wenn Sie alles überprüfen möchten, was in der Antwort viel enthalten war:
https://github.com/harrigo/RegisterCheckout
Erstellen Sie ein Registerformular innerhalb des Controllers:
Da die Checkout-Schritte ausgeführt werden müssen php
, um die Formular-URL und den Schlüssel usw. zu erhalten, wird ein Controller benötigt, damit wir dieses Registerformular über Ajax in den Schritt laden können .
<?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
Im Folgenden werden die Registrierungsblöcke innerhalb des Controllers gerendert, sodass wir dann über Ajax in die Kasse rufen können.
<?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
Stellen Sie sicher, dass Sie die Datei route.xml im Ordner etc / frontend des Moduls hinzufügen.
<?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>
Erstellen Sie einen Checkout-Schritt:
http://devdocs.magento.com/guides/v2.0/howdoi/checkout/checkout_new_step.html
Da dies der erste Schritt ist, stellen Sie sicher, dass Sie die Mixins hinzufügen, wie ich es im Modul getan habe, da die Devdocs hier falsch sind, was zu jedem Schritt führt, der Folgendes zeigt:
<!--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>
Dies schlug fehl, wenn der Block vor dem Ajax-Aufruf nicht geladen worden war, aber so etwas verwendet wurde, um unser Registrierungsformular vom Controller zu erhalten und es auf den Schritt zu spucken:
//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) {
}
});
Es gibt hier noch viel mehr Schritte. Folgen Sie einfach den Devdocs und stellen Sie sicher, dass Sie den Mixin-Schritt ausführen. Verwenden Sie ihn jedoch unten für das Mixin, da das Devdocs-Beispiel nicht funktioniert:
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);
};
}
);
Die Hauptunterschiede bestanden darin, dass die Zahlungs- und Versandschritte isVisible und Visible verwenden und devdocs nur die im Beispiel sichtbaren verwendet, sodass isVisible zum Beheben hinzugefügt werden musste. Musste auch Anpassungen vornehmen, wenn der Schritt deaktiviert war.
Registrierungsumleitung ändern:
Magento 2 - Leitet den Benutzer nach der Registrierung auf eine bestimmte Seite um
<?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();
}
}
Grobes Beispiel, musste aber auch die register.phtml überschreiben, um die Checkout-Post-Variable hinzuzufügen und den Unterschied zwischen den beiden Formularen zu bestimmen. Dort, wo ich viele Schritte nicht gezeigt habe, aber das Modul, das ich erstellt habe, auf ein vollständiges Beispiel überprüft habe.