In allen Tutorials wird nur das Hinzufügen von Feldern behandelt. Das Speichern des Werts dieser Dateien wird jedoch übersprungen. Ich weiß nicht warum, es ist der wichtigste Teil beim Hinzufügen von Feldern oder Formularen.
Ich habe versucht, Magento-Dokumenten zu folgen , aber ... es ist scheiße.
Zu Testzwecken versuche ich, der Lieferadresse weitere Felder hinzuzufügen, nur um benutzerdefinierte Bereiche, benutzerdefinierte Datensätze, benutzerdefinierte Datenanbieter und andere undokumentierte Dinge zu ignorieren, was für mich zu seltsam aussieht.
Ich habe keine Ahnung, was bedeutet, dass diese Form "statisch" oder "dynamisch" ist. Für mich werden alle Checkout-Formulare dynamisch über KnockoutJS-Vorlagen erstellt, aber ... wenn ich es auf "statische" Weise versuche, kann ich hier Eingaben hinzufügen (also handelt es sich um ein statisches Formular oder nicht?).
Zuerst versuche ich zu debuggen, warum Knockout-Observables meine Felder beim Parsen und Senden von Daten einfach ignorieren. Ich habe festgestellt, dass meine Felder leere name
Parameter enthalten, kann dieses Problem jedoch nicht beheben. IMO sollte es UI - Komponente Renderer über geben werden inputName
Parameter, wie alle anderen Optionen wie disabled
, placeholder
usw. (andere Parameter funktioniert gut, ich überprüft Konfiguration erzeugt von meinem XML zur Kasse Modulinitialisierung und sieht gut aus für mich)
Zweitens habe ich versucht, "dynamisch" zu arbeiten, indem ich Plugins mit LayoutProcessor
denselben Daten erstellte und diese weitergab ... und jetzt habe ich Felder mit name
s, aber das Senden funktioniert überhaupt nicht.
Nachdem ich mich in JS vertieft hatte, stellte ich fest, dass die Vorbereitung dieser Anfrage in einer module-checkout/view/frontend/web/js/model/shipping-save-processor/default.js
Datei gespeichert ist, die davon abhängt, module-checkout/view/frontend/web/js/model/quote.js
wo Knockout-Observables definiert / erstellt werden.
Irgendwie module-checkout/view/frontend/web/js/model/address-converter.js
aktualisieren diese Observables und hängen davon ab module-checkout/view/frontend/web/js/model/new-customer-address.js
, wo ich endlich einige interessante Konfigurationsmöglichkeiten gefunden habe - Liste aller Adressfelder.
Wenn ich meine Felder hier hinzufüge, fangen die Skripte an, sie zu analysieren und zu senden. OFC, ich erhalte 500, das b / c-Backend erkennt sie nicht ... (nicht fragen, ich bin kein Backend-Entwickler)
Hier kommen meine Fragen:
- Es ist eine richtige Art, mit dieser Art von Anpassung umzugehen? (B / C sieht komisch aus für mich)
- Wie werden Werte von Feldern gesendet, die sich nicht auf neue Adressen beziehen? Ich habe nirgendwo eine ähnliche Konfiguration gesehen. In meinem Fall möchte ich einen Bestellkommentar (Textbereich) und eine Rechnungsanfrage (Kontrollkästchen) senden. Beides sollte nicht als Adresse gespeichert werden, b / c einige Benutzer möchten diese Adresse möglicherweise für die zukünftige Verwendung speichern.
- Gibt es eine Dokumentation über "statische" und "dynamische" Formulare oder einige Beispiele / Vergleiche? Lohnt es sich so darüber nachzudenken?
Zusätzliche existenzielle Frage:
- Warum ist das so inkonsistent? Warum muss ich Unmengen von Parametern in XML / PHP-Dateien definieren, während Magento überhaupt nur eine Eingabe rendern kann und ich dann alles selbst handhaben muss?
quelle
Antworten:
Ich werde versuchen, Ihre Frage (n) zu beantworten.
Nein . Dies ist keine korrekte Methode, um benutzerdefinierte Attribute zum Versandadressformular hinzuzufügen. Sie müssen nicht bearbeiten
new-customer-address.js
. In der Tat listet diese JS-Datei alle vordefinierten Adressattribute auf und stimmt mit der entsprechenden Backend-Schnittstelle überein.\Magento\Quote\Api\Data\AddressInterface
Magento bietet jedoch die Möglichkeit, benutzerdefinierte Attribute an das Backend zu übergeben, ohne die Backend- / Frontend- Komponenten zu ändern .Die erwähnte JS-Komponente hat eine
customAttributes
Eigenschaft. Ihre benutzerdefinierten Attribute werden automatisch verarbeitet, wenn sie$dataScopePrefix
"shippindAddress.custom_attributes
" lauten .Wenn ich Ihre Frage richtig verstanden habe, haben Sie Daten, die nicht Teil der Kundenadresse sind, aber Sie müssen sie auch an das Backend senden. Die Antwort auf diese Frage lautet:
Kommt drauf an . Sie können beispielsweise den folgenden Ansatz wählen: Hinzufügen eines benutzerdefinierten Formulars zur Checkout-Seite, die alle Ihre zusätzlichen Felder enthält
(like comment, invoice request etc)
, Hinzufügen einer JS-Logik, die dieses Formular basierend auf einigen Ereignissen verarbeitet, und Bereitstellen eines benutzerdefinierten Diensts, der die Daten vom Frontend und vom Store empfängt es irgendwo für die zukünftige Verwendung.Die gesamte offizielle Dokumentation zum Checkout finden Sie unter http://devdocs.magento.com/guides/v2.1/howdoi/checkout/checkout_overview.html . Der Begriff statisch bezieht sich auf Formulare, bei denen alle Felder bereits bekannt / vordefiniert sind (zum Beispiel: Formular enthält immer 2 Textfelder mit vordefinierten Bezeichnungen) und kann aufgrund einiger Einstellungen im Backend nicht geändert werden.
Solche Formulare können mit deklariert werden
layout XML configuration
. Andererseits bezieht sich der Begriff "dynamisch" auf Formulare, deren Feldsatz sich ändern kann (zum Beispiel: Checkout-Formulare können je nach Konfigurationseinstellungen mehr oder weniger Felder enthalten).In diesem Fall können Sie ein solches Formular nur mit dem
LayoutProcessor
Plugin deklarieren .:) Magento versucht, so viele Anwendungsfälle wie möglich abzudecken, die für die Händler bei der Verwendung / Anpassung von Magento von Bedeutung sein können. Dies führt manchmal zu Situationen, in denen einige einfache Anwendungsfälle komplexer werden.
Hoffe das hilft.
=============================================== ======================
OK ... Lass uns Code schreiben;)
========
Wie bereits erwähnt, wird Ihr Feld der
customAttributes
Eigenschaft des JS-Adressobjekts hinzugefügt . Diese Eigenschaft enthält benutzerdefinierte EAV-Adressattribute und ist\Magento\Quote\Model\Quote\Address\CustomAttributeListInterface::getAttributes
methodenbezogen.Der obige Code behandelt automatisch die Persistenz des lokalen Speichers im Frontend. Sie können Ihren Feldwert über
checkoutData.getShippingAddressFromData()
(wherecheckoutData
isMagento_Checkout/js/checkout-data
) aus dem lokalen Speicher abrufen .========
========
Dadurch wird dem Adressmodell auf der Back-End-Seite ein Erweiterungsattribut hinzugefügt. Erweiterungsattribute sind einer der von Magento bereitgestellten Erweiterungspunkte. Um auf Ihre Daten im Backend zuzugreifen, können Sie Folgendes verwenden:
Hoffe, das hilft und wird in die offizielle Dokumentation aufgenommen.
quelle
custom_attributes
, aber es funktioniert nicht für mich. So sieht ein Teil von LayoutProcessor.php aus - gist.github.com/Igloczek/eaf4d2d7a0a04bd950110296ec3f7727 Abershipping-info
oder sogar localStoragecheckout-data
enthält diese Daten überhaupt nicht.Nach meiner Erfahrung verwendet m2 XML, um Komponenten wie Felder usw. zu definieren. Dies erleichtert das Debuggen und die Interaktion mit Daten. Auf Front-Ender-Feldern sollten Sie versuchen, Checkout-Vorlagen zu überschreiben und dort Ihre eigenen benutzerdefinierten Felder hinzuzufügen. Mit KO können Sie Daten vom Frontend und Backend bearbeiten und binden
quelle