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?

allamgr
quelle
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());
        }
djfordz
quelle
0

Versuchen Sie es mit benutzerdefinierten Attributen.

Beispiel:

...
 custom_attribute: [{"attribute_code": "reference", "value": "Your value"}]
...
Phoenix128_RiccardoT
quelle
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 .

Magento2 Entwickler
quelle