- <?php
- 
- namespace App\Controller;
- 
- use App\Entity\AdditionalForm;
- use App\Entity\Contact;
- use App\Entity\News;
- use App\Form\AdditionalFormType;
- use App\Form\ContactType;
- use DateTime;
- use Doctrine\ORM\Tools\Pagination\Paginator;
- use ReCaptcha\ReCaptcha;
- use Symfony\Bridge\Twig\Mime\TemplatedEmail;
- use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Component\HttpFoundation\Response;
- use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
- use Symfony\Component\Mailer\MailerInterface;
- use Symfony\Component\Routing\Annotation\Route;
- 
- class DefaultController extends AbstractController
- {
-     /**
-      * Home page.
-      *
-      * @Route("/", name="home")
-      * @param Request $request
-      * @return Response
-      */
-     public function index(Request $request): Response
-     {
-         return $this->render('Default/' . $request->getLocale() . '/index.html.twig');
-     }
- 
- 
-     /**
-      * Test page.
-      *
-      * @Route("/test", name="test")
-      * @param Request $request
-      * @return Response
-      */
-     public function new(Request $request): Response
-     {
-         return $this->render('test.html.twig');
-     }
- 
-     /**
-      * Services page.
-      *php app/console assets:install target [--symlink]
-      * @Route("/services", name="services")
-      * @param Request $request
-      * @return Response
-      */
-     public function services(Request $request): Response
-     {
-         return $this->render('Default/' . $request->getLocale() . '/services.html.twig');
-     }
- 
-     /**
-      * Why page.
-      *
-      * @Route("/why", name="why")
-      * @param Request $request
-      * @return Response
-      */
-     public function why(Request $request): Response
-     {
-         return $this->render('Default/' . $request->getLocale() . '/why.html.twig');
-     }
- 
-     /**
-      * About page.
-      *
-      * @Route("/about", name="about")
-      * @param Request $request
-      * @return Response
-      */
-     public function about(Request $request): Response
-     {
-         return $this->render('Default/' . $request->getLocale() . '/about.html.twig');
-     }
- 
-     /**
-      * Antivandalism page.
-      *
-      * @Route("/antivandalism", name="antivandalism")
-      * @param Request $request
-      * @return Response
-      */
-     public function antivandalism(Request $request): Response
-     {
-         if($request->getLocale() != 'ru')
-         {
-             return $this->redirectToRoute('home');
-         }
- 
-         return $this->render('Default/' . $request->getLocale() . '/antivandalism.html.twig', [
-             'meta_title' => 'Защита репутации - WikiExperts',
-         ]);
-     }
- 
-     /**
-      * News page.
-      * @Route("/news", name="news")
-      * @param Request $request
-      * @return Response
-      */
-     public function news(Request $request): Response
-     {
-         $page = $request->get('page', 1);
- 
-         $page = $page ? $page : 1;
- 
-         $pageItems = 1;
- 
-         $news = $this->getDoctrine()->getRepository(News::class)->createQueryBuilder('n');
-         $news
-             ->orderBy('n.date', 'DESC')
-             ->andWhere('n.language = :lang')
-             ->andWhere('n.isLive = 1')
-             ->setParameter('lang', $request->getLocale())
-             ->setMaxResults($pageItems);
- 
-         $paginator = new Paginator($news->getQuery(), $fetchJoinCollection = false);
-         $pages = ceil(count($paginator) / $pageItems);
- 
-         $page = $page > $pages ? 1 : $page;
- 
-         $news->setFirstResult(($page - 1) * $pageItems);
-         return $this->render('Default/news.html.twig', [
-             'news' => $news->getQuery()->getResult(),
-             'page' => $page,
-             'pages' => $pages,
-         ]);
-     }
- 
-     /**
-      * @Route ("/news/{slug}", name="news_view")
-      * @param Request $request
-      * @param $slug
-      * @return Response
-      */
-     public function newsItem(Request $request, $slug): Response
-     {
-         $news = $this->getDoctrine()->getRepository(News::class)->findOneBy(['slug' => $slug]);
- 
-         if(!$news)
-         {
-             throw $this->createNotFoundException('News not found');
-         }
- 
-         return $this->render('Default/news_view.html.twig', [
-             'news' => $news,
-             'meta_title' => $news->getTitle(),
-         ]);
-     }
- 
-     /**
-      * FAQ page.
-      *
-      * @Route("/faq", name="faq")
-      * @param Request $request
-      * @return Response
-      */
-     public function faq(Request $request): Response
-     {
-         return $this->render('Default/' . $request->getLocale() . '/faq.html.twig', []);
-     }
- 
-     /**
-      * Ethics page.
-      *
-      * @Route("/ethics", name="ethics")
-      * @param Request $request
-      * @return Response
-      */
-     public function ethics(Request $request): Response
-     {
-         return $this->render('Default/' . $request->getLocale() . '/ethics.html.twig');
-     }
- 
-     /**
-      * Contact page.
-      *
-      * @Route("/contact", name="contact")
-      * @param Request $request
-      * @return Response
-      */
-     public function contact(Request $request): Response
-     {
-         return $this->render('Default/' . $request->getLocale() . '/contact.html.twig');
-     }
- 
-     public function form(Request $request): Response
-     {
-         $form = $this->createForm(ContactType::class, new Contact);
-         return $this->render('Default/' . $request->getLocale() . '/form.html.twig', array('form' => $form->createView()));
-     }
- 
-     /**
-      * Contact form submit action.
-      *
-      * @Route("/contact_submit", name="contact_submit")
-      * @param Request $request
-      * @param MailerInterface $mailer
-      * @return Response
-      * @throws TransportExceptionInterface
-      */
-     public function contactSubmit(Request $request, MailerInterface $mailer): Response
-     {
-         $entityManager = $this->getDoctrine()->getManager();
-         $entity = new Contact;
-         $form = $this->createForm(ContactType::class, $entity);
- 
-         if($request->isMethod('POST'))
-         {
-             $form->handleRequest($request);
- 
-             if($_ENV['GOOGLE_RECAPTCHA_ENABLED'] === 'true')
-             {
-                 $recaptcha = new ReCaptcha($_ENV['GOOGLE_RECAPTCHA_SECRET']);
-                 $response = $recaptcha
-                     ->setExpectedAction('contact')
-                     ->setScoreThreshold(0)
-                     ->verify($form->get('recaptcha')->getData());
- 
-                 if(!($response->isSuccess() && $response->getScore() >= $_ENV['GOOGLE_RECAPTCHA_SCORE']))
-                 {
-                     return new Response('reCAPTCHA Token Validation Error', 403);
-                 }
-             }
- 
-             if($form->isSubmitted() && $form->isValid())
-             {
-                 $entity->setIp($_SERVER['REMOTE_ADDR']);
-                 $entity->setUrl('http://' . str_ireplace(['http://', 'https://'], ['', ''], $entity->getUrl()));
-                 $entity->setCreatedAt(new DateTime());
- 
-                 $entityManager->persist($entity);
-                 $entityManager->flush();
- 
-                 //send to email
-                 $email = (new TemplatedEmail())
-                     ->from($this->getParameter('app.admin_email'))
-                     ->to($this->getParameter('app.admin_email'))
-                     ->subject('Response to your inquiry about visibility in Wikipedia')
-                     ->htmlTemplate('Default/emails/form.html.twig')
-                     ->context([
-                         'contact' => $entity,
-                     ]);
- 
-                 $mailer->send($email);
- 
-                 //send reply message
-                 $email = (new TemplatedEmail())
-                     ->from($this->getParameter('app.admin_email'))
-                     ->to($entity->getEmail())
-                     ->subject('Your Wikipedia Visibility Inquiry')
-                     ->htmlTemplate('Default/emails/reply.html.twig')
-                     ->context([
-                         'recipient' => $entity,
-                     ]);
- 
- 
-                 $mailer->send($email);
- 
-                 $request->getSession()->set('contact_form_id', $entity->getId());
-                 $request->getSession()->set('contact_form_data', serialize($entity));
- 
-                 return new Response($this->generateUrl($request->getLocale() == 'ru' ? 'contact_success' : 'contact_additional'), 302);
-             }
-             else
-             {
-                 return $this->render('Default/' . $request->getLocale() . '/form.html.twig', [
-                     'form' => $form->createView(),
-                 ]);
-             }
-         }
- 
-         return $this->redirectToRoute('home');
-     }
- 
-     /**
-      * @Route("/additional", name="contact_additional")
-      * @param Request $request
-      * @param MailerInterface $mailer
-      * @return Response
-      * @throws TransportExceptionInterface
-      */
-     public function additional(Request $request, MailerInterface $mailer): Response
-     {
-         if(!$request->getSession()->get('contact_form_id'))
-         {
-             return $this->redirectToRoute('home');
-         }
- 
-         $em = $this->getDoctrine()->getManager();
-         $entity = new AdditionalForm();
-         $form = $this->createForm(AdditionalFormType::class, $entity);
- 
-         if($request->isMethod('POST'))
-         {
-             $form->handleRequest($request);
- 
-             if($form->isSubmitted() && $form->isValid())
-             {
-                 $contact = $em->getRepository(Contact::class)
-                     ->find($request->getSession()->get('contact_form_id'));
- 
-                 $entity->setContact($contact);
- 
-                 if($entity->getUrl())
-                 {
-                     $entity->setUrl('http://' . str_ireplace(['http://', 'https://'], ['', ''], $entity->getUrl()));
-                 }
- 
-                 $em->persist($entity);
-                 $em->flush();
- 
-                 $email = (new TemplatedEmail())
-                     ->from($this->getParameter('app.admin_email'))
-                     ->to($this->getParameter('app.admin_email'))
-                     ->subject('Response to your inquiry about visibility in Wikipedia')
-                     ->htmlTemplate('Default/emails/additionalForm.html.twig')
-                     ->context([
-                         'contact' => $entity,
-                         'sove_form' => unserialize($request->getSession()->get('contact_form_data')),
-                     ]);
- 
-                 $mailer->send($email);
- 
-                 $request->getSession()->set('contact_form_id', null);
-                 $request->getSession()->set('contact_form_data', null);
- 
-                 return $this->redirect($this->generateUrl('contact_success'));
-             }
-             else
-             {
-                 return $this->render('Default/additional_form.html.twig', [
-                     'form' => $form->createView(),
-                 ]);
-             }
-         }
- 
-         return $this->render('Default/additional_form.html.twig', [
-             'form' => $form->createView(),
-         ]);
-     }
- 
-     /**
-      * Contact success action.
-      *
-      * @Route("/contact_success", name="contact_success")
-      * @param Request $request
-      * @return Response
-      */
-     public function contactSuccess(Request $request): Response
-     {
-         return $this->render('Default/' . $request->getLocale() . '/contact_success.html.twig');
-     }
- 
-     /**
-      * Skype status action.
-      *
-      * @Route("/skype_status", name="skype_status")
-      * @param Request $request
-      * @return Response
-      */
-     public function skypeStatusAction(Request $request): Response
-     {
-         $ctx = stream_context_create(array('http' =>
-             array(
-                 'timeout' => 2 // 20 minutes
-             )
-         ));
- 
-         if(!$data = @file_get_contents('http://mystatus.skype.com/jc.wikiexpert.num', false, $ctx))
-         {
-             $data = '2';
-         }
- 
-         return new Response($data);
-     }
- }
-