<?php
namespace App\Controller;
use App\Env;
use App\Func;
use App\DTO\AppDTO;
use App\Entity\User;
use App\Service\Auth\Auth;
use App\Service\Mail\Mail;
use App\Form\RegistrationFormType;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class RegistrationController extends AbstractASController
{
private EntityManagerInterface $em;
private AppDTO $app;
//Repositories
private UserRepository $Users;
public function __construct(EntityManagerInterface $em, AppDTO $app, RequestStack $requestStack)
{
$this->requestStack = $requestStack;
$this->em = $em;
$this->app = $app;
$this->Users = $em->getRepository(User::class);
}
#[Route(path: '/register', name: 'register_no_locale', priority: 100, defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/{_locale}/register', name: 'register', priority: 100, requirements: ['_locale' => '%app.langs%'])]
public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $em, Auth $Auth, Mail $Mail): Response
{
$errors = [];
$user = new User();
$form = $this->createForm(RegistrationFormType::class, $user);
$form->handleRequest($request);
if ($request->isXmlHttpRequest() || !empty($request->query->all())) {
$email = $request->get('email', '');
$pass = $request->get('password', '');
$pass2 = $request->get('password2', '');
$name = $request->get('name', '');
$surname = $request->get('surname', '');
$phone = $request->get('phone', '');
/** @var \App\Entity\User user */
$user = $this->em->getRepository(User::class)->findOneBy(['email' => $email]);
// Пустые поля
if (empty($email) || empty($name) || empty($surname) || empty($phone)) {
if (empty($email)) $errors["email"] = $this->app->labels->get("field_is_empty");
if (empty($name)) $errors["name"] = $this->app->labels->get("field_is_empty");
if (empty($surname)) $errors["surname"] = $this->app->labels->get("field_is_empty");
if (empty($phone)) $errors["phone"] = $this->app->labels->get("field_is_empty");
}
// Пользователь есть в базе
if ($user) {
$errors["email"] = $this->app->labels->get("email_exists");
}
// Длина пароля
if (strlen($pass) < 6 || strlen($pass) > 60) {
$errors["password"] = $this->app->labels->get("password_length_error");
}
// Пароли не совпадают
if ($pass != $pass2) {
$errors["password2"] = $this->app->labels->get("passwords_are_not_equal");
}
// Email неверный
if (!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i", $email)) {
$errors["email"] = $this->app->labels->get("email_unavailable");
}
//TODO!!! Выборка из базы опт
$useropt = false;
if ($useropt) {
$errors["email"] = $this->app->labels->get("email_opt_exists");
}
if (empty($errors)) {
$user = new User();
$user->setType('client');
$user->setPassword($pass);
$user->setEmail($email);
$user->setExternalId(md5($user->getEmail()));
$user->setName($name);
$user->setSurname($surname);
$user->setPhone($phone);
$user->setIp($request->getClientIp());
$user->setCreated(time());
$user->setOpt($Auth->isOpt());
$user->setAds($request->get('ads')=='on' ? 1 : 0);
$em->persist($user);
$em->flush();
$userid = $user->getId();
$errors = [
"noerrors" => true,
"uesrid" => $userid,
];
$params = array(
"pass" => $pass,
"email" => $email,
"name" => $name,
"surname" => $surname,
"phone" => $phone,
);
$Mail->send($this->app->sett->get('sitename'), Env::mail_from(), $email, $this->app->labels->get("register_message_theme"), Func::mess_from_tmp($this->app->templates->get("register_message_template"), $params));
return new JsonResponse($errors);
} else {
return new JsonResponse($errors);
}
$data = array(
'email' => $values['email'],
'bd' => 1,
);
// Auth::login($user);
// Esputnik::addContact($user);
$params = array(
"type" => $url->p['type'],
"login" => $url->p['login'],
"gender" => $url->p['gender'],
"pass" => $url->p['pass'],
"email" => $url->p['email'],
"name" => $url->p['name'],
"patr" => $url->p['patr'],
"surname" => $url->p['surname'],
"phone" => $url->p['phone'],
"city" => $url->p['city'],
"address" => $url->p['address'],
);
$Mail->send($this->app->sett->get('sitename'), Env::mail_from(), $email, $this->app->labels->get("register_message_theme"), Func::mess_from_tmp($this->app->templates->get("register_message_template"), $params));
// @Func::mailhtml($sett['sitename'], Env::mail_from(), $url->p['email'], $labels["register_message_theme"], Func::mess_from_tmp($templates["register_message_template"], $params));
// @Func::mailhtml($sett['sitename'], Env::mail_from(), $sett['admin_email'], $labels["register_message_theme"], Func::mess_from_tmp($templates["register_message_template"], $params));
$errors = [];
return $this->json($errors);
}
return $this->render('registration/register.html.twig', [
'registrationForm' => $form->createView(),
]);
}
}