Ejemplo n.º 1
-1
 /**
  * Обработка изменений полей врача перед сохранением для изменения рейтинга и шкалы заполненности профайла
  * @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);
             }
         }
     }
 }
Ejemplo n.º 2
-1
 /**
  * Показывает регистрационную форму если 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'));
     }
 }