user = new \User(); } public function getTitle() { if ($this->newUser()) { return translate('title', 'user')[0]; } return translate('title', 'user')[1]; } public function getBreadcrumbs() { if ($this->newUser()) { return getReturnNavigation(-1, 'NO_TYPE', [translate('title', 'user')[0]]); } return getReturnNavigation(-1, 'USER', [translate('title', 'user')[1]]); } public function getBodyVariables() { $vars = parent::getBodyVariables(); if ($this->newUser()) { $vars['newUser'] = true; } if ($this->request->get('Submit')) { $this->handleSubmit(); } // data to template if (!$this->newUser() || $this->request->get('Submit')) { $data = $this->getData(); foreach ($data as $key => $value) { $vars['input'][$key] = ['value' => $value]; } } $vars['input']['news'] = getVal('news', null, $this->newUser() == true ? 'N' : $data['news']); $vars['input']['password']['value'] = ''; return $vars; } private function addFieldsToInvoice($invoice, $fields) { foreach ($fields as $field) { $invoice[$field] = getVal($field); } return $invoice; } protected function getInvoice() { $fields = \User::getFields(); $invoice = []; foreach ($fields as $field) { $invoice[$field] = getVal($field); } return $invoice; } protected function getDelivery() { $fields = \User::getFields(); $delivery = []; foreach ($fields as $field) { $delivery[$field] = getVal('d'.$field); } return $delivery; } protected function sendConfirmEmail(\User $user) { $this->email->setUser($user); $message = $this->email->getEmail(); $message['to'] = $user->email; return $this->email->sendEmail($message); } protected function handleSubmit(): void { $invoice = $this->getInvoice(); $invoice = $this->addFieldsToInvoice($invoice, ['email', 'ico', 'dic', 'phone', 'transport', 'gender', 'birthdate', 'copy_email']); $delivery = $this->getDelivery(); $password = getVal('password'); $newsletter = getVal('news', null, 'N'); foreach (getVal('custom_data', null, []) as $key => $value) { $this->user->setCustomData($key, $value); } if ($this->newUser()) { if ($invoice['email'] && $this->emailCheck->isEmailDomainValid($invoice['email'])) { if ($this->checkCaptcha()) { // check DIC $error = false; if (findModule(\Modules::ORDERS, \Modules::SUB_DIC_VALIDATE)) { if (!empty($invoice['dic'])) { if (!$this->DICValidator->checkVat($invoice['dic'])) { addUserMessage(translate('invalid_dic', 'order_error'), 'danger'); $error = true; } } } if (!$error) { // transakce kvuli master / slave $user = sqlGetConnection()->transactional(function () use ($invoice, $delivery, $password, $newsletter) { $id = $this->registerUser($invoice, $delivery, $password); if (!$id) { return null; } // newsletter save $this->userConsent->updateNewsletter($id, $newsletter, $this->newUser(), $this->isNewsletterConfirmed()); // login user $userObject = \User::createFromId($id); $userObject->login(getUserKey()); return $userObject; }); if ($user) { // send confirm email $this->sendConfirmEmail($user); // redirect on homepage addUserMessage(translate('registerSucceeded', 'user'), 'success'); $this->requestStack->getMainRequest()->attributes->set('gtm_registration', [ 'email' => $invoice['email'], 'firstname' => $invoice['name'], ]); if (findModule(\Modules::JS_SHOP)) { $this->session->set(JsShopRefreshListener::SESSION_NAME, true); } $path = $this->request->get('redirect') ? $this->request->get('redirect') : path('account'); throw new RedirectException($path); } } } } else { addUserMessage(sprintf(translate('error', 'user')['invalid_email_domain'], htmlentities($invoice['email']))); } } else { $oldUserEmail = \User::getCurrentUser()->email; // update $id = $this->updateUser($invoice, $delivery); if ($id) { // newsletter save $this->userConsent->updateNewsletter($id, $newsletter, $this->newUser(), $this->isNewsletterConfirmed()); // password update if (!empty($password)) { $this->user->updatePassword($password); } if (!empty($password) || $oldUserEmail != $invoice['email']) { // relogin user, otherwise it might not be recognized on the next request $userObject = \User::createFromId($id); $userObject->login(getUserKey()); } addUserMessage(translate('error', 'user')['saved'], 'success'); // redirect on homepage redirection('REFERER'); } } } protected function getData() { $id_user = Contexts::get(UserContext::class)->getActiveId(); $data = []; $qb = sqlQueryBuilder()->select('*') ->from('users') ->where('id=:id')->setParameter('id', $id_user)->execute(); if ($qb->rowCount() == 1) { $user = $qb->fetch(); $data = $this->fetchUserData($data, $user); return $data; } // collect post data foreach ($this->request->request->all() as $name => $value) { $data[$name] = $value; } return $data; } protected function checkPassword($password, $passwordAgain) { if ($password == $passwordAgain) { return true; } return false; } protected function updateUser($invoice, $delivery) { try { $this->updateAddresses($invoice, $delivery); } catch (ValidationException $e) { $this->addErrorMessage($e->getMessage()); return false; } if ($this->error) { $this->addError(); return false; } $oldUserEmail = \User::getCurrentUser()->email; if ($oldUserEmail != $invoice['email']) { $this->user->id = null; $this->error = $this->user->sanitizeRegistration(); if ($this->error == 15) { // login_exists $this->error = 20; // login_exists_edit } } if (!$this->error) { $id = $this->user->update(); // id of registered user return $id; } else { $this->addError(); return false; } } protected function registerUser($invoice, $delivery, $password) { if (Contexts::get(UserContext::class)->isActive()) { return Contexts::get(UserContext::class)->getActiveId(); } try { $this->updateAddresses($invoice, $delivery); } catch (ValidationException $e) { $this->addErrorMessage($e->getMessage()); return false; } if ($this->error) { $this->addError(); return false; } $this->error = $this->prepareRegister($password); if (!$this->error) { $id = $this->user->update(); $this->user->updatePassword($this->register); // id of registered user return $id; } else { $this->addError(); return false; } } protected function addError() { switch ($this->error) { case 1: addUserMessage(translate('error', 'user')['not_all_valid']); break; case 2: addUserMessage(replacePlaceholders( translate('error', 'user')['login_exists'], ['URL' => path('kupshop_user_login_login')] )); break; case 3: addUserMessage(translate('error', 'user')['false_length_passw']); break; case 4: addUserMessage(translate('error', 'user')['failed']); break; case 5: addUserMessage(translate('error', 'user')['saved']); break; case 6: addUserMessage(translate('error', 'user')['missing_name_invoice']); break; case 7: addUserMessage(translate('error', 'user')['missing_street_invoice']); break; case 8: addUserMessage(translate('error', 'user')['missing_city_invoice']); break; case 9: addUserMessage(translate('error', 'user')['missing_zip_invoice']); break; case 10: addUserMessage(translate('error', 'user')['missing_email_invoice']); break; case 11: addUserMessage(translate('error', 'user')['missing_phone_invoice']); break; case 12: addUserMessage(translate('error', 'user')['false_email']); break; case 13: addUserMessage(translate('error', 'user')['false_zip']); break; case 14: addUserMessage(translate('error', 'user')['false_phone']); break; case 15: addUserMessage(replacePlaceholders( translate('error', 'user')['login_exists'], ['URL' => path('kupshop_user_login_login')] )); break; case 16: addUserMessage(translate('error', 'user')['false_length_passw']); break; case 20: addUserMessage(translate('error', 'user')['login_exists_edit']); break; } } protected function prepareRegister($password) { $this->register = false; $error = $this->user->sanitizeRegistration($password); if (!$error) { $this->register = $password; } return $error; } protected function isNewsletterConfirmed(): bool { return false; } public function newUser() { if ($this->getType() == 'new') { return true; } return false; } public function getType() { return $this->type; } public function setType($type) { $this->type = $type; } public function setUserId($userId): self { $this->user->id = $userId; return $this; } protected function checkCaptcha(): bool { // Check CAPTCHA if (findModule('recaptcha', 'registration')) { try { Captcha::checkCaptcha(); } catch (ValidationException $e) { $this->addErrorMessage($e->getMessage()); return false; } } return true; } protected function fetchUserData($data, $user) { $data['password'] = ''; $data['name'] = $user['name']; $data['surname'] = $user['surname']; $data['firm'] = $user['firm']; $data['street'] = $user['street']; $data['city'] = $user['city']; $data['zip'] = $user['zip']; $data['country'] = $user['country']; $data['state'] = $user['state']; $data['custom_address'] = $user['custom_address']; // ------------------------------ $data['dname'] = $user['delivery_name']; $data['dsurname'] = $user['delivery_surname']; $data['dfirm'] = $user['delivery_firm']; $data['dstreet'] = $user['delivery_street']; $data['dcity'] = $user['delivery_city']; $data['dzip'] = $user['delivery_zip']; $data['dcountry'] = $user['delivery_country']; $data['dstate'] = $user['delivery_state']; $data['dcustom_address'] = $user['delivery_custom_address']; $data['dphone'] = $user['delivery_phone']; $data['demail'] = $user['delivery_email']; // ------------------------------ $data['email'] = $user['email']; $data['ico'] = $user['ico']; $data['dic'] = $user['dic']; $data['copy_email'] = $user['copy_email']; $data['phone'] = $user['phone']; $data['mobile'] = $user['mobile']; $data['fax'] = $user['fax']; $data['gender'] = $user['gender']; $data['birthdate'] = $user['birthdate']; $data['accountNo'] = $user['account_no']; $data['accountBank'] = $user['account_bank']; $data['accountSymbol'] = $user['account_symbol']; $data['news'] = $user['get_news']; $data['transport'] = $user['prefer_transport']; $data['date_subscribe'] = $user['date_subscribe']; $data['date_unsubscribe'] = $user['date_unsubscribe']; $data['custom_data'] = json_decode($user['custom_data'], true); return $data; } protected function updateAddresses($invoice, $delivery): void { $this->error = $this->user->updateAddresses($invoice, $delivery); } }