마 젠토 2-체크 아웃 할 사용자 정의 필드를 추가 한 후 보내는 방법


49

모든 튜토리얼은 필드 추가 만 다루지 만이 파일의 값 저장은 #mindblown으로 건너 뜁니다. 왜 필드 나 양식을 추가하는 것이 가장 중요한지 모르겠습니다.

나는 Magento docs 를 따르려고 노력 했지만 ...

테스트 목적으로 배송 주소에 다른 필드를 추가하려고합니다. 사용자 지정 범위, 사용자 지정 데이터 세트, 사용자 지정 데이터 공급자 및 기타 문서화되지 않은 내용은 무시하기 쉽습니다.

나는 그 형태가 "정적"또는 "동적"이라는 것이 무엇인지 전혀 모른다. 나를 위해 모든 체크 아웃 양식은 KnockoutJS 템플릿 위에 동적으로 작성되지만 "정적"방법을 시도하면 여기에 입력을 추가 할 수 있습니다 (정적 양식인지 여부).

먼저 녹아웃 옵저버 블이 왜 데이터를 파싱하고 보내는 동안 필드를 무시하는지 디버깅하려고합니다. 필드에 빈 name매개 변수가 있지만이 문제를 해결하는 방법을 관리 할 수 ​​없습니다. IMO가를 통해 UI 구성 요소 렌더러에 전달해야합니다 inputName같은 다른 옵션으로 매개 변수, 동일 disabled, placeholder등 (다른 매개 변수가 잘 작동, 나는 구성 체크 아웃 모듈 초기화 내 XML에서 발생하고 나를 좋아 보인다 확인)

두 번째로 플러그인을 만들고 LayoutProcessor정확히 동일한 데이터를 전달할 때 "동적"방법을 사용하려고했지만 ...이있는 필드가 name있지만 여전히 전송이 전혀 작동하지 않습니다.

JS를 파고 들었을 때이 요청 준비가 module-checkout/view/frontend/web/js/model/shipping-save-processor/default.js파일 로 유지된다는 것을 알았 module-checkout/view/frontend/web/js/model/quote.js습니다 .Knockout Observable이 정의 / 생성되는 위치에 따라 다릅니다 .

어떻게 든 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 백엔드는 인식하지 못합니다 ... (내가 백엔드 개발자가 아닙니다)

그래서 여기 내 질문이 온다 :

  • 이 유형의 사용자 정의를 처리하는 올바른 방법입니까? (b / c는 나에게 이상해 보인다)
  • 새 주소와 관련이없는 필드 값을 보내는 방법은 무엇입니까? 어디에서나 비슷한 구성을 보지 못했습니다. 제 경우에는 주문 의견 (텍스트 영역)과 송장 요청 (확인란)을 보내려고합니다. 둘 다 주소로 저장되어서는 안됩니다. b / c 일부 사용자는 나중에 사용하기 위해이 주소를 저장하고 싶을 수도 있습니다.
  • "정적"및 "동적"양식 또는 일부 예제 / 비교에 대한 문서가 있습니까? 이런 식으로 생각할 가치가 있습니까?

추가 실존 질문 :

  • 이것이 왜 일관성이 없는가? XML / PHP 파일에 수많은 매개 변수를 정의해야하는 이유는 무엇이며 Magento는 입력 만 렌더링 할 수 있고 모든 것을 자체적으로 처리해야합니까?

3
Magento Devdocs는 최근 UI 구성 요소 사용에 관한 몇 가지 새로운 문서를 추가했습니다. 우리는 실제로 완전히 새로운 가이드를 작성하는 중이지만 아직 갈 길이 있습니다. 살펴 보시기 바랍니다 devdocs.magento.com/guides/v2.1/ui_comp_guide/bk-ui_comps.html을 . 불행히도, 우리는 데이터 소스에 관한 주제를 아직 완성하지 못했습니다. UI 구성 요소를 사용하는 구성 흐름에 대한 주제가 있습니다. 더 많은 답변을 찾기 위해 노력할 것입니다.
tanberry

결제에 간단한 필드를 추가하는 것이 악몽이어야하는 이유는 무엇입니까? 나는 이해할 수 없다. 그리고 거의 모든 것이 그렇게 어렵습니다
슬레이어 블래스트

@slayerbleast World는 서버 측 렌더링이 죽어 가고 있습니다. 따라서 이유가 없으면 어렵지 않습니다.
igloczek 2016 년

답변:


55

나는 당신의 질문에 대답하려고 노력할 것입니다.

  1. 없음 . 이는 운송 주소 양식에 사용자 정의 속성을 추가하는 올바른 방법이 아닙니다. 편집 할 필요는 없습니다 new-customer-address.js. 실제로이 JS 파일은 모든 사전 정의 된 주소 속성을 나열하고 해당 백엔드 인터페이스와 일치 \Magento\Quote\Api\Data\AddressInterface하지만 Magento는 백엔드 / 프론트 엔드 구성 요소를 수정하지 않고 모든 사용자 정의 속성을 백엔드에 전달하는 기능을 제공합니다 .

    언급 된 JS 컴포넌트에는 customAttributes특성 이 있습니다. $dataScopePrefix' shippindAddress.custom_attributes'인 경우 사용자 정의 속성이 자동으로 처리됩니다 .

  2. 질문을 올바르게 이해했다면 고객 주소의 일부가 아닌 백엔드에도 데이터를 보내야합니다. 이 질문에 대한 답은 다음과 같습니다.

    그것은 달려있다 . 예를 들어, 다음과 같은 접근 방식을 선택할 수 있습니다. 모든 추가 필드를 포함하는 체크 아웃 페이지에 사용자 정의 양식 추가 (like comment, invoice request etc) , 일부 이벤트를 기반으로이 양식을 처리 할 JS 논리 추가 및 프론트 엔드 및 상점에서 데이터를 수신하는 사용자 정의 서비스 제공 나중에 사용하기 위해 어딘가에.

  3. 결제와 관련된 모든 공식 문서는 http://devdocs.magento.com/guides/v2.1/howdoi/checkout/checkout_overview.html에 있습니다. static이라는 용어는 모든 필드가 이미 알려진 / 사전 정의 된 양식을 나타냅니다 (예 : 양식에는 항상 사전 정의 된 레이블이있는 두 개의 텍스트 필드가 있음). 백엔드의 일부 설정에 따라 변경할 수 없습니다.

    이러한 형식은을 사용하여 선언 할 수 있습니다 layout XML configuration. 반면, 동적이라는 용어 는 필드 세트가 변경 될 수있는 양식을 나타냅니다 (예 : 구성 설정에 따라 체크 아웃 양식에 더 많거나 적은 필드가있을 수 있음).

    이 경우 이러한 형식을 선언하는 유일한 방법은 LayoutProcessor플러그인 을 사용하는 것 입니다.

  4. :) Magento는 가능한 한 Magento 사용 / 사용자 지정 중에 판매자에게 중요한 가능한 사용 사례를 최대한 많이 다루려고합니다. 때로는 간단한 사용 사례가 더 복잡 해지는 상황이 발생할 수 있습니다.

도움이 되었기를 바랍니다.

===================================================== ========================

OK ... 코드를 작성할 수 있습니다.)

  1. LayoutProcessor에 추가 필드를 삽입하는 PHP 코드

========

/**
 * @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;

이미 언급했듯이 customAttributesJS 주소 객체의 속성에 필드가 추가됩니다 . 이 특성은 사용자 정의 EAV 주소 속성을 포함하도록 설계되었으며 \Magento\Quote\Model\Quote\Address\CustomAttributeListInterface::getAttributes메소드 와 관련이 있습니다.

위 코드는 프론트 엔드에서 로컬 스토리지 지속성을 자동으로 처리합니다. checkoutData.getShippingAddressFromData()(where checkoutDatais Magento_Checkout/js/checkout-data)를 사용하여 로컬 스토리지에서 필드 값을 얻을 수 있습니다 .

  1. 'Magento_Checkout / js / action / set-shipping-information'의 동작을 변경하려면 mixin을 추가하십시오 (이 구성 요소는 운송 및 청구 체크 아웃 단계 사이의 데이터 제출을 담당합니다)

========

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. your_module_name / 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();
        });
    };
});
  1. your_module_name / 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();

희망, 이것은 공식 문서에 도움이되고 추가 될 것입니다.


답변 알렉스 감사합니다! 나는 custom_attributes방법을 시도 했지만 그것은 효과가 없다. 이것은 LayoutProcessor.php`의 일부가 어떻게 보이는지-gist.github.com/Igloczek/eaf4d2d7a0a04bd950110296ec3f7727 그러나 shipping-info localStorage checkout-data에이 데이터가 전혀 포함되어 있지 않습니다.
igloczek

위의 업데이트 된 답변을 참조하십시오;)
aakimov

4
이 주제에 대한 공식 문서는 이미 사용 가능합니다! devdocs.magento.com/guides/v2.1/howdoi/checkout/…
Alex

1
주문에 대해 값을 저장하려면 추가 단계가 필요합니까?
Alex Hadley

정적 형식 인 경우 다음 예제와 같이 XML을 통해 LayoutProcessor에 필드를 삽입하는 것이 좋습니다. devdocs.magento.com/guides/v2.1/howdoi/checkout/…
cjohansson

-1

필자의 경험에 따르면 m2는 xml을 사용하여 필드 등의 구성 요소를 정의합니다. 디버깅과 데이터 상호 작용이보다 쉬워졌습니다. 프론트 엔드 필드에서는 체크 아웃 템플릿을 재정의하고 사용자 정의 필드를 추가해야합니다. KO를 사용하면 프런트 엔드 및 백엔드에서 데이터를 작업하고 바인딩 할 수 있습니다.


4
잘못된 조언입니다. b / c 결제 템플릿에는 수동으로 추가 한 입력 필드가 포함되어 있지 않아야합니다. 우리는 (모든 것이 UI 구성 요소를 사용하여 사례입니다) 선택된 영역에서 템플릿을 렌더링하기 KO를 사용해야합니다
igloczek

프론트 엔드에서 사용자 정의 필드 UI 구성 요소 추가의 예를 공유 할 수 있습니까?
mrtuvn

@igloczek가 말한 것처럼 체크 아웃 템플릿에는 수동으로 추가 된 입력 필드가 포함되어서는 안되므로 잘못된 조언입니다.
diazwatson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.