Все учебники охватывают только добавление полей, но при сохранении значения этих полей пропускается #mindblown. Я не знаю почему, это самая важная часть добавления любого поля или формы.
Я пытался следовать документации Magento , но ... это отстой.
В целях тестирования я пытаюсь добавить другие поля к адресу доставки, просто игнорируя настраиваемые области, настраиваемые наборы данных, настраиваемые поставщики данных и другие недокументированные вещи, что выглядит слишком странно для меня.
Я понятия не имею, что означает, что форма "статическая" или "динамическая". Для меня все формы оформления заказа динамически строятся поверх шаблонов KnockoutJS, но ... когда я пытаюсь "статичным" способом, я могу добавить сюда входные данные (так что это статическая форма или нет?).
Сначала я пытаюсь выяснить, почему наблюдаемые объекты Knockout просто игнорируют мои поля во время анализа и отправки данных. Я обнаружил, что в моих полях есть пустой name
параметр, но я не могу найти способ исправить эту проблему. IMO, он должен быть передан компоненту рендеринга UI через inputName
параметр, так же как и любые другие параметры, такие как disabled
и placeholder
т.д.
Во-вторых, я попытался использовать «динамический» способ создания плагина с LayoutProcessor
передачей точно таких же данных ... и теперь у меня есть поля с name
s, но отправка по-прежнему не работает вообще.
После изучения JS я обнаружил, что подготовка этого запроса ведется в module-checkout/view/frontend/web/js/model/shipping-save-processor/default.js
файле, который зависит от того, module-checkout/view/frontend/web/js/model/quote.js
где определены / созданы наблюдаемые Knockout.
Каким-то образом module-checkout/view/frontend/web/js/model/address-converter.js
обновляются эти наблюдаемые и зависит от того module-checkout/view/frontend/web/js/model/new-customer-address.js
, где я наконец-то нашел несколько интересных вариантов конфигурации - список всех полей адреса.
Когда я добавляю свои поля сюда, скрипты начинают анализировать и отправлять их, OFC я получаю 500, бэкэнд не распознает их ... (не спрашивайте, я не бэкенд-разработчик)
Итак, вот мои вопросы:
- Это правильный способ справиться с этим типом настройки? (B / C выглядит странно для меня)
- Как отправить значения полей, не связанных с новыми адресами? Я не видел подобной конфигурации нигде. В моем случае я хотел бы отправить комментарий заказа (textarea) и запрос счета (флажок). Оба не должны быть сохранены как адреса, т.к. некоторые пользователи могут захотеть сохранить этот адрес для будущего использования.
- Есть ли документация о «статических» и «динамических» формах или некоторые примеры / сравнения? Стоит думать об этом так?
Дополнительный экзистенциальный вопрос:
- Почему это так противоречиво? Почему я должен определить тонны параметров в файлах XML / PHP, в то время как Magento вообще может только визуализировать входные данные, а затем я должен обрабатывать все самостоятельно?
источник
Ответы:
Я постараюсь ответить на ваш вопрос (ы).
Нет . Это неправильный способ добавления пользовательских атрибутов в форму адреса доставки. Вам не нужно редактировать
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. Иногда это приводит к ситуации, когда некоторые простые варианты использования становятся более сложными.
Надеюсь это поможет.
================================================== =======================
ОК ... Давайте напишем код;)
========
Как я уже упоминал, это добавит ваше поле к
customAttributes
свойству объекта адреса JS. Это свойство было разработано, чтобы содержать пользовательские атрибуты адресов EAV и связано с\Magento\Quote\Model\Quote\Address\CustomAttributeListInterface::getAttributes
методом.Приведенный выше код автоматически обрабатывает постоянство локального хранилища на веб-интерфейсе. Вы можете получить значение поля из локального хранилища, используя
checkoutData.getShippingAddressFromData()
(гдеcheckoutData
естьMagento_Checkout/js/checkout-data
).========
========
Это добавит атрибут расширения к модели адреса на стороне сервера. Атрибуты расширения являются одной из точек расширения, которые предоставляет Magento. Для доступа к вашим данным на бэкэнде вы можете использовать:
Надеюсь, это поможет и будет добавлено в официальную документацию.
источник
custom_attributes
, но у меня это не работает. Вот так выглядит часть LayoutProcessor.php` - gist.github.com/Igloczek/eaf4d2d7a0a04bd950110296ec3f7727 Ноshipping-info
или даже localStoragecheckout-data
вообще не содержит этих данных.По моему опыту, m2 использует xml для определения таких компонентов, как поля и т. Д. Это помогает при отладке, упрощает взаимодействие с данными. В поле front-enders вы должны попытаться переопределить шаблоны оформления заказа и добавить туда свои собственные поля. С помощью KO вы сможете работать и связывать данные из внешнего интерфейса и внутреннего интерфейса.
источник