Как обновить адрес клиента, используя пользовательский Api в magento2?


8

Я создал пользовательский API для обновления адреса клиента с помощью customer idили идентификатора адреса.

Ниже код, который я использовал для его реализации.

[Продавец] / [Модуль] /etc/webapi.xml

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

[Продавец] / [Модуль] /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] / [Модуль] /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;
    }
}
}

Мне нужно обновить адрес клиента с помощью customerIdили addressId, Как это можно сделать? если идентификатор адреса не существует, я пытаюсь получить addresId из customerId и обновлять, иначе я создаю новый адрес для клиента.

Вот моя просьба 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"
   }
 }
}

Ответы:


4

Вам нужно позвонить ниже API для обновления адреса клиента

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

Заголовок:

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

Метод: PUT

Параметр:

{
    "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": "abc@xyz.com",
    "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
    }
}

Примечание. Передайте идентификатор адреса в параметре, чтобы он обновлял существующий адрес, если вы не передали идентификатор адреса в параметре, он создаст новый адрес для клиента.


3

проверьте ниже код, который поможет вам несколько

/**
 * @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);
}

$ addressId = $ resultSet ['Entity_Attributes'] ['CustomerId']; эта строка недействительна. почему вы передаете customerId в AddressId
Джафар Пинджар

в моем запросе customerId и AddressId оба есть, если addressId передан, должен проверить этот адрес и обновить, в противном случае с помощью customerId мне нужно проверить, есть ли у него addressId, обновить с этим идентификатором, иначе создать новый адрес для клиента, это мое полное требование
Джафар Пинджар

@jafarpinjar Я обновил код с addressId
Муртуза Забуавала

привет @Murtuza, я думаю, вы не поняли мою точку зрения. Пожалуйста, прочитайте мой комментарий выше, если идентификатор адреса передан в запросе, мне нужно обновить адрес для этого идентификатора, в противном случае мне нужно проверить для customerId и получить его addressId и обновить еще создайте новый адрес для этого customerId, ваш код будет работать только в том случае, если мы передадим правильный addressId, если передан неверный идентификатор адреса или пустое значение, тогда это не работает, я думаю
jafar pinjar

каким-то образом мне удалось создать адрес, но setRegion выдает ошибку.
Джафар Пинджар

3

Если вы знаете адрес с идентификатором $ addressId, вы можете использовать хранилище адресов для загрузки и сохранения обновленных адресов:

/**
 * @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);
}

Как мы можем обновить его с помощью customerId? Я ищу код с идентификатором клиента.
Джафар Пинджар

проверьте мой обновленный код, чтобы изменить адрес по идентификатору клиента
Aasim Goriya

Вы не вводите _customerRepository, и можете ли вы обновить код для проверки, есть ли у клиента адрес, который мне нужно обновить, иначе мне нужно создать новый адрес.
Джафар Пинджар

$ адресно> setCustomerId ($ CUSTOMERID); выдает ошибку, Uncaught Error: вызов функции-члена setCustomerId ()
jafar pinjar

Вы можете обновить мне правильный код, пожалуйста.
Джафар Пинджар

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.