Я спробую відповісти на ваше питання.
Ні . Це не правильний спосіб додавання спеціальних атрибутів до форми адреси доставки. Вам не потрібно редагувати new-customer-address.js
. Дійсно, цей JS-файл містить перелік усіх попередньо визначених атрибутів адреси та відповідає відповідному інтерфейсу резервного інтерфейсу, \Magento\Quote\Api\Data\AddressInterface
але Magento надає можливість передавати будь-які власні атрибути до бекенду без зміни компонентів бекенд / фронтенд .
Згаданий компонент JS має customAttributes
властивість. Ваші власні атрибути будуть автоматично оброблятися, якщо їх $dataScopePrefix
є ' shippindAddress.custom_attributes
'.
Якщо я правильно зрозумів ваше запитання, у вас є дані, які не є частиною адреси клієнта, але вам також потрібно надіслати їх у бекенд. Відповідь на це питання:
Це залежить . Наприклад, ви можете обрати наступний підхід: додати користувальницьку форму на сторінку оформлення замовлення, що включає всі ваші додаткові поля (like comment, invoice request etc)
, додати логіку JS, яка буде обробляти цю форму на основі деяких подій, та надати користувальницьку службу, яка отримуватиме дані з фронтену та зберігатиме це десь для подальшого використання.
Вся офіційна документація, що стосується оформлення замовлення, розміщена на веб- сайті http://devdocs.magento.com/guides/v2.1/howdoi/checkout/checkout_overview.html . Термін статичний відноситься до форм, де всі поля вже відомі / визначені (наприклад: форма завжди матиме 2 текстові поля з попередньо визначеними мітками) і не може змінюватися на основі деяких налаштувань у бекенді.
Такі форми можна оголосити за допомогою layout XML configuration
. З іншого боку, термін "динамічний" відноситься до форм , набір полів яких може змінюватися (наприклад: форма оформлення замовлення може мати більше / менше полів на основі налаштувань конфігурації).
У цьому випадку єдиним способом оголосити таку форму є використання LayoutProcessor
плагіна.
:) Magento намагається охопити якомога більше випадків використання, які можуть бути значущими для продавців під час використання / налаштування Magento. Іноді це призводить до ситуації, коли деякі прості випадки використання стають складнішими.
Сподіваюся, це допомагає.
===================================================== ========================
Добре ... Дозволяє написати якийсь код;)
- PHP-код, який вставляє додаткове поле в LayoutProcessor
========
/**
* @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;
Як я вже згадував, це додасть вашого поля до customAttributes
властивості об’єкта JS адреси. Це властивість було розроблено, щоб містити власні атрибути EAV-адреси та пов'язане з \Magento\Quote\Model\Quote\Address\CustomAttributeListInterface::getAttributes
методом.
Код, наведений вище, автоматично обробляє збереження локальної пам’яті на фронті. Значення поля можна отримати з локального сховища, використовуючи checkoutData.getShippingAddressFromData()
(де checkoutData
є Magento_Checkout/js/checkout-data
).
- Додайте mixin, щоб змінити поведінку "Magento_Checkout / js / action / set-shipping-information" (цей компонент відповідає за подання даних між кроками доставки та оформлення рахунків)
========
2.1. Створітьyour_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. Створіть своє ім’я_модуля / view / frontend / web / js / action / set-shipping-information-mixin.js
/**
* @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();
});
};
});
- Створіть своє ім’я_модуля / etc / extension_attributes.xml
========
<?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>
Це додасть атрибут розширення до моделі адреси на стороні бекенда. Атрибути розширення - одна з точок розширення, яку надає Magento. Для доступу до своїх даних у бекенді ви можете використовувати:
// Magento will generate interface that includes your custom attribute
$value = $address->getExtensionAttributes()->getCustomField();
Сподіваюся, це допоможе і буде додано до офіційної документації.