Die Eigenschaft hat keinen entsprechenden Setter in der Klasse Magento \ Quote \ Api \ Data \ AddressInterface, während der Checkout-Schritt geändert wird


18

1 - Ich füge ein eav-Attribut zu customer_address hinzu

$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 - Ich habe das Erweiterungsattribut in meinem Modul hinzugefügt

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

In meiner requirejs-config.js überschreibe ich eine Javascript-Datei, um ein Referenzfeld hinzuzufügen

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 - Ich bestätige, dass das Referenzfeld eine Adresse sendet

Bildbeschreibung hier eingeben

4 - Wenn ich meine Versandinformationen sende (Klicken Sie auf Weiter), wird der folgende Fehler angezeigt : "Die Eigenschaft" Referenz "verfügt nicht über einen entsprechenden Setter in der Klasse" Magento \ Quote \ Api \ Data \ AddressInterface "."

Bildbeschreibung hier eingeben

Ich mache bereits: - Magento-Cache leeren und leeren - Setup ausführen: Upgrade - Setup ausführen: di: compile

Was mache ich falsch?


Hat die Antwort unten funktioniert?
— Stevie G

Ich habe das Problem durch hartes Einfügen von SQL gelöst, indem ich ein Skript zum Aktualisieren der Referenz mit der address_id ausführte. Ich weiß, dass es falsch ist, aber ich war ein wenig überstürzt. Ich werde es testen und Ihnen später eine Rückmeldung geben.
— Allamgr

Ich glaube nicht, dass Sie dafür verantwortlich gemacht werden können ... anscheinend können Sie in Enterprise nur custom_attributes hinzufügen, und bisher habe ich keinen Weg gefunden, dies zu umgehen.
— LM_Fielding

Irgendwelche Updates bezüglich?
— Magento2 Devloper

@allamgr Ich stehe auch vor dem gleichen Problem mit dem neuen Kundenadressattribut. Hast du eine Lösung dafür bekommen? Kannst du mir deine Gedanken dazu mitteilen? prnt.sc/iovkp2
— Nagaraju K

Antworten:


1

Das Einrichten von Attributen in einem eav-Setup- oder -Upgrade-Skript funktioniert am besten und wird automatisch zu Formularen hinzugefügt, zu denen Sie es hinzufügen möchten.

    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());
        }
    }

Bildbeschreibung hier eingeben

Dieser Code hier wird zu den Formularen hinzugefügt und es wird kein Problem beim Speichern oder Weiterleiten an den nächsten Schritt geben

$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

Versuchen Sie es mit benutzerdefinierten Attributen.

Beispiel:

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

Hast du das jemals zum Laufen gebracht oder ist es nur ein Experiment?
— LM_Fielding

Ich habe es zum
— Laufen gebracht

Mit Community Edition? Ich würde es sehr schätzen, auch mit Kopfgeld, wenn Sie demonstrieren könnten, wie.
— LM_Fielding

1
Es war mit Magento2 Enterprise Edition auf einem benutzerdefinierten, getrennten Frontend-Checkout-Verfahren. Ich muss diesen Code durchsuchen. Es ist eine alte Arbeit.
— Phoenix128_RiccardoT

Bitte zeigen Sie mir, wenn Sie es finden, aber ich glaube nicht, dass es verfügbar ist.
— LM_Fielding

0

Wie übergeben Sie das Attribut in der Anfrage? Sie können die Browserkonsole so überprüfen

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

Es ist richtig. Sie können den var-Ordner und den generierten Ordner var / cache var / page_cache var / view_proceed und generated / entfernen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.