Sorularınıza cevap vermeye çalışacağım.
Hayır . Bu, gönderim adres formuna özel özellikler eklemenin doğru bir yolu değildir. Düzenlemenize gerek yok new-customer-address.js
. Aslında, bu JS dosyası önceden tanımlanmış tüm adres niteliklerini listeler ve karşılık gelen arka uç arabirimiyle eşleşir, \Magento\Quote\Api\Data\AddressInterface
ancak Magento, arka uç / ön uç bileşenlerinde değişiklik yapmadan arka uç için herhangi bir özel özelliği geçirme yeteneği sağlar .
Bahsedilen JS bileşeni customAttributes
özelliğe sahiptir . Özel nitelikleriniz $dataScopePrefix
' shippindAddress.custom_attributes
' ise otomatik olarak ele alınacaktır .
Sorunuzu doğru anladıysam, müşteri adresinin bir parçası olmayan verileriniz var ancak aynı zamanda arka uç için de göndermeniz gerekiyor. Bu sorunun cevabı:
Bağlıdır . Örneğin, aşağıdaki yaklaşımı seçebilirsiniz: tüm ek alanlarınızı içeren ödeme sayfasına özel form (like comment, invoice request etc)
ekleyin, bu olayları bazı olaylara göre işleyecek JS mantığı ekleyin ve verileri ön uçtan ve depodan alacak özel bir hizmet verin gelecekteki kullanım için bir yerde.
Ödeme ile ilgili tüm resmi belgeler http://devdocs.magento.com/guides/v2.1/howdoi/checkout/checkout_overview.html adresinde bulunur . Statik terimi, tüm alanların önceden bilindiği / önceden tanımlandığı formları ifade eder (örneğin: form her zaman önceden tanımlanmış etiketleri olan 2 metin alanına sahip olur) ve arka uçtaki bazı ayarlara göre değiştirilemez.
Bu tür formlar kullanılarak ilan edilebilir layout XML configuration
. Diğer taraftan, dinamik terimi , alan kümesi değişebilen formları ifade eder (örneğin: ödeme formu, yapılandırma ayarlarına bağlı olarak daha fazla / daha az alana sahip olabilir).
Bu durumda, böyle bir formu beyan etmenin tek yolu LayoutProcessor
eklenti kullanmaktır .
:) Magento, Magento kullanımı / kişiselleştirmesi sırasında tüccarlar için mümkün olduğunca önemli olabilecek kullanım durumlarını mümkün olduğunca karşılamaya çalışır. Bazen, bazı basit kullanım durumları daha karmaşık hale geldiğinde bu duruma yol açar.
Bu yardımcı olur umarım.
================================================== =======================
Tamam ... Hadi biraz kod yazalım;)
- LayoutProcessor'a ek alan ekleyen PHP kodu
========
/**
* @author aakimov
*/
$customAttributeCode = 'custom_field';
$customField = [
'component' => 'Magento_Ui/js/form/element/abstract',
'config' => [
// customScope is used to group elements within a single form (e.g. they can be validated separately)
'customScope' => 'shippingAddress.custom_attributes',
'customEntry' => null,
'template' => 'ui/form/field',
'elementTmpl' => 'ui/form/element/input',
'tooltip' => [
'description' => 'Yes, this works. I tested it. Sacrificed my lunch break but verified this approach.',
],
],
'dataScope' => 'shippingAddress.custom_attributes' . '.' . $customAttributeCode,
'label' => 'Custom Attribute',
'provider' => 'checkoutProvider',
'sortOrder' => 0,
'validation' => [
'required-entry' => true
],
'options' => [],
'filterBy' => null,
'customEntry' => null,
'visible' => true,
];
$jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']['shippingAddress']['children']['shipping-address-fieldset']['children'][$customAttributeCode] = $customField;
return $jsLayout;
Daha önce de bahsettiğim gibi, bu sizin alanınızı customAttributes
JS adres nesnesinin özelliğine ekleyecektir . Bu özellik, özel EAV adres özellikleri içerecek şekilde tasarlanmıştır ve \Magento\Quote\Model\Quote\Address\CustomAttributeListInterface::getAttributes
yöntemle ilgilidir.
Yukarıdaki kod, ön depolamadaki yerel depolama kalıcılığını otomatik olarak işler. Sen kullanarak yerel depolama adresinin alan değeri alabilirsiniz checkoutData.getShippingAddressFromData()
(burada checkoutData
olduğu Magento_Checkout/js/checkout-data
).
- 'Magento_Checkout / js / action / set-shipping-information' davranışını değiştirmek için mixin ekleyin (bu bileşen nakliye ve fatura ödeme adımları arasındaki veri gönderiminden sorumludur)
========
2.1. Yaratmak, yapmak, tasarlamak, üretmekyour_module_name/view/frontend/requirejs-config.js
/**
* @author aakimov
*/
var config = {
config: {
mixins: {
'Magento_Checkout/js/action/set-shipping-information': {
'<your_module_name>/js/action/set-shipping-information-mixin': true
}
}
}
};
2.2. Your_module_name / view / frontend / web / js / action / set-shipping-bilgi-mixin.js dosyasını oluşturun
/**
* @author aakimov
*/
/*jshint browser:true jquery:true*/
/*global alert*/
define([
'jquery',
'mage/utils/wrapper',
'Magento_Checkout/js/model/quote'
], function ($, wrapper, quote) {
'use strict';
return function (setShippingInformationAction) {
return wrapper.wrap(setShippingInformationAction, function (originalAction) {
var shippingAddress = quote.shippingAddress();
if (shippingAddress['extension_attributes'] === undefined) {
shippingAddress['extension_attributes'] = {};
}
// you can extract value of extension attribute from any place (in this example I use customAttributes approach)
shippingAddress['extension_attributes']['custom_field'] = shippingAddress.customAttributes['custom_field'];
// pass execution to original action ('Magento_Checkout/js/action/set-shipping-information')
return originalAction();
});
};
});
- Your_module_name / etc / extension_attributes.xml dosyasını oluşturun
========
<?xml version="1.0"?>
<!--
/**
* @author aakimov
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Quote\Api\Data\AddressInterface">
<attribute code="custom_field" type="string" />
</extension_attributes>
</config>
Bu, arka uç tarafındaki adres modeline bir uzantı niteliği ekleyecektir. Uzatma özellikleri, Magento'nun sunduğu uzatma noktalarından biridir. Arka uçtaki verilerinize erişmek için şunları kullanabilirsiniz:
// Magento will generate interface that includes your custom attribute
$value = $address->getExtensionAttributes()->getCustomField();
Umarım, bu yardımcı olur ve resmi belgelere eklenecektir.