/** * Обработка изменений полей врача перед сохранением для изменения рейтинга и шкалы заполненности профайла * @param Doctor $doctor * @param PreUpdateEventArgs $args */ public function changeDoctor(Doctor $doctor, PreUpdateEventArgs $args) { # изменение рейтинговых полей foreach ($this->ratingFields as $field => $bonus) { # если рейтинговое поле изменилось if ($args->hasChangedField($field)) { $new = $args->getNewValue($field); $old = $args->getOldValue($field); # если поле заполнили - добавляем баллы в рейтинг. Если очистили - снимаем. if (empty($old) && !empty($new)) { $doctor->addRating($bonus); } elseif (empty($new) && !empty($old) && !is_array($old)) { $doctor->subRating($bonus); } } } $filledBonus = intval(100 / count($this->filledFields)); // = 5 # изменение полей, влияющих на заполненность профайла foreach ($this->filledFields as $field) { if ($args->hasChangedField($field)) { $new = $args->getNewValue($field); $old = $args->getOldValue($field); # если поле заполнили - заполняем шкалу профиля, иначе снимаем if (empty($old) && !empty($new)) { $doctor->addFilled($filledBonus); } elseif (empty($new) && !empty($old) && !is_array($old)) { $doctor->subFilled($filledBonus); } } } }
/** * Показывает регистрационную форму если HTTP-метод GET. Обрабатывает форму если HTTP-метод POST * * @Route("/register/{campaign}", name = "register", requirements = {"campaign" = "1"}, defaults = {"campaign" = null}) */ public function registerAction($campaign = null) { $em = $this->getDoctrine()->getManager(); if ($this->get('security.context')->isGranted('IS_AUTHENTICATED_REMEMBERED')) { return $this->redirect($this->generateUrl('_welcome')); } else { $request = $this->getRequest(); $doctor = new Doctor(); if (!$request->isMethod('POST') && isset($_GET['user'])) { $doctor->setProvider($_GET['user']['provider']); $doctor->setSocialId($_GET['user']['socialId']); $doctor->setLastName(explode(' ', $_GET['user']['name'])[0]); $doctor->setFirstName(explode(' ', $_GET['user']['name'])[1]); if (isset($_GET['user']['email'])) { $doctor->setUsername($_GET['user']['email']); } } $cityToStringTransformer = new cityToStringTransformer($em); $yearToNumberTransformer = new YearToNumberTransformer($em); $years = array(); for ($i = date('Y') + 5; $i > date('Y') - 70; $i--) { $years[$i] = $i; } $builder = $this->createFormBuilder($doctor); $builder->add('username', null, array('label' => 'E-mail'))->add('password', 'repeated', array('type' => 'password', 'invalid_message' => 'Пароли должны совпадать', 'options' => array('attr' => array('class' => 'password-field')), 'required' => true, 'first_options' => array('label' => 'Придумайте пароль'), 'second_options' => array('label' => 'Повторите пароль')))->add('lastName', null, array('label' => 'Фамилия'))->add('firstName', null, array('label' => 'Имя'))->add('surName', null, array('label' => 'Отчество', 'required' => false))->add('birthdate', null, array('label' => 'Дата рождения', 'required' => true, 'widget' => 'single_text', 'format' => 'dd.MM.yyyy', 'invalid_message' => 'Дата указана неверно. Формат: 31.01.1970', 'years' => range(date('Y') - 120, date('Y') - 18), 'attr' => array('class' => 'input-calendar', 'placeholder' => 'дд.мм.гггг')))->add($builder->create('city', 'text', array('label' => 'Город'))->addModelTransformer($cityToStringTransformer))->add('university', null, array('label' => 'ВУЗ', 'required' => true, 'empty_value' => 'выберите'))->add('student', null, array('label' => 'Являюсь студентом'))->add($builder->create('graduateYear', 'choice', array('label' => 'Год окончания ВУЗа', 'choices' => $years, 'empty_value' => 'выберите'))->addModelTransformer($yearToNumberTransformer))->add('primarySpecialty', null, array('label' => 'Основная специальность', 'empty_value' => 'выберите'))->add('academicDegree', 'choice', array('label' => 'Ученая степень', 'choices' => Doctor::getAcademicDegrees(), 'empty_value' => 'выберите'))->add('jobType', 'choice', array('label' => 'Место работы', 'choices' => Doctor::getJobTypes(), 'empty_value' => 'выберите'))->add('jobAlignment', 'choice', array('label' => 'Вид организации', 'choices' => Doctor::getJobAlignments(), 'empty_value' => 'выберите'))->add('eula', 'checkbox', array('label' => 'Я согласен(на) c <a target="_blank" href="{{ path("eula") }}">пользовательским соглашением</a>', 'mapped' => false, 'constraints' => new True(array('message' => 'Пожалуйста, подтвердите что вы согласны с пользовательским соглашением'))))->add('socialId', 'hidden')->add('provider', 'hidden'); $form = $builder->getForm(); if ($request->isMethod('POST')) { $form->bind($request); if ($form->isValid()) { $doctor = $form->getData(); try { if (empty($request->request->get('form')['eula'])) { throw new \UnexpectedValueException('Пожалуйста, подтвердите что вы согласны с пользовательским соглашением'); } $birthdate = $doctor->getBirthdate(); $pw = $doctor->getPassword(); if ($birthdate->format('Y') < date('Y') - 120 || $birthdate->format('Y') > date('Y') - 18) { $form->get('birthdate')->addError(new FormError('Недопустимо использовать такой год')); } elseif (!preg_match('/^[a-z0-9\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)\\-\\+\\=\\[\\]\\{\\}\\\\|\\/\\.\\,\\?\\:\\;\\~\\`]{8,50}$/i', $pw)) { $form->addError(new FormError('Пароль должен быть от 8 до 50 символов и состоять из латинских букв, цифр или символов')); } else { $em->persist($doctor); // подписываем пользователя на сообщество $doctor->addCommunity($doctor->getPrimarySpecialty()); $doctor->setHash($this->calculateHash($doctor)); // подписываем пользователя на главного редактора (если он найден) $mainEditor = $em->getRepository('EvrikaMainBundle:Doctor')->findMainEditor(); if ($mainEditor) { $doctor->addLeaders($mainEditor); } $this->resetToken($doctor); $em->flush(); $em->refresh($doctor); # отправка регистрационного письма $this->sendRegistration($doctor); $message = \Swift_Message::newInstance()->setSubject('Новый пользователь')->setContentType('text/html')->setCharset('utf-8')->setFrom('*****@*****.**', 'Уведомление «Evrika.ru»')->setTo($this->container->getParameter('manager_emails'))->setCc("*****@*****.**")->setBody($this->renderView('EvrikaMainBundle:Email:registration_notice.html.twig', array('user' => $doctor))); $this->get('mailer')->send($message); $session = $request->getSession(); $session->getFlashBag()->add('registered', ''); return $this->redirect($this->generateUrl('doctor_test')); } } catch (\UnexpectedValueException $e) { $formError = new FormError($e->getMessage()); $form->addError($formError); } } } return $this->render('EvrikaMainBundle:Auth:registration_page.html.twig', array('regBegins' => true, 'registration_form' => $form->createView(), 'layout' => $campaign ? 'EvrikaMainBundle::guest_layout.html.twig' : 'EvrikaMainBundle::limited_layout.html.twig')); } }