<?php
namespace App\Controller\Front;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use App\Repository\LocaleRepository;
use App\Repository\Currency\CurrencyRepository;
use App\Repository\Category\CategoryRepository;
use App\Repository\Testimonial\TestimonialRepository;
use App\Repository\Slide\SlideRepository;
use App\Repository\Newsletter\NewsletterRepository;
use App\Entity\Newsletter\Newsletter;
use App\Form\Newsletter\NewsletterType;
use Symfony\Component\HttpFoundation\Session\Session;
use App\Repository\Course\PlanRepository;
use App\Repository\Article\ServiceRepository;
use Knp\Component\Pager\PaginatorInterface;
use App\Entity\Booking\Booking;
use App\Form\Booking\BookingType;
class HomeController extends AbstractController
{
private SessionInterface $session;
private string $theme;
/**
* @param BannerRepository $bannerRepository
* @param Session $session
*/
public function __construct(SessionInterface $session)
{
$this->session = $session;
$this->theme = $this->session->get('theme', 'horse');
}
public function index(Request $request, PlanRepository $planRepository, ServiceRepository $serviceRepository, PaginatorInterface $paginator): Response
{
$localeCode = $request->getLocale();
$theme = $this->theme;
$booking = new Booking();
$form = $this->createForm(BookingType::class, $booking);
$plans = $planRepository->findPlans($localeCode, $theme);
$query = $serviceRepository->findServicesQuery($localeCode);
$services = $paginator->paginate($query, 1, 4);
$bookingForm = $form->createView();
return $this->render('front/home/index.html.twig', compact('plans', 'theme', 'services', 'bookingForm'));
}
public function changeTheme(Request $request): Response
{
/** @var Session $session */
$session = $request->getSession();
$session->set('theme', $request->query->get('theme'));
return new RedirectResponse($request->headers->get('referer'));
}
public function languages(Request $request, LocaleRepository $repository): Response
{
$languages = $repository->findAll();
$route = $request->get('route_name') ?? 'front_homepage';
$parameters = !empty($request->get('route_parameters')) ? json_decode($request->get('route_parameters'), true) : [];
return $this->render('front/home/languages.html.twig', compact('languages', 'route', 'parameters'));
}
public function currencies(Request $request, SessionInterface $session, CurrencyRepository $repository, $currency = null): Response
{
if (null !== $currency) {
$currency = $repository->findOneByCode($currency);
if ($currency && $ratio = $this->getCurrencyRatio($currency)) {
$session->set('currency.code', $currency->getCode());
$session->set('currency.ratio', $ratio);
}
$referer = $request->headers->get('referer');
return new RedirectResponse($referer);
}
if (!$session->has('currency.code') || empty($session->get('currency.code')) ) {
$defaultCurrencyCode = $this->getParameter('default_currency');
$currency = $repository->findOneByCode($defaultCurrencyCode);
if ($currency && $ratio = $this->getCurrencyRatio($currency)) {
$session->set('currency.code', $currency->getCode());
$session->set('currency.ratio', $ratio);
}
}
$selectedCurrency = $session->get('currency.code');
$currencies = $repository->findAll();
return $this->render('front/home/currencies.html.twig', compact('currencies', 'selectedCurrency'));
}
private function getCurrencyRatio($currency)
{
$exchangeRate = $currency->getExchangeRate();
return $exchangeRate && $exchangeRate->isEnabled() ? $exchangeRate->getRatio() : false;
}
public function menu(Request $request, CategoryRepository $repository, $type): Response
{
$localeCode = $request->getLocale();
$categories = $repository->getCategories($localeCode);
return $this->render("front/includes/menu-$type-categories.html.twig", compact('categories'));
}
public function slides(Request $request, SlideRepository $repository, $page = 'home'): Response
{
$localeCode = $request->getLocale();
$theme = $request->getSession()->get('theme', 'horse');
$slides = $repository->findSlides($localeCode, $page, $theme);
return $this->render('front/home/slides.html.twig', compact('slides'));
}
public function newsletter(Request $request, NewsletterRepository $repository): Response
{
$newsletter = new Newsletter();
$form = $this->createForm(NewsletterType::class, $newsletter);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$exist = $repository->findOneByEmail($newsletter->getEmail());
if (!$exist) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($newsletter);
$entityManager->flush();
}
$referer = $request->headers->get('referer');
return $this->redirect($referer);
}
$newsletterForm = $form->createView();
$sidebar = $request->query->has('type') ? '_' . $request->query->get('type') : '';
return $this->render('front/includes/newsletter' . $sidebar . '.html.twig', compact('newsletterForm'));
}
public function testimonials(Request $request, TestimonialRepository $testimonialRepository, $mode = 'dark'): Response
{
$localeCode = $request->getLocale();
$testimonials = $testimonialRepository->recentTestimonials($localeCode);
return $this->render('front/includes/testimonial.html.twig', compact('testimonials', 'mode'));
}
}