src/Controller/DefaultController.php line 195

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\AdditionalForm;
  4. use App\Entity\Contact;
  5. use App\Entity\News;
  6. use App\Form\AdditionalFormType;
  7. use App\Form\ContactType;
  8. use DateTime;
  9. use Doctrine\ORM\Tools\Pagination\Paginator;
  10. use ReCaptcha\ReCaptcha;
  11. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  16. use Symfony\Component\Mailer\MailerInterface;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. class DefaultController extends AbstractController
  19. {
  20.     /**
  21.      * Home page.
  22.      *
  23.      * @Route("/", name="home")
  24.      * @param Request $request
  25.      * @return Response
  26.      */
  27.     public function index(Request $request): Response
  28.     {
  29.         return $this->render('Default/' $request->getLocale() . '/index.html.twig');
  30.     }
  31.     /**
  32.      * Test page.
  33.      *
  34.      * @Route("/test", name="test")
  35.      * @param Request $request
  36.      * @return Response
  37.      */
  38.     public function new(Request $request): Response
  39.     {
  40.         return $this->render('test.html.twig');
  41.     }
  42.     /**
  43.      * Services page.
  44.      *php app/console assets:install target [--symlink]
  45.      * @Route("/services", name="services")
  46.      * @param Request $request
  47.      * @return Response
  48.      */
  49.     public function services(Request $request): Response
  50.     {
  51.         return $this->render('Default/' $request->getLocale() . '/services.html.twig');
  52.     }
  53.     /**
  54.      * Why page.
  55.      *
  56.      * @Route("/why", name="why")
  57.      * @param Request $request
  58.      * @return Response
  59.      */
  60.     public function why(Request $request): Response
  61.     {
  62.         return $this->render('Default/' $request->getLocale() . '/why.html.twig');
  63.     }
  64.     /**
  65.      * About page.
  66.      *
  67.      * @Route("/about", name="about")
  68.      * @param Request $request
  69.      * @return Response
  70.      */
  71.     public function about(Request $request): Response
  72.     {
  73.         return $this->render('Default/' $request->getLocale() . '/about.html.twig');
  74.     }
  75.     /**
  76.      * Antivandalism page.
  77.      *
  78.      * @Route("/antivandalism", name="antivandalism")
  79.      * @param Request $request
  80.      * @return Response
  81.      */
  82.     public function antivandalism(Request $request): Response
  83.     {
  84.         if($request->getLocale() != 'ru')
  85.         {
  86.             return $this->redirectToRoute('home');
  87.         }
  88.         return $this->render('Default/' $request->getLocale() . '/antivandalism.html.twig', [
  89.             'meta_title' => 'Защита репутации - WikiExperts',
  90.         ]);
  91.     }
  92.     /**
  93.      * News page.
  94.      * @Route("/news", name="news")
  95.      * @param Request $request
  96.      * @return Response
  97.      */
  98.     public function news(Request $request): Response
  99.     {
  100.         $page $request->get('page'1);
  101.         $page $page $page 1;
  102.         $pageItems 1;
  103.         $news $this->getDoctrine()->getRepository(News::class)->createQueryBuilder('n');
  104.         $news
  105.             ->orderBy('n.date''DESC')
  106.             ->andWhere('n.language = :lang')
  107.             ->andWhere('n.isLive = 1')
  108.             ->setParameter('lang'$request->getLocale())
  109.             ->setMaxResults($pageItems);
  110.         $paginator = new Paginator($news->getQuery(), $fetchJoinCollection false);
  111.         $pages ceil(count($paginator) / $pageItems);
  112.         $page $page $pages $page;
  113.         $news->setFirstResult(($page 1) * $pageItems);
  114.         return $this->render('Default/news.html.twig', [
  115.             'news' => $news->getQuery()->getResult(),
  116.             'page' => $page,
  117.             'pages' => $pages,
  118.         ]);
  119.     }
  120.     /**
  121.      * @Route ("/news/{slug}", name="news_view")
  122.      * @param Request $request
  123.      * @param $slug
  124.      * @return Response
  125.      */
  126.     public function newsItem(Request $request$slug): Response
  127.     {
  128.         $news $this->getDoctrine()->getRepository(News::class)->findOneBy(['slug' => $slug]);
  129.         if(!$news)
  130.         {
  131.             throw $this->createNotFoundException('News not found');
  132.         }
  133.         return $this->render('Default/news_view.html.twig', [
  134.             'news' => $news,
  135.             'meta_title' => $news->getTitle(),
  136.         ]);
  137.     }
  138.     /**
  139.      * FAQ page.
  140.      *
  141.      * @Route("/faq", name="faq")
  142.      * @param Request $request
  143.      * @return Response
  144.      */
  145.     public function faq(Request $request): Response
  146.     {
  147.         return $this->render('Default/' $request->getLocale() . '/faq.html.twig', []);
  148.     }
  149.     /**
  150.      * Ethics page.
  151.      *
  152.      * @Route("/ethics", name="ethics")
  153.      * @param Request $request
  154.      * @return Response
  155.      */
  156.     public function ethics(Request $request): Response
  157.     {
  158.         return $this->render('Default/' $request->getLocale() . '/ethics.html.twig');
  159.     }
  160.     /**
  161.      * Contact page.
  162.      *
  163.      * @Route("/contact", name="contact")
  164.      * @param Request $request
  165.      * @return Response
  166.      */
  167.     public function contact(Request $request): Response
  168.     {
  169.         return $this->render('Default/' $request->getLocale() . '/contact.html.twig');
  170.     }
  171.     public function form(Request $request): Response
  172.     {
  173.         $form $this->createForm(ContactType::class, new Contact);
  174.         return $this->render('Default/' $request->getLocale() . '/form.html.twig', array('form' => $form->createView()));
  175.     }
  176.     /**
  177.      * Contact form submit action.
  178.      *
  179.      * @Route("/contact_submit", name="contact_submit")
  180.      * @param Request $request
  181.      * @param MailerInterface $mailer
  182.      * @return Response
  183.      * @throws TransportExceptionInterface
  184.      */
  185.     public function contactSubmit(Request $requestMailerInterface $mailer): Response
  186.     {
  187.         $entityManager $this->getDoctrine()->getManager();
  188.         $entity = new Contact;
  189.         $form $this->createForm(ContactType::class, $entity);
  190.         if($request->isMethod('POST'))
  191.         {
  192.             $form->handleRequest($request);
  193.             if($_ENV['GOOGLE_RECAPTCHA_ENABLED'] === 'true')
  194.             {
  195.                 $recaptcha = new ReCaptcha($_ENV['GOOGLE_RECAPTCHA_SECRET']);
  196.                 $response $recaptcha
  197.                     ->setExpectedAction('contact')
  198.                     ->setScoreThreshold(0)
  199.                     ->verify($form->get('recaptcha')->getData());
  200.                 if(!($response->isSuccess() && $response->getScore() >= $_ENV['GOOGLE_RECAPTCHA_SCORE']))
  201.                 {
  202.                     return new Response('reCAPTCHA Token Validation Error'403);
  203.                 }
  204.             }
  205.             if($form->isSubmitted() && $form->isValid())
  206.             {
  207.                 $entity->setIp($_SERVER['REMOTE_ADDR']);
  208.                 $entity->setUrl('http://' str_ireplace(['http://''https://'], [''''], $entity->getUrl()));
  209.                 $entity->setCreatedAt(new DateTime());
  210.                 $entityManager->persist($entity);
  211.                 $entityManager->flush();
  212.                 //send to email
  213.                 $email = (new TemplatedEmail())
  214.                     ->from($this->getParameter('app.admin_email'))
  215.                     ->to($this->getParameter('app.admin_email'))
  216.                     ->subject('Response to your inquiry about visibility in Wikipedia')
  217.                     ->htmlTemplate('Default/emails/form.html.twig')
  218.                     ->context([
  219.                         'contact' => $entity,
  220.                     ]);
  221.                 $mailer->send($email);
  222.                 //send reply message
  223.                 $email = (new TemplatedEmail())
  224.                     ->from($this->getParameter('app.admin_email'))
  225.                     ->to($entity->getEmail())
  226.                     ->subject('Your Wikipedia Visibility Inquiry')
  227.                     ->htmlTemplate('Default/emails/reply.html.twig')
  228.                     ->context([
  229.                         'recipient' => $entity,
  230.                     ]);
  231.                 $mailer->send($email);
  232.                 $request->getSession()->set('contact_form_id'$entity->getId());
  233.                 $request->getSession()->set('contact_form_data'serialize($entity));
  234.                 return new Response($this->generateUrl($request->getLocale() == 'ru' 'contact_success' 'contact_additional'), 302);
  235.             }
  236.             else
  237.             {
  238.                 return $this->render('Default/' $request->getLocale() . '/form.html.twig', [
  239.                     'form' => $form->createView(),
  240.                 ]);
  241.             }
  242.         }
  243.         return $this->redirectToRoute('home');
  244.     }
  245.     /**
  246.      * @Route("/additional", name="contact_additional")
  247.      * @param Request $request
  248.      * @param MailerInterface $mailer
  249.      * @return Response
  250.      * @throws TransportExceptionInterface
  251.      */
  252.     public function additional(Request $requestMailerInterface $mailer): Response
  253.     {
  254.         if(!$request->getSession()->get('contact_form_id'))
  255.         {
  256.             return $this->redirectToRoute('home');
  257.         }
  258.         $em $this->getDoctrine()->getManager();
  259.         $entity = new AdditionalForm();
  260.         $form $this->createForm(AdditionalFormType::class, $entity);
  261.         if($request->isMethod('POST'))
  262.         {
  263.             $form->handleRequest($request);
  264.             if($form->isSubmitted() && $form->isValid())
  265.             {
  266.                 $contact $em->getRepository(Contact::class)
  267.                     ->find($request->getSession()->get('contact_form_id'));
  268.                 $entity->setContact($contact);
  269.                 if($entity->getUrl())
  270.                 {
  271.                     $entity->setUrl('http://' str_ireplace(['http://''https://'], [''''], $entity->getUrl()));
  272.                 }
  273.                 $em->persist($entity);
  274.                 $em->flush();
  275.                 $email = (new TemplatedEmail())
  276.                     ->from($this->getParameter('app.admin_email'))
  277.                     ->to($this->getParameter('app.admin_email'))
  278.                     ->subject('Response to your inquiry about visibility in Wikipedia')
  279.                     ->htmlTemplate('Default/emails/additionalForm.html.twig')
  280.                     ->context([
  281.                         'contact' => $entity,
  282.                         'sove_form' => unserialize($request->getSession()->get('contact_form_data')),
  283.                     ]);
  284.                 $mailer->send($email);
  285.                 $request->getSession()->set('contact_form_id'null);
  286.                 $request->getSession()->set('contact_form_data'null);
  287.                 return $this->redirect($this->generateUrl('contact_success'));
  288.             }
  289.             else
  290.             {
  291.                 return $this->render('Default/additional_form.html.twig', [
  292.                     'form' => $form->createView(),
  293.                 ]);
  294.             }
  295.         }
  296.         return $this->render('Default/additional_form.html.twig', [
  297.             'form' => $form->createView(),
  298.         ]);
  299.     }
  300.     /**
  301.      * Contact success action.
  302.      *
  303.      * @Route("/contact_success", name="contact_success")
  304.      * @param Request $request
  305.      * @return Response
  306.      */
  307.     public function contactSuccess(Request $request): Response
  308.     {
  309.         return $this->render('Default/' $request->getLocale() . '/contact_success.html.twig');
  310.     }
  311.     /**
  312.      * Skype status action.
  313.      *
  314.      * @Route("/skype_status", name="skype_status")
  315.      * @param Request $request
  316.      * @return Response
  317.      */
  318.     public function skypeStatusAction(Request $request): Response
  319.     {
  320.         $ctx stream_context_create(array('http' =>
  321.             array(
  322.                 'timeout' => // 20 minutes
  323.             )
  324.         ));
  325.         if(!$data = @file_get_contents('http://mystatus.skype.com/jc.wikiexpert.num'false$ctx))
  326.         {
  327.             $data '2';
  328.         }
  329.         return new Response($data);
  330.     }
  331. }