Comment mettre à jour l'adresse client à l'aide d'API personnalisé dans magento2?

8

J'ai créé une API personnalisée pour mettre à jour l'adresse client à l'aide de customer idou id d'adresse.

Ci-dessous le code que j'ai utilisé pour l'implémenter.

[Fournisseur] / [Module] /etc/webapi.xml

<route url="/V1/address/createUpdate" method="POST">
    <service class="[Vendor]\[Module]\Api\CustomAddressInterface" method="addressUpdate"/>
    <resources>
        <resource ref="anonymous"/>
    </resources>
</route>

[Fournisseur] / [Module] /Api/CustomAddressInterface.php

 <?php
  namespace [Vendor]\[Module]\Api;

  interface CustomAddressInterface
 {
/**
 * Returns greeting message to user
 *
 * @api
 * @param string $name Users name.
 * @return string Greeting message with users name.
 */
public function name($name);

/**
 * POST for attribute api
 * @param mixed $param
 * @return array
 */

 public function addressUpdate($params);

}

[Vendo] / [Module] /Model/Address.php

namespace [Vendor]\[Module]\Model;
use [Vendor]\[Module]\Api\CustomAddressInterface;
use Magento\Store\Model\StoreManagerInterface;

class Address implements CustomAddressInterface
{   
protected $_storeManager;
protected $addressFactory;
protected $addressRepository;
protected $customerRepository;
protected $_customer; 
public function __construct(
    \Magento\Framework\ObjectManagerInterface $objectManager,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Customer\Model\AddressFactory $addressFactory,
    \Magento\Customer\Api\AddressRepositoryInterface $addressRepository,
    \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
    \Magento\Customer\Model\Customer $customer
) {
    $this->_objectManager = $objectManager;
    $this->_storeManager = $storeManager;
    $this->_addressFactory = $addressFactory;
    $this->addressRepository = $addressRepository;
    $this->customerRepository = $customerRepository;
    $this->_customer = $customer;
}

/**
 * Returns greeting message to user
 *
 * @api
 * @param string $name Users name.
 * @return string Greeting message with users name.
 */
public function name($name) {
    return "Hello, " . $name;
}

public function addressUpdate($params) {

   public function addressUpdate($params) {
    //return 'Response: ' . json_encode($params);   
    $resultArr = array();
    $paramArr = array();
    $result =  json_encode($params);
    $resultSet = json_decode($result,true);

    $EntType = $resultSet['Entity_Type'];
    $customerId = $resultSet['Entity_Attributes']['CustomerId'];
    $AddressId = $resultSet['Entity_Attributes']['AddressId'];

    if(empty($customerId)){
        $resultArr['result'] = "Failed";
        $resultArr['message'] = "customerId shouldn't be empty!!!";
        $paramArr['Magento_ID'] = "";
        $paramArr['NAV_ID'] = "";
        $resultArr['parameters'] = $paramArr;
        echo json_encode($resultArr,JSON_PRETTY_PRINT);
        die;
    }else{  
        $address1 = $resultSet['Entity_Attributes']['Address'];         
        $address2 = $resultSet['Entity_Attributes']['Address2'];
        $City = $resultSet['Entity_Attributes']['City'];
        $County = $resultSet['Entity_Attributes']['County'];
        $PostCode = $resultSet['Entity_Attributes']['PostCode'];
        $PhoneNo = $resultSet['Entity_Attributes']['PhoneNo'];
        $Contact = $resultSet['Entity_Attributes']['Contact'];
        $MagentoDefault = $resultSet['Entity_Attributes']['MagentoDefault'];
        $Initials = $resultSet['Entity_Attributes']['Initials'];
        $FirstName = $resultSet['Entity_Attributes']['FirstName'];
        $Surname = $resultSet['Entity_Attributes']['Surname'];
        try{
            if(isset($AddressId) && $AddressId !=''){
                $address = $this->addressRepository->getById($AddressId);
                $address->setFirstname($FirstName);
                $address->setLastname($Surname);
                $address->setCountryId('GB');
                $address->setPostcode($PostCode);
                $address->setCity($City);
                $address->setPrefix($Initials);
                $address->setTelephone($PhoneNo);
                $this->addressRepository->save($address);
                $resultArr['message'] = "customer Address saved Sucessfully!!!";
                $paramArr['Address_Id'] = $addressId;
                $paramArr['NAV_ID'] = "";
                $resultArr['parameters'] = $paramArr;
                echo json_encode($resultArr,JSON_PRETTY_PRINT);
                die;
            }else{
                $customerObj = $this->_customer->load($customerId);
                $customerAddress = array();
                foreach($customerObj->getAddresses() as $address)
                {
                    $customerAddress[] = $address->toArray();
                }
                $addressId = $customerAddress[0]["entity_id"];
                if(isset($addressId) && $addressId != '' ){
                    $address = $this->addressRepository->getById($addressId);
                    $address->setFirstname($FirstName);
                    $address->setLastname($Surname);
                    $address->setCountryId('GB');
                    $address->setPostcode($PostCode);
                    $address->setCity($City);
                    $address->setPrefix($Initials);
                    $address->setTelephone($PhoneNo);
                    $this->addressRepository->save($address);
                    $resultArr['message'] = "customer Address saved Sucessfully!!!";
                    $paramArr['Address_Id'] = $addressId;
                    $paramArr['NAV_ID'] = "";
                    $resultArr['parameters'] = $paramArr;
                    echo json_encode($resultArr,JSON_PRETTY_PRINT);
                    die;
                }else{
                    $address = $this->_addressFactory->create();//->setStreet(Street)                   

                    $address->setCustomerId($customerId)
                        ->setFirstname($FirstName)
                        ->setLastname($Surname)
                        ->setCountryId('GB')
                        ->setPostcode($PostCode)
                        ->setCity($City)
                        ->setRegion($County)
                        ->setPrefix($Initials)
                        ->setStreet($address2)
                        ->setTelephone($PhoneNo)                    
                        ->setIsDefaultBilling('1')
                        ->setIsDefaultShipping('1')
                        ->setSaveInAddressBook('1');
                        $address->save();

                        $resultArr['message'] = "customer Address saved Sucessfully!!!";
                        $paramArr['Address_Id'] = $address->getId();
                        $paramArr['NAV_ID'] = "";
                        $resultArr['parameters'] = $paramArr;
                        echo json_encode($resultArr,JSON_PRETTY_PRINT);
                        die;
                    }                   

            }
        }
        catch(\Exception $e){
                $resultArr['result'] = "Failed";
                $resultArr['message'] = $e->getMessage();
                $paramArr['Magento_ID'] = '';
                $paramArr['NAV_ID'] = '';
                $resultArr['parameters'] = $paramArr;
        } 

        echo json_encode($resultArr,JSON_PRETTY_PRINT);
        die;
    }
}
}

Je dois mettre à jour l'adresse du client à l'aide de customerIdou addressId, comment cela peut-il être fait? si l'ID d'adresse n'existe pas, j'essaye d'obtenir l'addresId de customerId et la mise à jour sinon je crée une nouvelle adresse pour le client.

Voici ma demande json.

{
 "params": {
"Entity_Type": "Address",
"Entity_Attributes": {
  "Name": "test",
  "CustomerId": "46897",
  "AddressId":"0",
  "Address": "test",
  "Address2": "test",
  "City": "Craigavon",
  "County": "test",
  "PostCode": "BT65 5BE",
  "PhoneNo": "656565656565",
  "FirstName": "test",
  "Surname": "test"
   }
 }
}
jafar pinjar
la source

Réponses:

4

Vous devez appeler l'api ci-dessous pour la mise à jour de l'adresse client

API: xyz.com/rest/V1/customers/2

Entête:

Authorization :"Bearer ishamls4xu7pnwhlvup141502tjm3cl2"
Content-Type :"application/json"

Méthode: PUT

Paramètre:

{
    "id": 2,
    "group_id": 1,
    "default_billing": "1",
    "default_shipping": "2",
    "created_at": "2017-04-26 14:31:22",
    "updated_at": "2018-09-01 08:08:47",
    "created_in": "Default Store View",
    "email": "[email protected]",
    "firstname": "ABC",
    "lastname": "XYZ",
    "store_id": 1,
    "website_id": 1,
    "addresses": [
        {
            "id": 1,
            "customer_id": 2,
            "region": {
                "region_code": null,
                "region": null,
                "region_id": 0
            },
            "region_id": 0,
            "country_id": "MY",
            "street": [
                "No 545 Jalan balau 27/13",
                "sinar link Taman rinting"
            ],
            "company": "Mahnazfood",
            "telephone": "04040404040404",
            "fax": "01010101101010101",
            "postcode": "81750",
            "city": "Masai",
            "firstname": "ABC",
            "lastname": "XYZ",
            "default_billing": true
        },
        {
            "id": 2,
            "customer_id": 2,
            "region": {
                "region_code": null,
                "region": null,
                "region_id": 0
            },
            "region_id": 0,
            "country_id": "MY",
            "street": [
                "Colony#3 Block#126/F",
                "Address 2"
            ],
            "company": "Prashant",
            "telephone": "9999999999",
            "fax": "00000000000000",
            "postcode": "45000",
            "city": "Lahore",
            "firstname": "Test",
            "lastname": "Test",
            "default_shipping": true
        }
    ],
    "disable_auto_group_change": 0,
    "extension_attributes": {
        "is_subscribed": false
    }
}

Remarque: transmettez l'identifiant d'adresse dans le paramètre afin de mettre à jour l'adresse existante, si vous ne transmettez pas l'identifiant d'adresse dans le paramètre, cela créera une nouvelle adresse pour le client

Prashant Valanda
la source
3

vérifiez ci-dessous le code qui vous aide un peu

/**
 * @var \Magento\Customer\Api\CustomerRepositoryInterface
 */
protected $customerRepository;
protected $addressRepository;
protected $addressData;

/**
 * Sync constructor.
 * @param \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository
 */
public function __construct(
    \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
    \Magento\Customer\Api\AddressRepositoryInterface $addressRepository,
    \Magento\Customer\Api\Data\AddressInterface $addressData   
) {
    $this->_customerRepository = $customerRepository;
    $this->addressRepository = $addressRepository;
    $this->addressData  = $addressData;
}

public function changeAddress($customerId)
{
    /** @var \Magento\Customer\Api\Data\AddressInterface $address */
    $customer = $this->_customerRepository->getById($customerId);
    $customerAddress = array();

    $address1 = $resultSet['Entity_Attributes']['Address'];         
    $address2 = $resultSet['Entity_Attributes']['Address2'];
    $City = $resultSet['Entity_Attributes']['City'];
    $County = $resultSet['Entity_Attributes']['County'];
    $PostCode = $resultSet['Entity_Attributes']['PostCode'];
    $PhoneNo = $resultSet['Entity_Attributes']['PhoneNo'];
    $Contact = $resultSet['Entity_Attributes']['Contact'];
    $MagentoDefault = $resultSet['Entity_Attributes']['MagentoDefault'];

    $FirstName = $resultSet['Entity_Attributes']['FirstName'];
    $Surname = $resultSet['Entity_Attributes']['Surname'];


    $addressId = $resultSet['Entity_Attributes']['AddressId'];

    $address = $this->addressData;
    //$address->setCustomerId($customerId);
    if($addressId){
    $address->setId($addressId);  
    }
    $address->setFirstname($FirstName);
    $address->setLastname($Surname);
    $address->setCountryId('GB');
    $address->setPostcode($PostCode);
    $address->setCity($City);
    $address->setTelephone($PhoneNo);
    $address->setStreet($address1);
    $address->setSaveInAddressBook('1');
    // update what ever you want
    $this->addressRepository->save($address);
}
Murtuza Zabuawala
la source
$ addressId = $ resultSet ['Entity_Attributes'] ['CustomerId']; cette ligne n'est pas valide. pourquoi vous passez customerId à AddressId
jafar pinjar
dans ma demande customerId et AddressId sont tous les deux là, si addressId est passé, je devrais vérifier cet id d'adresse et mettre à jour, sinon en utilisant customerId, je dois vérifier s'il a addressId, mettre à jour avec cet id, sinon créer une nouvelle adresse pour le client, c'est mes exigences complètes
jafar pinjar
@jafarpinjar J'ai mis à jour le code avec addressId
Murtuza Zabuawala
salut @Murtuza, je pense que vous n'avez pas obtenu mon point, s'il vous plaît lire mon commentaire ci-dessus, si l'ID de l'adresse est passé dans la demande, je dois mettre à jour l'adresse pour cet identifiant, sinon je dois vérifier customerId et aller chercher son addressId et mettre à jour autre créez une nouvelle adresse pour ce customerId, votre code ne fonctionnera que si nous transmettons le bon addressId, si un identifiant d'adresse invalide ou une valeur vide est passé, cette fois-ci, cela ne fonctionne pas, je suppose
jafar pinjar
en quelque sorte, j'ai réussi à créer une adresse, mais setRegion lance une erreur.
jafar pinjar
3

Si vous connaissez l'adresse id $ addressId, vous pouvez utiliser le référentiel d'adresses pour charger et enregistrer les adresses mises à jour:

/**
 * @var \Magento\Customer\Api\CustomerRepositoryInterface
 */
protected $customerRepository;
protected $addressRepository;

/**
 * Sync constructor.
 * @param \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository
 */
public function __construct(
    \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
    \Magento\Customer\Api\AddressRepositoryInterface $addressRepository
) {
    $this->_customerRepository = $customerRepository;
    $this->addressRepository = $addressRepository;
}

public function changeAddress($customerId)
{
    /** @var \Magento\Customer\Api\Data\AddressInterface $address */
    //$customer = $this->_customerRepository->getById($customerId);

    $customerObj = $this->objectManager->create('Magento\Customer\Model\Customer')->load($customerId);
    $customerAddress = array();

    foreach ($customerObj->getAddresses() as $address)
    {
        $customerAddress[] = $address->toArray();
    }

    /*foreach ($customerAddress as $customerAddres) {

        echo $customerAddres['street'];
        echo $customerAddres['city'];
    }*/

    $addressId = $customerAddress[0]["entity_id"];

    //$addressId = $customer->getAddresses()->getId();
    $address = $this->addressRepository->getById($addressId);
    //$address->setCustomerId($customerId);
    $address->setFirstname('test');
    $address->setLastname('test');
    $address->setCountryId('GB');
    $address->setPostcode('BH 1BD');
    $address->setCity('Test');
    $address->setTelephone('');
    $address->setStreet('');
    //$address->setSaveInAddressBook('1');
    // update what ever you want
    $this->addressRepository->save($address);
}
Aasim Goriya
la source
Comment pouvons-nous le mettre à jour en utilisant customerId? Je recherche un code avec un identifiant client.
jafar pinjar
vérifier mon code mis à jour, pour changer l'adresse par identifiant client
Aasim Goriya
vous n'injectez pas _customerRepository, et pouvez-vous mettre à jour le code pour vérifier si le client a une adresse que je dois mettre à jour sinon je dois créer une nouvelle adresse.
jafar pinjar
$ address-> setCustomerId ($ customerId); génère une erreur, erreur non interceptée: appel à une fonction membre setCustomerId ()
jafar pinjar
pouvez-vous me mettre à jour le code correct s'il vous plaît.
jafar pinjar
0

Je viens de créer un nouveau module mais sans propres interfaces et modèles d'api. Au lieu de cela, j'utilise ceux par défaut de magnento-customer.

Cela pourrait être une alternative simple.

Voir https://magento.stackexchange.com/a/297701/15114

ahe_borriglione
la source