<?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);
}
}