示例#1
0
 /**
  * Create customer address and save it in the quote so that it can be used to persist later.
  *
  * @param \Magento\Customer\Api\Data\CustomerInterface $customer
  * @param \Magento\Quote\Model\Quote\Address $quoteCustomerAddress
  * @return void
  * @throws \InvalidArgumentException
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  */
 protected function _prepareCustomerAddress($customer, $quoteCustomerAddress)
 {
     // Possible that customerId is null for new customers
     $quoteCustomerAddress->setCustomerId($customer->getId());
     $customerAddress = $quoteCustomerAddress->exportCustomerAddress();
     $quoteAddressId = $quoteCustomerAddress->getCustomerAddressId();
     $addressType = $quoteCustomerAddress->getAddressType();
     if ($quoteAddressId) {
         /** Update existing address */
         $existingAddressDataObject = $this->addressRepository->getById($quoteAddressId);
         /** Update customer address data */
         $this->dataObjectHelper->mergeDataObjects(get_class($existingAddressDataObject), $existingAddressDataObject, $customerAddress);
         $customerAddress = $existingAddressDataObject;
     } elseif ($addressType == \Magento\Quote\Model\Quote\Address::ADDRESS_TYPE_SHIPPING) {
         try {
             $billingAddressDataObject = $this->accountManagement->getDefaultBillingAddress($customer->getId());
         } catch (\Exception $e) {
             /** Billing address does not exist. */
         }
         $isShippingAsBilling = $quoteCustomerAddress->getSameAsBilling();
         if (isset($billingAddressDataObject) && $isShippingAsBilling) {
             /** Set existing billing address as default shipping */
             $customerAddress = $billingAddressDataObject;
             $customerAddress->setIsDefaultShipping(true);
         }
     }
     switch ($addressType) {
         case \Magento\Quote\Model\Quote\Address::ADDRESS_TYPE_BILLING:
             if (is_null($customer->getDefaultBilling())) {
                 $customerAddress->setIsDefaultBilling(true);
             }
             break;
         case \Magento\Quote\Model\Quote\Address::ADDRESS_TYPE_SHIPPING:
             if (is_null($customer->getDefaultShipping())) {
                 $customerAddress->setIsDefaultShipping(true);
             }
             break;
         default:
             throw new \InvalidArgumentException('Customer address type is invalid.');
     }
     $this->getQuote()->setCustomer($customer);
     $this->getQuote()->addCustomerAddress($customerAddress);
 }