<?php
namespace App\Controller\Frontend;
use App\Entity\Gos\LeadFormCompleted;
use App\Entity\Gos\LeadFormResponse;
use App\Entity\Gos\LeadFormResponseItem;
use App\Entity\Gos\Term;
use App\Entity\Gos\TermType;
use App\Form\Frontend\RegistrationType;
use App\Message\LeadEventBok;
use App\Utils\AddressUtils;
use App\Utils\CartServices;
use App\Utils\ClickMeetingUtils;
use App\Utils\Encryption;
use App\Utils\FacebookPixel\Api\FacebookPixelService;
use App\Utils\LeadFormCompletedUtils;
use App\Utils\NotificationForUserUtils;
use App\Utils\OneTimePasswordService;
use App\Utils\OrderFreeAccessService;
use App\Utils\Email\SendMail;
use App\Utils\PortalSettingsService;
use App\Utils\RegistrationUtils;
use App\Utils\SalesManago\SalesManagoTagUtils;
use App\Utils\SalesManago\v2\Action\Contact\Upsert\Events\SalesManagoUpsertEventsV2;
use App\Utils\SalesManago\v2\Action\SalesManagoEventDispatcher;
use App\Utils\TermsService;
use App\Utils\UrlParser;
use App\Utils\UserBenefits;
use App\Utils\UserFlagService;
use App\Utils\UserServices;
use App\Entity\Gos\PortalSettings;
use App\Entity\Gos\User;
use Doctrine\ORM\EntityManagerInterface;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Model\UserInterface;
use FOS\UserBundle\Model\UserManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use FOS\UserBundle\Controller\RegistrationController as FOSBaseController;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
use Twig\TemplateWrapper;
class FmRegistrationController extends FOSBaseController
{
private $oneTimePasswordService;
private $portalSettingsService;
private $em;
private $userManager;
private $eventDispatcher;
private $termsService;
private $addressUtils;
private $registrationUtils;
private $orderFreeAccessService;
private $encryption;
private $userBenefits;
private $cartServices;
private $userServices;
private $sendMail;
private $tokenStorage;
private $fileDirPath;
private $matchRegex;
private $facebookPixelService;
private $messageBus;
private $userFlagService;
private Environment $twig;
private $salesManagoEventDispatcher;
private TranslatorInterface $translator;
public function __construct(
OneTimePasswordService $oneTimePasswordService,
PortalSettingsService $portalSettingsService,
EntityManagerInterface $em,
UserManagerInterface $userManager,
EventDispatcherInterface $eventDispatcher,
TermsService $termsService,
AddressUtils $addressUtils,
RegistrationUtils $registrationUtils,
OrderFreeAccessService $orderFreeAccessService,
Encryption $encryption,
UserBenefits $userBenefits,
CartServices $cartServices,
UserServices $userServices,
SendMail $sendMail,
TokenStorageInterface $tokenStorage,
KernelInterface $kernel,
FacebookPixelService $facebookPixelService,
MessageBusInterface $messageBus,
UserFlagService $userFlagService,
Environment $twig,
SalesManagoEventDispatcher $salesManagoEventDispatcher, TranslatorInterface $translator
) {
$this->oneTimePasswordService = $oneTimePasswordService;
$this->portalSettingsService = $portalSettingsService;
$this->em = $em;
$this->userManager = $userManager;
$this->eventDispatcher = $eventDispatcher;
$this->termsService = $termsService;
$this->addressUtils = $addressUtils;
$this->registrationUtils = $registrationUtils;
$this->orderFreeAccessService = $orderFreeAccessService;
$this->encryption = $encryption;
$this->userBenefits = $userBenefits;
$this->cartServices = $cartServices;
$this->userServices = $userServices;
$this->sendMail = $sendMail;
$this->tokenStorage = $tokenStorage;
$this->fileDirPath = $kernel->getProjectDir() . '/public/uploads/events/';
$this->matchRegex = true;
$this->facebookPixelService = $facebookPixelService;
$this->messageBus = $messageBus;
$this->userFlagService = $userFlagService;
$this->twig = $twig;
$this->salesManagoEventDispatcher = $salesManagoEventDispatcher;
$this->translator = $translator;
}
public function registerAction(Request $request): Response
{
$isAjax = $request->request->get('isAjax');
$templateId = $request->query->get('template', false);
$portalSettingsHash = $this->portalSettingsService->getPortalSettingsHashForIframe($request);
$currentRoute = $request->attributes->get('_route');
$pdfArticleUrl = $request->query->get('articleUrl', false);
if ($portalSettingsHash)
{
$request->getSession()->set('portalSettingsHash', $portalSettingsHash);
}
//redirect to the same route if portal settings hasn't been set
if (empty($portalSettingsHash))
{
if ($request->request->get('return') === 'json_format')
{
return $this->json(['status' => 'error', 'message' => 'notFoundPortalSettingsHash'], 400);
}
if ($currentRoute === 'eforum_register')
{
return $this->redirectToRoute('efShowDynamicTemplate');
}
if ($currentRoute === 'uniqskills_register')
{
return $this->redirectToRoute('fmUniqskillsHomePage', [
'_locale' => $request->getSession()->get('userLocale', 'pl')
]);
}
return $this->render('frontend/base/reloadPage.html.twig', [
'method' => 'replaceUrl',
'domain' => UrlParser::getFullPath($request->headers->get('referer'))
]);
}
if ($currentRoute === 'eforum_register' && !empty($this->getUser()))
{
return $this->redirectToRoute('efShowDynamicTemplate');
}
if ($currentRoute === 'uniqskills_register' && !empty($this->getUser()))
{
return $this->redirectToRoute('fmUniqskillsHomePage');
}
/** @var User $user */
$user = $this->userManager->createUser();
$portalSettings = $this->em->getRepository(PortalSettings::class)->findOneByHash($portalSettingsHash);
$terms = [];
$termsRequired = [];
if (in_array($currentRoute, ['eforum_register', 'uniqskills_register', 'order_register']))
{
$terms = $this->termsService->getTerms($portalSettings, null, false, true, false);
$termsRequired = $this->termsService->getTerms($portalSettings, null, true, true, false);
}
$termsAccepted = $request->get('terms');
$termInfo = $this->em->getRepository(Term::class)->findTermInfoForPortal($portalSettings);
$leadTemplate = $this->em->getRepository(LeadFormResponse::class)->find($templateId);
if ($leadTemplate !== null)
{
if (!$leadTemplate->getTerms()->isEmpty())
{
$leadTerms = $leadTemplate->getTerms()->toArray();
$terms = array_merge($terms, $leadTerms);
$termsRequired = array_merge($termsRequired, array_filter($leadTerms, function (Term $term) {
return $term->getIsRequired() === true;
}));
}
if ($isEnglish = ($leadTemplate->isEnglish() === true)) {
$this->translator->setLocale('en');
}
}
$event = new GetResponseUserEvent($user, $request);
$this->eventDispatcher->dispatch($event, FOSUserEvents::REGISTRATION_INITIALIZE);
if (null !== $event->getResponse())
{
return $event->getResponse();
}
$form = $this->createForm(RegistrationType::class, $user, [
'phoneRequired' => RegistrationUtils::isPhoneRequired($request, $leadTemplate),
'phoneHidden' => $leadTemplate ? $leadTemplate->isPhoneHidden() : false,
'isEnglishLead' => $leadTemplate ? $leadTemplate->isEnglish() : false,
'csrf_protection' => $request->request->get('remove_csrf_protection', true),
'is_uniqskills_portal' => $currentRoute,
'is_from_application' => $request->request->get('from_app', false),
'portalSettingsId' => $portalSettings->getId(),
'requiredNPWZ' => RegistrationUtils::requiredNPWZ($leadTemplate),
'isLeading' => $leadTemplate !== null,
])->handleRequest($request);
if ($form->isSubmitted())
{
if (!$this->termsService->areTermsSelected($termsAccepted, $termsRequired))
{
if ($request->request->get('return') == 'json_format')
{
return $this->json(['status' => 'error', 'message' => 'notSelectedRequiredTerms'], 400);
}
$request->getSession()->getFlashBag()->add('warning', 'Musisz zaznaczyć wymagane zgody.');
}
if ($form->has('npwz'))
{
if ($this->cartServices->checkValidityNpwz($form->get('npwz')->getData()) == false)
{
$form->get('npwz')->addError(new FormError('Błędny numer PWZ'));
}
}
if (!$portalSettings->getIsUniqskillsPortal() && empty($isEnglish))
{
$phone = $form->getData()->getPhoneNumber();
if (!empty($phone) && !$this->addressUtils->checkPhoneForPl($phone))
{
$form->get('phoneNumber')->addError(new FormError('Błędny numer telefonu'));
}
}
$existingUser = $this->em->getRepository(User::class)->findOneByEmailCanonical($user->getEmail());
$isLeadValid = $this->registrationUtils->validateLeadForm($leadTemplate ?? null, $existingUser ?? $user);
$reginfo = $this->registrationUtils->resolveReginfo($request, $leadTemplate);
if ($form->isValid() && $isLeadValid)
{
$this->registrationUtils->checkAdditionalFields($request, $templateId, $form);
if (is_null($user->getPassword()))
{
$user->setPassword(md5(strtotime(time())));
}
if ($user->getPhoneNumber())
{
$user->setPhoneNumberPrefix($request->request->get('numberPrefix'));
}
$user->setRegisteredFrom($portalSettings);
$this->registrationUtils->setUserCountry($user);
$this->registrationUtils->setUserTimezone($user);
RegistrationUtils::setUserCampaignInfo($request, $user, $portalSettings);
if ($reginfo !== null)
{
$user->setReginfo($reginfo);
$leadFormCompleted = LeadFormCompletedUtils::createLeadForm($user, $portalSettings);
$leadFormCompleted->setRegInfo($reginfo);
$leadFormCompleted->setActionNumber($leadTemplate ? $leadTemplate->getActionNumber() : $user->getActionNumber());
LeadFormCompletedUtils::setLeadFormCampaignInfoFromUser($leadFormCompleted, $user);
if ($leadTemplate)
{
$this->facebookPixelService->setEvent('Lead')->request();
$leadFormCompleted->setTemplate($leadTemplate);
$this->registrationUtils->setRemindersAboutActivation($leadFormCompleted, $leadTemplate);
if ($leadTemplate->isIncludingAddress())
{
LeadFormCompletedUtils::updateLeadFormAddress($request, $leadFormCompleted);
}
if (!is_null($request->get('source'))) $leadFormCompleted->setFromSource($request->get('source'));
}
LeadFormCompletedUtils::updateLeadPosition($request, $leadFormCompleted, $this->em);
}
$this->registrationUtils->setUserAdditionalInfo($request, $user, $leadFormCompleted ?? null);
if ($form->has('npwz'))
{
$this->registrationUtils->saveNpwz($user, $leadFormCompleted ?? null, $form->get('npwz')->getData());
}
$notificationForUserUtils = new NotificationForUserUtils($this->em);
$notificationForUserUtils->saveNotificationToUserByLanguage($user, $user->getCountry()->getLanguage(), $portalSettings);
if ($request->request->get('from_app'))
{
$digits = 6;
$activationCode = str_pad(rand(0, pow(10, $digits) - 1), $digits, '0', STR_PAD_LEFT);
$user->setActivationCode($activationCode);
}
$session = new Session();
$session->set('email', $user->getEmail());
$event = new FormEvent($form, $request);
$this->eventDispatcher->dispatch($event, FOSUserEvents::REGISTRATION_SUCCESS);
$this->userManager->updateUser($user);
if ($termInfo !== null) $terms[] = $termInfo;
$this->termsService->saveUserTerms($terms, $termsAccepted, $user, $portalSettings);
$this->em->refresh($user);
if (isset($leadFormCompleted))
{
$this->em->persist($leadFormCompleted);
$this->em->flush();
}
$this->userServices->sendUserLeadToDB(
$user,
$portalSettings,
$reginfo,
__METHOD__,
null,
$leadFormCompleted ?? null
);
if (null === $response = $event->getResponse())
{
$response = $this->redirectToRoute('fos_user_registration_confirmed');
}
if ($leadTemplate)
{
if ($leadTemplate->getEmailTemplate()) $request->getSession()->set('leadIdFromRegister', $leadTemplate->getId());
if ($leadTemplate->getFromEmail()) $request->getSession()->set('leadFromEmail', $leadTemplate->getFromEmail());
if ($leadTemplate->getSender()) $request->getSession()->set('leadSender', $leadTemplate->getSender());
if ($leadTemplate->getIsClickmeeting())
{
try
{
ClickMeetingUtils::addConferenceRegistration($user, $leadTemplate);
}
catch (\Exception $e)
{
error_log($e->getMessage());
}
}
if ($productVariant = $leadTemplate->getProductVariant())
{
$accessTo = (new \DateTime())->modify('50 years');
$this->orderFreeAccessService->addFreeAccessToUser($user, $accessTo, $productVariant);
$this->userFlagService->assignToUserByProductVariant($user, $productVariant);
}
if ($leadTemplate->getUseEventBok() === true) {
$this->messageBus->dispatch(
new LeadEventBok(
'lead_event_confirm',
$user->getId(),
$leadTemplate->getId(),
$portalSettingsHash,
true,
$request->request->get('leadExtraEvents', [])
)
);
}
//new user - SB lead
$this->salesManagoEventDispatcher->dispatchContactUpsert(
$user,
SalesManagoUpsertEventsV2::ON_LEADING,
$leadTemplate,
$reginfo
);
if ($leadTemplate->getOneTimePassword() && (!$user->isEnabled() || $user->getIsRobinson()))
{
$this->oneTimePasswordService->generateCodeForAccount($user);
$this->oneTimePasswordService->sendMailWithCode($user, $portalSettings, 'leadTemplate', $leadTemplate->getId(), null, $leadTemplate->getFromEmail(), $leadTemplate->getSender(), $pdfArticleUrl);
$this->eventDispatcher->dispatch(
new FilterUserResponseEvent($user, $request, $response),
FOSUserEvents::REGISTRATION_COMPLETED
);
if ($isAjax)
{
$request->query->add([
'leadTemplate' => $leadTemplate->getId(),
'email' => $user->getEmail(),
'token' => $user->getOtpToken(),
'pdfArticleUrl' => $pdfArticleUrl
]);
return $this->forward('\App\Controller\Frontend\OneTimePasswordController::showActivationPage', [
'request' => $request
]);
}
return $this->redirect(
$this->generateUrl('fmOneTimePasswordActivationPage')
. '?leadTemplate=' . $leadTemplate->getId()
. '&email=' . $user->getEmail()
. '&token=' . $user->getOtpToken()
. '&pdfArticleUrl=' . $pdfArticleUrl
);
}
}
$this->eventDispatcher->dispatch(
new FilterUserResponseEvent($user, $request, $response),
FOSUserEvents::REGISTRATION_COMPLETED
);
// Uncomment to auto login after registration
// $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
// $this->tokenStorage->setToken($token);
// $request->getSession()->set('_security_main', serialize($token));
if (null !== $cartHash = $request->cookies->get('cartHash'))
{
$this->cartServices->addCartToUser($cartHash, $user);
}
if ($request->isXmlHttpRequest())
{
$access = $this->userBenefits->get($user);
$access4cms = $this->userBenefits->get($user, true);
if ($request->request->get('return') == 'json_format')
{
return $this->json(['status' => 'ok']);
}
return $this->json(['success' => true, 'data' => $this->encryption->encryptUser($user, $access, $access4cms)]);
}
else
{
if ($request->request->get('return') == 'json_format')
{
$data = ['status' => 'ok'];
if($request->request->get('from_app'))
$data['user'] = $user->getToken();
return $this->json($data);
}
}
return $response;
}
else if ($templateId && isset($this->getErrors($form)['email']) && !isset($this->getErrors($form)['npwz']))
{
// this is wrong and needs to be changed
// in case of lead and existing user every other field can be wrong, and it will pass anyway
$this->registrationUtils->checkAdditionalFields($request, $templateId, $form, $this->matchRegex);
if ($this->matchRegex && $isLeadValid)
{
if ($existingUser instanceof User)
{
$session = new Session();
$session->set('email', $user->getEmail());
$this->registrationUtils->updateUserData($user, $existingUser);
$existingLeadFormCompleted = $this->em->getRepository(LeadFormCompleted::class)->findOneBy([
'user' => $existingUser,
'regInfo' => $reginfo,
]);
if ($existingLeadFormCompleted instanceof LeadFormCompleted)
{
$existingLeadFormCompleted->setCreatedAt(new \DateTime());
LeadFormCompletedUtils::setLeadFormCampaignInfoFromRequest($existingLeadFormCompleted, $request, $portalSettings);
if ($user->getPhoneNumber()) $existingLeadFormCompleted->setPhoneNumber($user->getPhoneNumber());
if ($leadTemplate->isIncludingAddress())
{
LeadFormCompletedUtils::updateLeadFormAddress($request, $existingLeadFormCompleted);
}
LeadFormCompletedUtils::updateLeadPosition($request, $existingLeadFormCompleted, $this->em);
}
elseif ($reginfo !== null)
{
$leadFormCompleted = LeadFormCompletedUtils::createLeadForm($existingUser, $portalSettings);
$leadFormCompleted->setRegInfo($reginfo);
LeadFormCompletedUtils::setLeadFormCampaignInfoFromRequest($leadFormCompleted, $request, $portalSettings);
if ($leadTemplate)
{
$leadFormCompleted->setTemplate($leadTemplate);
$this->registrationUtils->setRemindersAboutActivation($leadFormCompleted, $leadTemplate);
if ($leadTemplate->isIncludingAddress())
{
LeadFormCompletedUtils::updateLeadFormAddress($request, $leadFormCompleted);
}
if (!is_null($request->get('source'))) $leadFormCompleted->setFromSource($request->get('source'));
}
LeadFormCompletedUtils::updateLeadPosition($request, $leadFormCompleted, $this->em);
$this->em->persist($leadFormCompleted);
}
if ($form->has('npwz'))
{
$this->registrationUtils->saveNpwz($existingUser, $existingLeadFormCompleted ?? $leadFormCompleted ?? null, $form->get('npwz')->getData());
}
$this->registrationUtils->setUserAdditionalInfo($request, $existingUser, $existingLeadFormCompleted ?? $leadFormCompleted ?? null);
$this->em->flush();
$this->userServices->sendUserLeadToDB(
$existingUser,
$portalSettings,
$reginfo,
__METHOD__,
null,
$existingLeadFormCompleted ?? $leadFormCompleted ?? null
);
//existing user - SB lead
$this->salesManagoEventDispatcher->dispatchContactUpsert(
$user,
SalesManagoUpsertEventsV2::ON_LEADING,
$leadTemplate,
$reginfo
);
if ($reginfo !== null)
{
$this->userServices->updateContactTags(
$user,
SalesManagoTagUtils::getTagsAsArray($reginfo, $leadTemplate)
);
}
if ($productVariant = $leadTemplate->getProductVariant())
{
$accessTo = (new \DateTime())->modify('50 years');
$this->orderFreeAccessService->addFreeAccessToUser($existingUser, $accessTo, $productVariant);
$this->userFlagService->assignToUserByProductVariant($existingUser, $productVariant);
}
if ($leadTemplate->getIsClickmeeting())
{
try
{
ClickMeetingUtils::addConferenceRegistration($user, $leadTemplate);
}
catch (\Exception $e)
{
error_log($e->getMessage());
}
}
if (!$existingUser->isEnabled() || $existingUser->getIsRobinson())
{
if ($leadTemplate->getOneTimePassword()) {
$this->oneTimePasswordService->generateCodeForAccount($existingUser);
$this->oneTimePasswordService->sendMailWithCode(
$existingUser,
$portalSettings,
'leadTemplate',
$leadTemplate->getId(),
null,
$leadTemplate->getFromEmail(),
$leadTemplate->getSender(),
$pdfArticleUrl
);
if ($isAjax)
{
$request->query->add([
'leadTemplate' => $leadTemplate->getId(),
'email' => $existingUser->getEmail(),
'token' => $existingUser->getOtpToken()
]);
return $this->forward('\App\Controller\Frontend\OneTimePasswordController::showActivationPage', [
'request' => $request
]);
}
return new RedirectResponse(
$this->generateUrl('fmOneTimePasswordActivationPage')
.'?leadTemplate=' .$leadTemplate->getId()
.'&email='.$existingUser->getEmail()
.'&token='.$existingUser->getOtpToken()
);
}
$this->eventDispatcher->dispatch(
new FilterUserResponseEvent($existingUser, $request, new Response()),
FOSUserEvents::REGISTRATION_COMPLETED
);
}
if ($leadTemplate->getEmailTemplate())
{
// add .ics file from event do attachments
if ($leadEvent = $leadTemplate->getEvent())
{
if ($leadEvent->getICalCalendarFileName())
{
$attachment['add_me_to_calendar.ics'] = $this->fileDirPath . $leadEvent->getICalCalendarFileName();
}
}
if ($leadTemplate->getUseEventBok() === true) {
$this->messageBus->dispatch(
new LeadEventBok(
'lead_event_confirm',
$existingUser->getId(),
$leadTemplate->getId(),
$portalSettingsHash,
true,
$request->request->get('leadExtraEvents', [])
)
);
} else {
$this->sendMail->sendMail(
'lead_user_already_exist',
$user->getEmail(),
[
'user' => $user,
'event' => $leadTemplate->getEvent() ?? null,
'attachment' => $attachment ?? null
],
$portalSettingsHash,
false,
null,
['emailTemplate' => $leadTemplate->getEmailTemplate(), 'sender' => $leadTemplate->getSender(), 'fromEmail' =>$leadTemplate->getFromEmail()]
);
}
}
if ($isAjax)
{
if ($pdfArticleUrl)
{
$template = $this->twig->load('frontend/article_pdf/after_register_content.html.twig');
$content = $template->renderBlock('content', [
'pdfUrl' => $this->pdfResponseUrl($pdfArticleUrl)
]);
$response = new Response();
$response->setContent($content);
return $response;
}
$request->query->add([
'type' => 'register',
'template' => $request->query->get('template'),
'newUser' => false
]);
return $this->forward('\App\Controller\Frontend\UserController::afterLoginAction', [
'request' => $request,
'facebookPixelService' => $this->facebookPixelService,
'type' => 'register'
]);
}
if ($pdfArticleUrl) {
return $this->render('frontend/article_pdf/after_register_content.html.twig', [
'pdfUrl' => $this->pdfResponseUrl($pdfArticleUrl)
]);
}
return $this->redirectToRoute('fmUserAfterLogin', [
'type' => 'register',
'template' => $request->query->get('template'),
'newUser' => false,
]);
}
}
}
$event = new FormEvent($form, $request);
$this->eventDispatcher->dispatch($event, FOSUserEvents::REGISTRATION_FAILURE);
if (null !== $response = $event->getResponse())
{
if ($request->request->get('return') == 'json_format')
{
return $this->json(['status' => 'error', 'message' => 'error'], 400);
}
if ($request->isXmlHttpRequest())
{
return $this->json(['success' => false, 'body' => 'Ups, coÅ› jest nie tak']);
}
return $response;
}
}
if ($request->isXmlHttpRequest() || 'order_register' === $currentRoute)
{
$template = 'frontend/order/user/register.html.twig';
$request->getSession()->set('registerFrom', 'FROM_CART');
}
elseif ('eforum_register' === $currentRoute)
{
$template = 'frontend-eforum/security/register.html.twig';
$request->getSession()->set('registerFrom', 'FROM_SIGNUP');
}
elseif ('uniqskills_register' === $currentRoute)
{
$template = 'uniqskills/security/register.html.twig';
$request->getSession()->set('registerFrom', 'FROM_SIGNUP');
}
else
{
$template = 'frontend/registration/register.html.twig';
$request->getSession()->set('registerFrom', 'FROM_SIGNUP');
}
if ($request->query->get('hideAddContent'))
{
$portalSettings->setRegistrationAdditionalContent(null);
}
if ($request->cookies->get('f'))
{
$request->getSession()->set('f', $request->cookies->get('f'));
}
if ($request->request->get('return') == 'json_format')
{
return $this->json([
'status' => 'error',
'isValid' => $form->isValid(),
'validErrors' => $this->getErrors($form)
], 400);
}
$parameters = [
'termInfo' => $termInfo,
'terms' => $terms,
'termsAccepted' => $termsAccepted,
'form' => $form->createView(),
'portalSettings' => $portalSettings,
'source' => $request->query->get('source', 'default'),
'userCountry' => $user->getCountry(),
'ups' => $user->getRegisteredFrom(),
'isFromLeadTemplate' => !is_null($leadTemplate),
'hideLastName' => !is_null($leadTemplate) && (($leadTemplate->getHideLastName() ?? false)),
'leadTemplate' => $leadTemplate,
'phoneRequired' => RegistrationUtils::isPhoneRequired($request, $leadTemplate),
'isEnglish' => $isEnglish ?? false
];
if ($templateId && $leadTemplate !== null)
{
$leadFormAdditionalFields = $this->em->getRepository(LeadFormResponseItem::class)->findByLeadFormResponse($templateId);
$parameters['legalRule'] = $leadTemplate->getLegalRule();
if ($leadFormAdditionalFields !== null)
{
$parameters['additionalFields'] = $leadFormAdditionalFields;
}
if ($leadTemplate->isIncludingPosition())
{
$parameters['positionField'] = $leadTemplate->getLeadFormResponsePosition();
}
if ($leadTemplate->isIncludingAddress())
{
$parameters['addressFields'] = $leadTemplate->getLeadFormResponseAddress();
}
if ($leadTemplate->getIsLeadForPartner())
{
$parameters['leadForPartner'] = true;
$parameters['linkToPartner'] = $leadTemplate->getLinkToPartner();
}
if (isset($isLeadValid) && $isLeadValid == false)
{
$parameters['emailValidationError'] = $leadTemplate->getEmailValidationErrorMessage();
}
if ($leadFormResponsePosition = $leadTemplate->getLeadFormResponsePosition())
{
$parameters['hidePortalPositions'] = $leadFormResponsePosition->getHidePortalPositions();
}
if ($leadTemplate->getRequiredNPWZ())
{
$parameters['requiredNPWZ'] = true;
}
if ($leadTemplate->getAdditionalStyle())
{
$parameters['additionalStyleFromLead'] = $leadTemplate->getAdditionalStyle();
}
if ($leadTemplate->getUseEventBok() === true && $leadTemplate->getAdditionalEvents()->isEmpty() === false) {
$parameters['additionalEventsDescription'] = $leadTemplate->getAdditionalEventsDescription();
$parameters['additionalEvents'] = $leadTemplate->getAdditionalEvents();
}
}
if ($isAjax)
{
$template = $this->twig->load($template);
$content = "";
if ($template->hasBlock('customcss'))
{
$content .= $template->renderBlock('customcss');
}
$content .= $template->renderBlock('content', $parameters);
if ($template->hasBlock('customjs'))
{
$content .= $template->renderBlock('customjs');
}
$response = new Response();
$response->headers->set('Content-Language', !empty($isEnglish) ? 'en' : 'pl');
$response->setContent($content);
return $response;
}
return $this->render($template, $parameters);
}
/**
* @Route("/outside-register", name="fmUserFrontendOutsideSourceRegister")
* @Template()
*/
public function outsideSourceRegistrationAction(Request $request): JsonResponse
{
/** @var User $user */
$user = $this->userManager->createUser();
$user->setEnabled(true);
$user->setActivationDate(new \DateTime());
$portalSettingsHash = $request->getSession()->get('portalSettingsHash');
$portalSettings = $this->em->getRepository(PortalSettings::class)->findOneByHash($portalSettingsHash);
if ($portalSettings instanceof PortalSettings)
{
$user->setRegisteredFrom($portalSettings);
}
$form = $this->createForm(RegistrationType::class, $user, ['csrf_protection' => false]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$user->setAllowedAdvertising($request->request->get('advertisingAgreement'));
$this->userManager->updateUser($user);
$this->userServices->activateVouchersForUser($user);
return $this->json('success', 200, ['Access-Control-Allow-Origin' => '*']);
}
$advertisingAgreement = $this->em->getRepository(Term::class)->findOneBy([
'termType' => $this->em->getRepository(TermType::class)->findOneBy(['slug' => 'advertising-agreement'])
]);
$response = $this->render('frontend/registration/outside_register.html.twig', [
'form' => $form->createView(),
'action' => $this->generateUrl(
'fmUserFrontendOutsideSourceRegister',
[],
UrlGeneratorInterface::NETWORK_PATH
),
'advertisingAgreement' => $advertisingAgreement
]);
return $this->json($response->getContent(), 200, ['Access-Control-Allow-Origin' => '*']);
}
/**
* Tell the user to check their email provider.
*/
public function checkEmailAction(Request $request): Response
{
$email = $request->getSession()->get('fos_user_send_confirmation_email/email');
if (empty($email))
{
return $this->redirectToRoute('fos_user_registration_register');
}
$request->getSession()->remove('fos_user_send_confirmation_email/email');
$user = $this->userManager->findUserByEmail($email);
if (null === $user)
{
return $this->redirectToRoute('fos_user_security_login');
}
return $this->render('@FOSUser/Registration/check_email.html.twig', [
'user' => $user,
]);
}
/**
* Receive the confirmation token from user email provider, login the user.
*
* @param Request $request
* @param string $token
*
* @return Response
*/
public function confirmAction(Request $request, $token): Response
{
$user = $this->userManager->findUserByConfirmationToken($token);
if (null === $user)
{
throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist', $token));
}
$user->setConfirmationToken(null);
$user->setEnabled(true);
$user->setActivationDate(new \DateTime());
$event = new GetResponseUserEvent($user, $request);
$this->eventDispatcher->dispatch($event, FOSUserEvents::REGISTRATION_CONFIRM);
$this->userManager->updateUser($user);
$this->userServices->activateVouchersForUser($user);
if (null === $response = $event->getResponse())
{
$response = $this->redirectToRoute('fos_user_registration_confirmed');
}
$this->eventDispatcher->dispatch(
new FilterUserResponseEvent($user, $request, $response),
FOSUserEvents::REGISTRATION_CONFIRMED
);
return $response;
}
/**
* Tell the user his account is now confirmed.
*/
public function confirmedAction(Request $request): Response
{
$user = $this->getUser();
if (!is_object($user) || !$user instanceof UserInterface)
{
throw new AccessDeniedException('This user does not have access to this section.');
}
return $this->render('@FOSUser/Registration/confirmed.html.twig', [
'user' => $user,
'targetUrl' => $this->getTargetUrlFromSession($request->getSession()),
]);
}
private function getTargetUrlFromSession(SessionInterface $session): ?string
{
$key = sprintf('_security.%s.target_path', $this->tokenStorage->getToken()->getProviderKey());
if ($session->has($key))
{
return $session->get($key);
}
return null;
}
private function getErrors($form): array
{
$errors = [];
foreach ($form as $fieldName => $formField)
{
foreach ($formField->getErrors(true) as $error)
{
$errors[$fieldName] = $error->getMessage();
}
}
return $errors;
}
private function pdfResponseUrl(string $url): string
{
$url = parse_url($url);
$path = $url['path'] . '/pdf';
$scheme = str_replace('http', 'https', $url['scheme']);
$host = $url['host'];
$query = isset($url['query']) ? '?' . $url['query'] : '';
return $scheme . '://' . $host . $path . $query;
}
}