<?php
namespace App\Controller;
use App\Entity\ContactRequest;
use App\Entity\ContestRequest;
use App\Entity\Destination;
use App\Entity\Product;
use App\Entity\ProductRequest;
use App\Entity\SubscribedEmail;
use App\Form\ContactRequestType;
use App\Form\ContestRequestType;
use App\Form\ProductRequestType;
use App\Form\SubscribedEmailType;
use App\Services\EmailService;
use App\Services\PagesService;
use App\Services\ProductService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
class IndexController extends AbstractController
{
/**
* @Route(name="index", path="/")
* @param PagesService $pagesService
* @return Response
*/
public function index(PagesService $pagesService): Response
{
return $this->render('index/index.html.twig', [
'home' => $pagesService->getHome(),
'sliders' => $pagesService->getSliders(),
'services' => $pagesService->getServiceDescriptions()
]);
}
public function header(PagesService $pagesService): Response
{
return $this->render('structure/_header.html.twig', [
'header' => $pagesService->getHeader()
]);
}
public function footer(PagesService $pagesService): Response
{
$contestRequest = new ContestRequest();
$form = $this->createForm(ContestRequestType::class, $contestRequest);
$subscribedEmail = new SubscribedEmail();
$formEmail = $this->createForm(SubscribedEmailType::class, $subscribedEmail);
return $this->render('structure/_footer.html.twig', [
'footer' => $pagesService->getFooter(),
'contest' => $pagesService->getContest(),
'formContest' => $form->createView(),
'formSubscribed' => $formEmail->createView(),
'header' => $pagesService->getHeader()
]);
}
/**
* @Route(path="/contest/register", name="contestRegister", methods={"POST"})
* @param Request $request
* @param PagesService $pagesService
* @param TranslatorInterface $translator
* @return Response
*/
public function registerContest(Request $request, PagesService $pagesService, TranslatorInterface $translator): Response
{
$contestRequest = new ContestRequest();
$form = $this->createForm(ContestRequestType::class, $contestRequest);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$pagesService->registerContest($form->getData());
$session = $request->getSession();
$session->set('contest_send', true);
$session->save();
$this->addFlash('success', $translator->trans('app.footer.contest.success'));
}
return $this->redirectToRoute('index');
}
/**
* @Route(path="/subscribed/register", name="registerSubscribedEmail", methods={"POST"})
* @param Request $request
* @param PagesService $pagesService
* @param TranslatorInterface $translator
* @param EmailService $emailService
* @return Response
*/
public function registerSubscribedEmail(Request $request, PagesService $pagesService,
TranslatorInterface $translator, EmailService $emailService): Response
{
$email = new SubscribedEmail();
$form = $this->createForm(SubscribedEmailType::class, $email);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($emailId = $pagesService->registerSubscribedEmail($form->getData())) {
$emailService->sendSubscriptionNotification($emailId);
$this->addFlash('success', $translator->trans('app.footer.info.subscribe.success'));
} else {
$this->addFlash('error', $translator->trans('app.footer.info.subscribe.error'));
}
}
return $this->redirectToRoute('index');
}
/**
* @Route(path={"es": "/productos", "en": "/products"}, name="products")
* @param Request $request
* @param ProductService $productService
* @param PagesService $pagesService
* @return Response
*/
public function products(Request $request, ProductService $productService, PagesService $pagesService): Response
{
$page = $request->query->get('page', 1);
return $this->render('product/index.html.twig', [
'products' => $productService->products($page),
'pageContent' => $pagesService->getProducts()
]);
}
/**
* @Route(path={"es":"/producto/{id}/{name}", "en": "/product/{id}/{name}"}, name="product_details")
* @param Request $request
* @param Product $product
* @param ProductService $productService
* @param TranslatorInterface $translator
* @param EmailService $emailService
* @return Response
*/
public function productDetails(Request $request, Product $product, ProductService $productService,
TranslatorInterface $translator, EmailService $emailService): Response
{
$prodRequest = new ProductRequest();
$prodRequest->setProduct($product);
$form = $this->createForm(ProductRequestType::class, $prodRequest);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($requestId = $productService->registerRequest($form->getData())) {
$emailService->sendProductNotification($requestId);
$this->addFlash('success', $translator->trans('app.product.details.form.success'));
$productName = $product->getNameEs();
if ($request->getLocale() == 'en') {
$productName = $product->getNameEn();
}
$productName = strtolower($productName);
$productName = str_replace(' ', '-', $productName);
return $this->redirectToRoute('product_details', [
'id' => $product->getId(),
'name' => $productName
]);
} else {
$this->addFlash('error', $translator->trans('app.product.details.form.error'));
}
}
return $this->render('product/details.html.twig', [
'product' => $product,
'relatedProducts' => $productService->getRelated($product),
'form' => $form->createView()
]);
}
/**
* @Route(path={"es":"/destinos", "en":"/destinations"}, name="destinations")
* @param ProductService $productService
* @param PagesService $pagesService
* @return Response
*/
public function destinations(ProductService $productService, PagesService $pagesService): Response
{
return $this->render('destination/index.html.twig', [
'destinations' => $productService->getDestinations(),
'pageContent' => $pagesService->getDestinations()
]);
}
/**
* @Route(path={"es": "/detalles-destino/{id}/{name}", "en": "/destination-details/{id}/{name}"}, name="destinationDetails")
* @param Destination $destination
* @return Response
*/
public function destinationDetails(Destination $destination): Response
{
return $this->render('destination/details.html.twig', [
'destination' => $destination
]);
}
/**
* @Route(path={"es": "/sobre-nosotros", "en": "/about-us"}, name="aboutUs")
* @param PagesService $pagesService
* @return Response
*/
public function aboutUs(PagesService $pagesService): Response
{
return $this->render('about_us/index.html.twig', [
'pageContent' => $pagesService->getAboutUs(),
'testimonials' => $pagesService->getTestimonials(),
'services' => $pagesService->getServiceDescriptions(),
'homePage' => $pagesService->getHome(),
]);
}
/**
* @Route(path={"es": "/contacto", "en": "/contact"}, name="contactUs")
* @param Request $request
* @param PagesService $pagesService
* @param TranslatorInterface $translator
* @param EmailService $emailService
* @return Response
*/
public function contactUs(Request $request, PagesService $pagesService, TranslatorInterface $translator, EmailService $emailService): Response
{
$formRequest = new ContactRequest();
$form = $this->createForm(ContactRequestType::class, $formRequest);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($requestId = $pagesService->registerContactRequest($form->getData())) {
$emailService->sendContactNotification($requestId);
$this->addFlash('success', $translator->trans('app.contact.success'));
return $this->redirectToRoute('contactUs');
} else {
$this->addFlash('error', 'app.contact.error');
}
}
return $this->render('contact/index.html.twig', [
'pageContent' => $pagesService->getContact(),
'headerContent' => $pagesService->getHeader(),
'form' => $form->createView()
]);
}
/**
* @Route(path={"es":"/terminos-condiciones", "en": "/terms-conditions"}, name="terms")
* @param PagesService $pagesService
* @return Response
*/
public function terms(PagesService $pagesService): Response
{
return $this->render('info/terms.html.twig', [
'pageContent' => $pagesService->getTerms()
]);
}
/**
* @Route(path={"es": "/politica-privacidad", "en": "/privacy-policy"}, name="privacy")
* @param PagesService $pagesService
* @return Response
*/
public function privacy(PagesService $pagesService): Response
{
return $this->render('info/privacy.html.twig', [
'pageContent' => $pagesService->getPrivacy()
]);
}
/**
* @Route(path={"es": "/politica-cancelacion", "en": "/cancellation-policy"}, name="cancellations")
* @param PagesService $pagesService
* @return Response
*/
public function cancellation(PagesService $pagesService): Response
{
return $this->render('info/cancellation.html.twig', [
'pageContent' => $pagesService->getCancellation()
]);
}
}