Example #1
0
 /**
  * Update profile billing address
  *
  * @return void
  */
 protected function updateBillingAddress()
 {
     $noAddress = false;
     $data = empty($this->requestData['billingAddress']) ? null : $this->requestData['billingAddress'];
     $profile = $this->getCartProfile();
     if (isset($this->requestData['same_address'])) {
         \XLite\Core\Session::getInstance()->same_address = (bool) $this->requestData['same_address'];
     }
     if ($this->requestData['same_address']) {
         // Shipping and billing are same addresses
         $address = $profile->getBillingAddress();
         if ($address) {
             // Unselect old billing address
             $address->setIsBilling(false);
         }
         $address = $profile->getShippingAddress();
         if ($address) {
             // Link shipping and billing address
             $address->setIsBilling(true);
         }
     } elseif (isset($this->requestData['same_address']) && !$this->requestData['same_address']) {
         // Unlink shipping and billing addresses
         $address = $profile->getShippingAddress();
         if ($address && $address->getIsBilling()) {
             $address->setIsBilling(false);
         }
     }
     if (is_array($data) && !$this->requestData['same_address']) {
         // Save separate billing address
         $address = $profile->getBillingAddress();
         if ($address) {
             \XLite\Core\Database::getEM()->refresh($address);
         }
         $andAsShipping = false;
         $current = new \XLite\Model\Address();
         $current->map($this->prepareAddressData($data, 'billing'));
         $equal = null;
         foreach ($profile->getAddresses() as $addressEqual) {
             if ($addressEqual->isEqualAddress($current) && (!$address || $address->getAddressId() != $addressEqual->getAddressId())) {
                 $equal = $addressEqual;
                 break;
             }
         }
         if ($equal) {
             if ($address && $address->getIsWork()) {
                 $profile->getAddresses()->removeElement($address);
                 \XLite\Core\Database::getEM()->remove($address);
             }
             if ($address) {
                 $andAsShipping = $address->getIsShipping();
                 $address->setIsBilling(false);
                 if ($andAsShipping) {
                     $address->setIsShipping(false);
                 }
             }
             $address = $equal;
             $address->setIsBilling(true);
             if ($andAsShipping) {
                 $address->setIsShipping($andAsShipping);
             }
         }
         if (!$address || !$address->getIsWork() && !$address->isEqualAddress($current)) {
             if ($address) {
                 $andAsShipping = $address->getIsShipping();
                 $address->setIsBilling(false);
                 $address->setIsShipping(false);
             }
             $address = new \XLite\Model\Address();
             $address->setProfile($profile);
             $address->setIsBilling(true);
             $address->setIsShipping($andAsShipping);
             $address->setIsWork(true);
             if (!(bool) \XLite\Core\Request::getInstance()->only_calculate) {
                 $profile->addAddresses($address);
                 \XLite\Core\Database::getEM()->persist($address);
                 $noAddress = true;
             }
         }
         $address->map($this->prepareAddressData($data, 'billing'));
         \XLite\Core\Session::getInstance()->same_address = $this->getCart()->getProfile()->isEqualAddress();
     }
     if ($noAddress) {
         \XLite\Core\Event::createBillingAddress(array('id' => $address->getAddressId()));
     }
 }