La propriété n'a pas de setter correspondant dans la classe Magento \ Quote \ Api \ Data \ AddressInterface lors de l'étape de retrait de la modification

18

1 - J'ajoute un attribut eav à customer_address

$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 - J'ai ajouté l'attribut d'extension dans mon module

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

Dans mon requirejs-config.js, je remplace un fichier javascript pour ajouter un champ de référence

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 - Je confirme que le champ de référence envoie une adresse

entrez la description de l'image ici

4 - Lorsque j'envoie mes informations d'expédition (cliquez sur Suivant), j'obtiens cette erreur: "Property" Reference "n'a pas de setter correspondant dans la classe" Magento \ Quote \ Api \ Data \ AddressInterface "."

entrez la description de l'image ici

Je fais déjà: - Nettoyer et vider le cache magento - Exécuter la configuration: mise à niveau - Exécuter la configuration: di: compiler

Qu'est-ce que je fais mal?

allamgr
la source
La réponse ci-dessous a-t-elle fonctionné?
Stevie G
J'ai résolu par une insertion SQL difficile, en exécutant un script de mise à jour de référence avec l'adresse_id, je sais que c'est faux mais j'étais un peu pressé, je vais tester et vous donner un retour plus tard.
allamgr
Je ne pense pas que vous puissiez être blâmé ... apparemment, vous ne pouvez ajouter que custom_attributes dans Enterprise et jusqu'à présent je n'ai trouvé aucun moyen de "checkout facilement personnalisable".
LM_Fielding
toute mise à jour concernant?
Magento2 Devloper
@allamgr Je suis également confronté au même problème avec le nouvel attribut d'adresse client. Avez-vous obtenu une solution pour cela? pouvez-vous me faire part de vos réflexions à ce sujet. prnt.sc/iovkp2
Nagaraju K

Réponses:

1

La configuration des attributs dans un script de configuration ou de mise à niveau d'eav fonctionne mieux et s'ajoutera automatiquement aux formulaires auxquels vous souhaitez l'ajouter.

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

entrez la description de l'image ici

Ce code s'ajoutera ici aux formulaires et il n'y aura aucun problème d'enregistrement ou de passer à l'étape suivante

$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
la source
0

Essayez de le définir via des attributs personnalisés.

Exemple:

...
 custom_attribute: [{"attribute_code": "reference", "value": "Your value"}]
...
Phoenix128_RiccardoT
la source
Avez-vous déjà réussi à le faire fonctionner ou s'agit-il seulement d'une expérience?
LM_Fielding
Je l'ai fait fonctionner
Phoenix128_RiccardoT
Avec l'édition communautaire? Je l'apprécierais grandement, même avec générosité si vous pouviez démontrer comment.
LM_Fielding
1
C'était avec Magento2 Enterprise Edition sur une procédure de paiement frontend détachée personnalisée. Je dois rechercher ce code. C'est un vieux travail.
Phoenix128_RiccardoT
Veuillez me montrer si vous le trouvez, mais je ne pense pas qu'il soit disponible.
LM_Fielding
0

comment passez-vous l'attribut dans la demande? vous pouvez vérifier la console du navigateur comme ça

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

C'est correct. Vous pouvez supprimer le dossier var et le dossier généré var / cache var / page_cache var / view_proceed et généré / .

Magento2 Devloper
la source