/** * Fetches an existing social login profile or creates new * * @param string $login E-mail address * @param string $socialProvider SocialLogin auth provider * @param string $socialId SocialLogin provider-unique id * @param array $profileInfo Profile info OPTIONAL * * @return \XLite\Model\Profile */ protected function getSocialLoginProfile($login, $socialProvider, $socialId, $profileInfo = array()) { $profile = \XLite\Core\Database::getRepo('XLite\\Model\\Profile')->findOneBy(array('socialLoginProvider' => $socialProvider, 'socialLoginId' => $socialId, 'order' => null)); if (!$profile) { $profile = new \XLite\Model\Profile(); $profile->setLogin($login); $profile->setSocialLoginProvider($socialProvider); $profile->setSocialLoginId($socialId); $existingProfile = \XLite\Core\Database::getRepo('XLite\\Model\\Profile')->findOneBy(array('login' => $login, 'order' => null)); if ($existingProfile) { $profile = null; } else { $profile->create(); if ($profileInfo && isset($profileInfo['given_name']) && isset($profileInfo['family_name']) && isset($profileInfo['address'])) { $address = new \XLite\Model\Address(); $address->setProfile($profile); $address->setFirstname($profileInfo['given_name']); $address->setLastname($profileInfo['family_name']); if (isset($profileInfo['address']['country']) && isset($profileInfo['address']['region'])) { $address->setCountryCode($profileInfo['address']['country']); $state = \XLite\Core\Database::getRepo('XLite\\Model\\State')->findOneByCountryAndCode($profileInfo['address']['country'], $profileInfo['address']['region']); if ($state) { $address->setState($state); } } if (isset($profileInfo['address']['locality'])) { $address->setCity($profileInfo['address']['locality']); } if (isset($profileInfo['address']['street_address'])) { $address->setStreet($profileInfo['address']['street_address']); } if (isset($profileInfo['address']['postal_code'])) { $address->setZipcode($profileInfo['address']['postal_code']); } if (isset($profileInfo['phone_number'])) { $address->setPhone($profileInfo['phone_number']); } $address->setIsShipping(true); $address->setIsBilling(true); $profile->addAddresses($address); $address->create(); } } } return $profile; }
/** * Update address * * @return void */ protected function updateAddress($data) { if (!is_array($data)) { return; } $profile = $this->getCartProfile(); $address = $profile->getShippingAddress(); if ($address) { \XLite\Core\Database::getEM()->refresh($address); } $noAddress = !isset($address); $andAsBilling = true; $current = new \XLite\Model\Address(); $current->map($this->prepareAddressData($data)); if ($noAddress || !$address->getIsWork() && !$address->isEqualAddress($current)) { $address = new \XLite\Model\Address(); $address->setProfile($profile); $address->setIsShipping(true); $address->setIsBilling($andAsBilling); $address->setIsWork(true); if ($noAddress || !(bool) \XLite\Core\Request::getInstance()->only_calculate) { $profile->addAddresses($address); \XLite\Core\Database::getEM()->persist($address); } } $address->map($this->prepareAddressData($data)); if ($noAddress && !$profile->getBillingAddress() && (is_null(\XLite\Core\Session::getInstance()->same_address) || \XLite\Core\Session::getInstance()->same_address)) { // Same address as default behavior $address->setIsBilling(true); } \XLite\Core\Session::getInstance()->same_address = $this->getCart()->getProfile()->isEqualAddress(); }
/** * Update profiel billing address * * @return void */ protected function updateBillingAddress() { $data = $this->requestData['billingAddress']; $profile = $this->getCartProfile(); 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); } else { $this->valid = false; } } 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 (!$this->requestData['same_address'] && is_array($data)) { // Save separate billing address $address = $profile->getBillingAddress(); if ($address) { \XLite\Core\Database::getEM()->refresh($address); } $andAsShipping = false; if (!$address || $data['save_as_new']) { 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); if (!(bool) \XLite\Core\Request::getInstance()->only_calculate) { $profile->addAddresses($address); \XLite\Core\Database::getEM()->persist($address); } } $address->map($this->prepareAddressData($data)); \XLite\Core\Event::updateCart(array('billingAddress' => array('same' => $address->getIsShipping()))); } $this->updateCart(); }
/** * 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())); } }
/** * Set estimate destination * * @return void */ protected function doActionSetDestination() { $countryCode = \XLite\Core\Request::getInstance()->destination_country; $country = !$countryCode && !$this->hasField('country_code') ? \XLite\Model\Address::getDefaultFieldValue('country') : \XLite\Core\Database::getRepo('XLite\\Model\\Country')->find($countryCode); $state = null; if (0 < intval(\XLite\Core\Request::getInstance()->destination_state)) { $state = \XLite\Core\Database::getRepo('XLite\\Model\\State')->find(\XLite\Core\Request::getInstance()->destination_state); if (isset($state) && $state->getCountry()->getCode() !== $countryCode) { $state = null; } } if (!$state) { $state = \XLite\Core\Database::getRepo('XLite\\Model\\State')->getOtherState(strval(\XLite\Core\Request::getInstance()->destination_custom_state)); } if ($country && $country->getEnabled()) { $address = $this->getCartProfile()->getShippingAddress(); if (!$address) { $profile = $this->getCartProfile(); $address = new \XLite\Model\Address(); $address->setProfile($profile); $address->setIsShipping(true); $address->setIsBilling(true); $address->setIsWork(true); $profile->addAddresses($address); \XLite\Core\Database::getEM()->persist($address); } $address->setCountry($country); if ($state) { if (0 < $state->getStateId()) { $address->setState($state); } else { $address->setState(null); $address->setCustomState($state->getState()); } } $address->setZipcode(\XLite\Core\Request::getInstance()->destination_zipcode); $address->setType(\XLite\Core\Request::getInstance()->destination_type ?: \XLite\Core\Config::getInstance()->Shipping->anonymous_address_type); $address->update(); // Update cart and do not call js-event 'updateCart' to prevent race of shipping rates calculation $this->updateCart(true); $modifier = $this->getCart()->getModifier('shipping', 'SHIPPING'); if ($modifier) { $shippingAddress = \XLite\Model\Shipping::getInstance()->getDestinationAddress($modifier->getModifier()); } $this->valid = true; $this->setInternalRedirect(); } else { \XLite\Core\TopMessage::addError('Shipping address is invalid'); $this->valid = false; } }