<?php
namespace App\Controller\Home;
use App\Entity\Countdown;
use App\Entity\Image;
use App\Entity\Map;
use App\Entity\Ticket;
use App\Entity\User;
use App\Entity\Weather;
use App\Form\CountdownFileType;
use App\Form\CountdownFromBackgroundType;
use App\Form\ExtTicketType;
use App\Form\ImageFileType;
use App\Form\ImageFromBackgroundType;
use App\Form\WeatherFileType;
use App\Form\WeatherFromBackgroundType;
use App\Repository\CountdownBackgroundRepository;
use App\Repository\DateRuleRepository;
use App\Repository\ImageBackgroundRepository;
use App\Repository\ImageRepository;
use App\Repository\ItemRepository;
use App\Repository\ProductRepository;
use App\Repository\TimeRuleRepository;
use App\Repository\WeatherBackgroundRepository;
use App\Repository\WeekRuleRepository;
use App\Service\Cart\CartService;
use App\Service\Countdown\CountdownService;
use App\Service\DateTimeRules\DateRuleService;
use App\Service\DateTimeRules\TimeRuleService;
use App\Service\DateTimeRules\WeekRuleService;
use App\Service\Image\ImageService;
use App\Service\Ticket\TicketService;
use App\Service\TomTomMapService;
use App\Service\uploadService;
use App\Service\Weather\WeatherService;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Serializer\SerializerInterface;
use function GuzzleHttp\default_user_agent;
class HomeController extends AbstractController
{
/**
* @Route("/", name="root")
*/
public function root(){
$this -> redirectToRoute( 'root_perso');
}
/**
* @Route("/{_locale}/", name="root_lng", requirements={"_locale"="en|fr"})
*/
public function root_lng(){
return $this -> redirectToRoute( 'root_perso');
}
/**
* @Route("/{_locale}/root", name="root_perso",)
*/
public function root_perso(CartService $cartService, TicketService $ticketService, ProductRepository $productRepository){
//Si le user est connecté direction home
$user = $this -> getUser();
if( $this->isGranted('ROLE_USER') ) {
return $this->redirectToRoute('projects', [
'cart' => $cartService->getCart()
]);
}
//Sinon on le retourne sur presentations
else{
return $this->redirectToRoute( 'presentation');
}
}
/**
* @Route("/{_locale}/projects", name="projects", requirements={"_locale"="en|fr"})
*/
public function index(CartService $cartService, TicketService $ticketService, FlashBagInterface $flashBag,
ItemRepository $itemRepository, PaginatorInterface $paginator, Request $request,
uploadService $uploadService, ImageService $imageService, CountdownService $countdownService,
WeatherService $weatherService,TomTomMapService $tomTomMapService,
WeekRuleRepository $weekRuleRepository, WeekRuleService $weekRuleService,
DateRuleRepository $dateRuleRepository, DateRuleService $dateRuleService,
TimeRuleRepository $timeRuleRepository,TimeRuleService $timeRuleService){
//Affichage des images
/** @var User $user */
$user = $this-> getUser();
$itemsQuery = $itemRepository -> findBy(['user' => $user,'deleteDate' => null],['updateDate' => 'DESC']);
foreach ($itemsQuery as $item){
switch ($item->getType()){
case 'image' :
/** @var Image $item */
$item -> setUrl($imageService -> getImageUrl($item));
break ;
case 'countdown' :
/** @var Countdown $item */
$item -> setUrl($countdownService -> getCountdownUrl($item));
break;
case 'weather' :
/** @var Weather $item */
$item -> setUrl($weatherService -> getWeatherUrl($item));
break;
case 'map':
/** @var Map $item */
$item -> setUrl($tomTomMapService -> getMapDisplayUrl($item));
break;
}
}
$items = $paginator ->paginate(
$itemsQuery,
$request -> query ->getInt('pageitem',1),
5,
['pageParameterName' => 'pageitem']
);
//Affichage des rules
$dateRules = $dateRuleRepository -> findBy(['user' => $user,'deleteDate' => null],['createDate' => 'DESC']);
foreach ($dateRules as $dateRule){
$dateRule -> setUrl($dateRuleService->getDateRuleUrl($dateRule));
}
$weekRules = $weekRuleRepository -> findBy(['user' => $user,'deleteDate' => null],['createDate' => 'DESC']);
foreach ($weekRules as $weekRule){
$weekRule -> setUrl($weekRuleService->getWeekRuleUrl($weekRule));
}
$timeRules = $timeRuleRepository -> findBy(['user' => $user,'deleteDate' => null],['createDate' => 'DESC']);
foreach ($timeRules as $timeRule){
$timeRule -> setUrl($timeRuleService->getTimeRuleUrl($timeRule));
}
$sortedRules = array_merge($dateRules,$weekRules,$timeRules);
//Tri par date
function ruleDateSort($a, $b){
if ( $a->getUpdateDate() == $b->getUpdateDate() ){
return 0;
}
return ( $a->getUpdateDate() > $b->getUpdateDate() ) ? -1 : 1 ;
}
uasort($sortedRules,'App\Controller\Home\ruleDateSort');
$rules = $paginator ->paginate(
$sortedRules,
$request -> query ->getInt('pagerule',1),
5,
['pageParameterName' => 'pagerule']
);
//Affichage des phrases au hazar
$randomSentences = [
"La météo est au beau fixe chez nos clients. Et chez vous, un test en prévision ?",
"Les comptes à rebours ont la cote. Il est plus que temps d'y penser !",
"Les plans rencontrent un grand succès auprès de nos utilisateurs. Un bon plan pour vous ?",
"Le sur-mesure est le nec plus ultra du mail français. Et si vous faisiez appel à l'équipe ?"
];
$rand_key = array_rand($randomSentences, 1);
/*
$cookies = $request -> cookies;
if (!$cookies->has('oldConnect'))
{
$response->headers->setCookie(new Cookie('oldConnect', time(), strtotime('now +15 days')) );
}
*/
$stimPlusCount = $weekRuleRepository -> count(['user' => $user,'deleteDate' => null ]);
$stimPlusCount += $dateRuleRepository -> count(['user' => $user,'deleteDate' => null ]);
$stimPlusCount += $timeRuleRepository -> count(['user' => $user,'deleteDate' => null ]);
return $this->render('/home/home.html.twig',
[
'items' => $items,
'rules' => $rules,
'cart' => $cartService->getCart(),
'countTicket' => $ticketService->getCountTicket(),
'stimCount' => $itemRepository -> count(['user' => $user,'deleteDate' => null ]),
'stimPlusCount' => $stimPlusCount,
'phrasePerso' => $randomSentences[$rand_key],
'controlOpenModal' => $flashBag->get('open-modal')
]
);
}
/**
* @Route("/{_locale}/projects_test", name="projects_test", requirements={"_locale"="en|fr"})
*/
public function project_test(CartService $cartService, TicketService $ticketService, FlashBagInterface $flashBag,
ItemRepository $itemRepository, PaginatorInterface $paginator, Request $request,
uploadService $uploadService, ImageService $imageService, CountdownService $countdownService,
WeatherService $weatherService,TomTomMapService $tomTomMapService){
//Affichage des images
/** @var User $user */
$user = $this-> getUser();
$items = $itemRepository -> findBy(['user' => $user,'deleteDate' => null],['createDate' => 'DESC']);
foreach ($items as $item){
switch ($item->getType()){
case 'image' :
/** @var Image $item */
$item -> setUrl($imageService -> getImageUrl($item));
break ;
case 'countdown' :
/** @var Countdown $item */
$item -> setUrl($countdownService -> getCountdownUrl($item));
break;
case 'weather' :
/** @var Weather $item */
$item -> setUrl($weatherService -> getWeatherUrl($item));
break;
case 'map':
/** @var Map $item */
$item -> setUrl('Pas encore défini !');
break;
}
}
$response = $this->render('/home/projects_test.html.twig',
[
'items' => $items,
'cart' => $cartService->getCart(),
'countTicket' => $ticketService->getCountTicket(),
]
);
$cookies = $request -> cookies;
if (!$cookies->has('oldConnect'))
{
$response->headers->setCookie(new Cookie('oldConnect', time(), strtotime('now +15 days')) );
}
return $response;
}
/**
* @Route("/{_locale}/images_json", name="images_json", requirements={"_locale"="en|fr"})
*/
public function item_json( ImageRepository $imageRepository,
ImageService $imageService,SerializerInterface $serializer){
//Affichage des images
/** @var User $user */
$user = $this-> getUser();
$images = $imageRepository -> findBy(['user' => $user,'deleteDate' => null],['createDate' => 'DESC']);
$jsonData = array();
foreach ($images as $image){
$jsonData[] = array(
'id' => $image -> getId(),
'cryptId' => $image -> getCryptId(),
'name' => $image -> getName(),
'file_name' => $image -> getFileName(),
'extension' => $image -> getExtension(),
'viewImages' => count( $image -> getViewImages() ),
'url' => $imageService -> getImageRelativeUrl($image),
'createDate' => $image -> getCreateDate(),
'updateDate' => $image -> getUpdateDate(),
'deleteDate' => $image -> getDeleteDate()
);
}
$jsonObject = $serializer -> serialize( $images, 'json',[
'circular_reference_handler' => function ($object) {
return $object->getId();
},
'ignored_attributes' => ['customImageFields,']
]);
return new Response($jsonObject, 200, ['Content-Type' => 'application/json']);
}
/**
* @Route("/{_locale}/home/new/project", name="new_project", requirements={"_locale"="en|fr"})
*/
public function new_project(Request $request, uploadService $uploadService,
CartService $cartService, TicketService $ticketService,
CountdownBackgroundRepository $countdownBackgroundRepository,
WeatherBackgroundRepository $weatherBackgroundRepository,
ImageBackgroundRepository $imageBackgroundRepository){
/** @var User $user */
$user = $this -> getUser();
//upload de l'image
//Formulaire d'upload (modal)
$imageForm = $this->createForm(ImageFileType::class);
$imageForm->handleRequest($request);
//Si formulaire ok on enregistre la nouvelle image
if( $imageForm->isSubmitted() && $imageForm->isValid() ){
if ($new_image_file = $imageForm -> get('ImageFileToUpload') -> getData() ){
$new_image_object = $uploadService -> uploadImage( $user,$new_image_file,$imageForm->get('name')->getData());
return $this->redirectToRoute('edit_image', ['cryptId' => $new_image_object -> getCryptId()]);
}
}
//Upload du countdown
//Formulaire d'upload (modal)
$countdownForm = $this->createForm(CountdownFileType::class);
$countdownForm->handleRequest($request);
//Si formulaire ok on enregistre le nouveau countdown
if( $countdownForm->isSubmitted() && $countdownForm->isValid() ){
if ($new_countdown_file = $countdownForm -> get('CountdownFileToUpload') -> getData() ){
$new_bdd_countdown = $uploadService -> uploadCountdown( $user,$new_countdown_file, $countdownForm->get('name')->getData() );
return $this->redirectToRoute('edit_countdown', ['cryptId' => $new_bdd_countdown-> getCryptId()]);
}
}
//Upload du weather
//Formulaire d'upload (modal)
$weatherForm = $this->createForm(WeatherFileType::class);
$weatherForm->handleRequest($request);
//Si formulaire ok on enregistre le nouveau countdown
if( $weatherForm->isSubmitted() && $weatherForm->isValid() ){
if ($new_weather_file = $weatherForm -> get('WeatherFileToUpload') -> getData() ){
$new_bdd_weather = $uploadService -> uploadWeather( $user,$new_weather_file, $weatherForm->get('name')->getData() );
return $this->redirectToRoute('edit_weather', ['cryptId' => $new_bdd_weather-> getCryptId()]);
}
}
//Choix d'un fond countdown
$countdownBackgroundForm = $this -> createForm( CountdownFromBackgroundType::class);
$countdownBackgroundForm->handleRequest($request);
//Si formulaire ok on enregistre le nouveau countdown
if( $countdownBackgroundForm->isSubmitted() && $countdownBackgroundForm->isValid() ){
$new_bdd_countdown = $uploadService -> uploadCountdownFromBackground(
$user,
$countdownBackgroundForm->get('countdownBackground')->getData(),
$countdownBackgroundForm->get('name')->getData()
);
return $this->redirectToRoute('edit_countdown', ['cryptId' => $new_bdd_countdown-> getCryptId()]);
}
//Choix d'un fond weather
$weatherBackgroundForm = $this -> createForm( WeatherFromBackgroundType::class);
$weatherBackgroundForm -> handleRequest($request);
//Si formulaire ok on enregistre le nouveau countdown
if( $weatherBackgroundForm->isSubmitted() && $weatherBackgroundForm->isValid() ){
$new_bdd_weather = $uploadService -> uploadWeatherFromBackground(
$user,
$weatherBackgroundForm->get('weatherBackground')->getData(),
$weatherBackgroundForm->get('name')->getData()
);
return $this->redirectToRoute('edit_weather', ['cryptId' => $new_bdd_weather-> getCryptId()]);
}
//Choix d'un fond image
$imageBackgroundForm = $this -> createForm( ImageFromBackgroundType::class);
$imageBackgroundForm -> handleRequest($request);
//Si formulaire ok on enregistre le nouvelle image
if( $imageBackgroundForm->isSubmitted() && $imageBackgroundForm->isValid() ){
$new_bdd_image = $uploadService -> uploadImageFromBackground(
$user,
$imageBackgroundForm->get('imageBackground')->getData(),
$imageBackgroundForm->get('name')->getData()
);
return $this->redirectToRoute('edit_image', ['cryptId' => $new_bdd_image-> getCryptId()]);
}
return $this->render('home/new_project.html.twig', [
'imageForm' => $imageForm->createView(),
'countdownForm' => $countdownForm->createView(),
'weatherForm' => $weatherForm->createView(),
'countdownBackgroundForm' => $countdownBackgroundForm->createView(),
'weatherBackgroundForm' => $weatherBackgroundForm->createView(),
'imageBackgroundForm' => $imageBackgroundForm -> createView(),
'countdownBackgrounds' => $countdownBackgroundRepository->findBy(['deletedate' => null]),
'weatherBackgrounds' => $weatherBackgroundRepository->findBy(['deleteDate' => null]),
'imageBackgrounds' => $imageBackgroundRepository->findBy(['deleteDate' => null ]),
'cart' => $cartService->getCart(),
'countTicket' => $ticketService->getCountTicket()
]);
}
/**
* @Route("/{_locale}/home/new/rule", name="new_rule", requirements={"_locale"="en|fr"})
*/
public function new_rule(Request $request, uploadService $uploadService, CartService $cartService, TicketService $ticketService){
$user = $this -> getUser();
return $this->render('home/new_rule.html.twig', [
'cart' => $cartService->getCart(),
'countTicket' => $ticketService->getCountTicket()
]);
}
/**
* @Route("/{_locale}/presentation", name="presentation" , requirements={"_locale"="en|fr"})
*/
public function presentation(CartService $cartService, Request $request,
ExtTicketType $extTicketType, EntityManagerInterface $em,
FlashBagInterface $flashBag, ProductRepository $productRepository){
//Retourne directement sur la page home si connecté.
if( $this->isGranted('ROLE_USER') ) {
return $this->redirectToRoute('home');
}
//Création du ticket et du formulaire de ticket
$ticket = new Ticket();
$form = $this -> createForm( ExtTicketType::class, $ticket);
$form -> handleRequest( $request );
//Si le formulaire est envoyé et validé
if($form->isSubmitted() && $form -> isValid()) {
/** @var Ticket $ticket */
$ticket = $form->getData();
$ticket->setType('EXT');
$ticket->setCreateDate(new \DateTime('NOW'));
$em->persist($ticket);
$em->flush();
//On crée un nouveau formulaire vide
$newTicket = new Ticket();
$newform = $this -> createForm( ExtTicketType::class, $newTicket);
return $this->render('home/presentation.html.twig',[
'ticketForm' => $newform -> createView(),
'formSuccessMessage' => '<p><strong>Votre message a bien été envoyé !</strong><br/>Nous reviendrons vers vous très rapidement.</p>',
'products' => $productRepository->findAll(),
'link' => $this -> ge
]);
}
return $this->render('/home/presentation.html.twig',[
'ticketForm' => $form -> createView(),
'formSuccessMessage' => null,
'products' => $productRepository->findAll(),
'now' => new \DateTime('now'),
]);
}
/**
* @Route("/{_locale}/presentation/demo/{demo}", name="presentation_demo" , requirements={"_locale"="en|fr"})
*/
public function demo($demo, Request $request){
if ($request->isXmlHttpRequest()) {
$demoTitles = ['banque',
'boutique1',
'boutique2',
'boutique3',
'boutique4',
'assurances',
'fondation',
'fidelite',
'luxe',
];
if (in_array($demo, $demoTitles)) {
return new Response(
$this->render('/home/demo/' . $demo . '.html.twig')->getContent()
);
} else {
return $this->createNotFoundException();
}
}else{
return $this->createAccessDeniedException();
}
}
}