체크 아웃 단계 변경 중에 특성에 Magento \ Quote \ Api \ Data \ AddressInterface 클래스에 해당 설정자가 없습니다.


18

1-customer_address에 eav 속성을 추가합니다

$attributesInfo = [
    'reference' => [
         'label' => 'Reference',
         'type' => 'varchar',
         'input' => 'text',
         'position' => 100,
         'visible' => true,
         'required' => false,
    ],
];

foreach ($attributesInfo as $attributeCode => $attributeParams) {
    $customerSetup->addAttribute('customer_address', $attributeCode, $attributeParams);
}

2-모듈에 확장 속성을 추가했습니다

<extension_attributes for="Magento\Quote\Api\Data\AddressInterface">
    <attribute code="reference" type="string"/>
</extension_attributes>

requirejs-config.js에서 일부 자바 스크립트 파일을 재정 의하여 참조 필드를 추가합니다.

var config = {
"map": {
    "*": {
        "Magento_Checkout/js/model/shipping-save-processor/default" : "Agr_Checkout/js/shipping-save-processor-default-override",
        "Magento_Customer/js/model/customer/address" : "Agr_Checkout/js/model/customer/address",
        "Magento_Checkout/js/model/address-converter" : "Agr_Checkout/js/model/address-converter",
        "Magento_Checkout/js/model/new-customer-address" : "Agr_Checkout/js/model/new-customer-address"
    }
}

3-참조 필드가 주소로 전송되고 있음을 확인합니다

여기에 이미지 설명을 입력하십시오

4-배송 정보를 보내면 (다음 클릭)이 오류가 발생합니다. "속성"참조 "에"Magento \ Quote \ Api \ Data \ AddressInterface "클래스에 해당 설정자가 없습니다."

여기에 이미지 설명을 입력하십시오

이미 수행 한 작업 :-magento 캐시 정리 및 플러시-설정 실행 : 업그레이드-설정 실행 : di : 컴파일

내가 뭘 잘못하고 있니?


아래 답변이 효과가 있었습니까?
Stevie G

하드 SQL 삽입으로 해결하고 address_id와의 업데이트 de 참조를위한 스크립트를 실행했는데 잘못 알고 있지만 조금 서두르고 나중에 테스트하고 피드백을 줄 것입니다.
allamgr 2012 년

나는 당신이 비난받을 수 있다고 생각하지 않습니다 ... 분명히 Enterprise에서만 custom_attributes를 추가 할 수 있으며 지금 까지이 문제를 해결하기위한 "쉽게 사용자 정의 가능한 체크 아웃"을 찾지 못했습니다.
LM_Fielding 2016 년

관련 업데이트가 있습니까?
Magento2 Devloper

@allamgr 나는 또한 새로운 고객 주소 속성과 동일한 문제에 직면하고 있습니다. 이것에 대한 당신의 생각을 나에게 알려줄 수 있습니까? prnt.sc/iovkp2
나가라 주 K

답변:


1

eav 설정 또는 업그레이드 스크립트에서 속성을 설정하는 것이 가장 효과적이며 추가 요청 양식에 자동으로 추가됩니다.

    class InstallData implements InstallDataInterface
    {
        private $_eavSetupFactory;
        private $_eavConfig;
        private $_attributeResource;
        protected $_logger;

        public function __construct(EavSetupFactory $eavSetupFactory, Config $eavConfig, Attribute $attributeResource, Monolog $logger)
        {
            $this->_eavSetupFactory = $eavSetupFactory;
            $this->_eavConfig = $eavConfig;
            $this->_attributeResource = $attributeResource;
            $this->_logger = $logger;
        }

        public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
        {
            $eavSetup = $this->_eavSetupFactory->create(['setup' => $setup]);
            $addressAttributes = [
        'attribute1' => [
            'type' => 'int',
            'label' => 'attribute1',
            'input' => 'text',
            'unique' => true,
            'required' => false,
            'visible' => true,
            'user_defined' => false,
            'position' => 100,
            'system' => false,
            'adminhtml_only' => 0
        ],
        'attribute2' => [
            'type' => 'int',
            'label' => 'attribute2',
            'input' => 'text',
            'required' => false,
            'visible' => true,
            'user_defined' => false,
            'position' => 110,
            'system' => false,
            'adminhtml_only' => 1
        ]
    ];

    $usedInFormsAddress = [
            'adminhtml_customer_address',
            'customer_address_edit',
            'customer_register_address'
        ];

    foreach ($addressAttributes as $code => $options) {
        $eavSetup->addAttribute(
            'customer_address',
            $code,
            $options
        );

        try {
            $attribute = $this->_eavConfig->getAttribute('customer_address', $code);
            $attribute->setData(
                'used_in_forms',
                $usedInFormsAddress
            );
            $this->_attributeResource->save($attribute);
        } catch (LocalizedException $exception) {
            $this->_logger->critical($exception->getMessage());
        } catch (Exception $exception) {
            $this->_logger->critical($exception->getMessage());
        }
    }

여기에 이미지 설명을 입력하십시오

이 코드는 양식에 추가되며 저장하거나 다음 단계로 이동하는 데 아무런 문제가 없습니다.

$usedInFormsAddress = [
            'adminhtml_customer_address',
            'customer_address_edit',
            'customer_register_address'
        ];

try {
            $attribute = $this->_eavConfig->getAttribute('customer_address', $code);
            $attribute->setData(
                'used_in_forms',
                $usedInFormsAddress
            );
            $this->_attributeResource->save($attribute);
        } catch (LocalizedException $exception) {
            $this->_logger->critical($exception->getMessage());
        } catch (Exception $exception) {
            $this->_logger->critical($exception->getMessage());
        }

0

사용자 정의 속성을 통해 설정하십시오.

예:

...
 custom_attribute: [{"attribute_code": "reference", "value": "Your value"}]
...

이 작업을 수행 했습니까 아니면 실험 일 뿐입니 까?
LM_Fielding 2016 년

작동했습니다
Phoenix128_RiccardoT

커뮤니티 에디션으로? 당신이 방법을 보여줄 수 있다면 현상금으로도 대단히 감사하겠습니다.
LM_Fielding 2016 년

1
사용자 지정 분리 된 프런트 엔드 체크 아웃 절차에서 Magento2 Enterprise Edition과 함께 제공되었습니다. 해당 코드를 검색해야합니다. 오래된 작품입니다.
Phoenix128_RiccardoT 2016 년

당신이 그것을 발견하면 알려주십시오, 그러나 나는 그것이 가능하지 않다고 생각합니다.
LM_Fielding 2016 년

0

요청에서 속성을 어떻게 전달합니까? 당신은 그런 브라우저 콘솔을 확인할 수 있습니다

{
    ...
    extension_attributes: {
         reference: "value"
    }
}

맞습니다. var 폴더 및 생성 된 폴더 var / cache var / page_cache var / view_proceed 및 generated /를 제거 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.