X-Git-Url: https://git.rapsys.eu/airbundle/blobdiff_plain/15942fb7067e4cf984d70d50e4dfee925e74740b..d2ee346ded5b153cb2eeb000daa18bcf7ff410cb:/Controller/DefaultController.php diff --git a/Controller/DefaultController.php b/Controller/DefaultController.php index f119ee3..11597f6 100644 --- a/Controller/DefaultController.php +++ b/Controller/DefaultController.php @@ -13,6 +13,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Form\FormError; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Mailer\Exception\TransportExceptionInterface; use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mime\Address; @@ -25,7 +26,10 @@ use Symfony\Component\DependencyInjection\ContainerAwareTrait; class DefaultController { - use ControllerTrait; + use ControllerTrait { + //Rename render as _render + render as protected _render; + } ///Config array protected $config; @@ -67,8 +71,11 @@ class DefaultController { //Set the context $this->context = [ 'copy' => [ + 'by' => $translator->trans($this->config['copy']['by']), + 'link' => $this->config['copy']['link'], 'long' => $translator->trans($this->config['copy']['long']), - 'short' => $translator->trans($this->config['copy']['short']) + 'short' => $translator->trans($this->config['copy']['short']), + 'title' => $this->config['copy']['title'] ], 'site' => [ 'ico' => $this->config['site']['ico'], @@ -79,7 +86,8 @@ class DefaultController { 'url' => $router->generate($this->config['site']['url']), ], 'canonical' => null, - 'alternates' => [] + 'alternates' => [], + 'forms' => [] ]; //Get current locale @@ -139,7 +147,7 @@ class DefaultController { * * @return Response The rendered view or redirection */ - public function contact(Request $request, MailerInterface $mailer) { + public function contact(Request $request, MailerInterface $mailer): Response { //Set section $section = $this->translator->trans('Contact'); @@ -220,6 +228,131 @@ class DefaultController { return $this->render('@RapsysAir/form/contact.html.twig', ['title' => $title, 'section' => $section, 'form' => $form->createView(), 'sent' => $request->query->get('sent', 0)]+$this->context); } + + /** + * The dispute page + * + * @desc Generate a dispute document + * + * @param Request $request The request instance + * @param MailerInterface $mailer The mailer instance + * + * @return Response The rendered view or redirection + */ + public function dispute(Request $request, MailerInterface $mailer): Response { + //Prevent non-guest to access here + $this->denyAccessUnlessGranted('ROLE_USER', null, $this->translator->trans('Unable to access this page without role %role%!', ['%role%' => $this->translator->trans('User')])); + //Set section + $section = $this->translator->trans('Dispute'); + + //Set description + $this->context['description'] = $this->translator->trans('Libre Air dispute'); + + //Set keywords + $this->context['keywords'] = [ + $this->translator->trans('dispute'), + $this->translator->trans('Libre Air'), + $this->translator->trans('outdoor'), + $this->translator->trans('Argentine Tango'), + $this->translator->trans('calendar') + ]; + + //Set title + $title = $this->translator->trans($this->config['site']['title']).' - '.$section; + + //Create the form according to the FormType created previously. + //And give the proper parameters + $form = $this->createForm('Rapsys\AirBundle\Form\DisputeType', null, [ + 'action' => $this->generateUrl('rapsys_air_dispute'), + 'method' => 'POST' + ]); + + if ($request->isMethod('POST')) { + // Refill the fields in case the form is not valid. + $form->handleRequest($request); + + if ($form->isValid()) { + //Get data + $data = $form->getData(); + + header('Content-Type: text/plain'); + + //Infraction + var_dump($data['offense']); + + //Numéro d'avis + var_dump($data['notice']); + + //Numéro d'agent + var_dump($data['agent']); + + //Code service + var_dump($data['service']); + + //Masque porté + var_dump($data['mask']); + + //Civilité + var_dump($this->translator->trans($this->getUser()->getCivility()->getTitle())); + + //Prénom + var_dump($this->getUser()->getForename()); + + //Nom + var_dump($this->getUser()->getSurname()); + + //Mail + var_dump($this->getUser()->getMail()); + + exit; + +# //Create message +# $message = (new TemplatedEmail()) +# //Set sender +# ->from(new Address($data['mail'], $data['name'])) +# //Set recipient +# //XXX: remove the debug set in vendor/symfony/mime/Address.php +46 +# ->to(new Address($this->config['contact']['mail'], $this->config['contact']['name'])) +# //Set subject +# ->subject($data['subject']) +# +# //Set path to twig templates +# ->htmlTemplate('@RapsysAir/mail/contact.html.twig') +# ->textTemplate('@RapsysAir/mail/contact.text.twig') +# +# //Set context +# ->context( +# [ +# 'subject' => $data['subject'], +# 'message' => strip_tags($data['message']), +# ]+$this->context +# ); +# +# //Try sending message +# //XXX: mail delivery may silently fail +# try { +# //Send message +# $mailer->send($message); +# +# //Redirect on the same route with sent=1 to cleanup form +# return $this->redirectToRoute($request->get('_route'), ['sent' => 1]+$request->get('_route_params')); +# //Catch obvious transport exception +# } catch(TransportExceptionInterface $e) { +# if ($message = $e->getMessage()) { +# //Add error message mail unreachable +# $form->get('mail')->addError(new FormError($this->translator->trans('Unable to contact: %mail%: %message%', ['%mail%' => $this->config['contact']['mail'], '%message%' => $this->translator->trans($message)]))); +# } else { +# //Add error message mail unreachable +# $form->get('mail')->addError(new FormError($this->translator->trans('Unable to contact: %mail%', ['%mail%' => $this->config['contact']['mail']]))); +# } +# } + } + } + + //Render template + return $this->render('@RapsysAir/form/dispute.html.twig', ['title' => $title, 'section' => $section, 'form' => $form->createView(), 'sent' => $request->query->get('sent', 0)]+$this->context); + } + /** * The index page * @@ -229,7 +362,7 @@ class DefaultController { * * @return Response The rendered view */ - public function index(Request $request) { + public function index(Request $request): Response { //Fetch doctrine $doctrine = $this->getDoctrine(); @@ -251,42 +384,6 @@ class DefaultController { //Set title $title = $this->translator->trans($this->config['site']['title']).' - '.$section; - //Init context - $context = []; - - //Create application form for role_guest - if ($this->isGranted('ROLE_GUEST')) { - //Create ApplicationType form - $application = $this->createForm('Rapsys\AirBundle\Form\ApplicationType', null, [ - //Set the action - 'action' => $this->generateUrl('rapsys_air_application_add'), - //Set the form attribute - 'attr' => [ 'class' => 'col' ], - //Set admin - 'admin' => $this->isGranted('ROLE_ADMIN'), - //Set default user to current - 'user' => $this->getUser()->getId(), - //Set default slot to evening - //XXX: default to Evening (3) - 'slot' => $doctrine->getRepository(Slot::class)->findOneById(3) - ]); - - //Add form to context - $context['application'] = $application->createView(); - //Create login form for anonymous - } elseif (!$this->isGranted('IS_AUTHENTICATED_REMEMBERED')) { - //Create ApplicationType form - $login = $this->createForm('Rapsys\UserBundle\Form\LoginType', null, [ - //Set the action - 'action' => $this->generateUrl('rapsys_user_login'), - //Set the form attribute - 'attr' => [ 'class' => 'col' ] - ]); - - //Add form to context - $context['login'] = $login->createView(); - } - //Compute period $period = new \DatePeriod( //Start from first monday of week @@ -294,7 +391,9 @@ class DefaultController { //Iterate on each day new \DateInterval('P1D'), //End with next sunday and 4 weeks - new \DateTime('Monday this week + 5 week') + new \DateTime( + $this->isGranted('IS_AUTHENTICATED_REMEMBERED')?'Monday this week + 3 week':'Monday this week + 2 week' + ) ); //Fetch calendar @@ -302,10 +401,20 @@ class DefaultController { //Fetch locations //XXX: we want to display all active locations anyway - $locations = $doctrine->getRepository(Location::class)->findTranslatedSortedByPeriod($this->translator, $period/*, !$this->isGranted('IS_AUTHENTICATED_REMEMBERED')*/); + $locations = $doctrine->getRepository(Location::class)->findTranslatedSortedByPeriod($this->translator, $period); //Render the view - return $this->render('@RapsysAir/default/index.html.twig', ['title' => $title, 'section' => $section, 'calendar' => $calendar, 'locations' => $locations]+$context+$this->context); + return $this->render('@RapsysAir/default/index.html.twig', ['title' => $title, 'section' => $section, 'calendar' => $calendar, 'locations' => $locations]+$this->context); + + //Set Cache-Control must-revalidate directive + //TODO: add a javascript forced refresh after 1h ? or header refresh ? + #$response->setPublic(true); + #$response->setMaxAge(300); + #$response->mustRevalidate(); + ##$response->setCache(['public' => true, 'max_age' => 300]); + + //Return the response + #return $response; } /** @@ -315,7 +424,7 @@ class DefaultController { * * @return Response The rendered view */ - public function organizerRegulation() { + public function organizerRegulation(): Response { //Set section $section = $this->translator->trans('Organizer regulation'); @@ -342,7 +451,7 @@ class DefaultController { * * @return Response The rendered view */ - public function termsOfService() { + public function termsOfService(): Response { //Set section $section = $this->translator->trans('Terms of service'); @@ -362,12 +471,89 @@ class DefaultController { return $this->render('@RapsysAir/default/terms_of_service.html.twig', ['title' => $title, 'section' => $section]+$this->context); } + /** + * The frequently asked questions page + * + * @desc Display the frequently asked questions + * + * @return Response The rendered view + */ + public function frequentlyAskedQuestions(): Response { + //Set section + $section = $this->translator->trans('Frequently asked questions'); + + //Set description + $this->context['description'] = $this->translator->trans('Libre Air frequently asked questions'); + + //Set keywords + $this->context['keywords'] = [ + $this->translator->trans('frequently asked questions'), + $this->translator->trans('faq'), + $this->translator->trans('Libre Air') + ]; + + //Set title + $title = $this->translator->trans($this->config['site']['title']).' - '.$section; + + //Render template + return $this->render('@RapsysAir/default/frequently_asked_questions.html.twig', ['title' => $title, 'section' => $section]+$this->context); + } + /** * Return the bundle alias * * {@inheritdoc} */ - public function getAlias() { + public function getAlias(): string { return 'rapsys_air'; } + + /** + * Renders a view + * + * {@inheritdoc} + */ + protected function render(string $view, array $parameters = [], Response $response = null): Response { + //Create application form for role_guest + if ($this->isGranted('ROLE_GUEST')) { + //Without application form + if (empty($parameters['forms']['application'])) { + //Fetch doctrine + $doctrine = $this->getDoctrine(); + + //Create ApplicationType form + $application = $this->createForm('Rapsys\AirBundle\Form\ApplicationType', null, [ + //Set the action + 'action' => $this->generateUrl('rapsys_air_application_add'), + //Set the form attribute + 'attr' => [ 'class' => 'col' ], + //Set admin + 'admin' => $this->isGranted('ROLE_ADMIN'), + //Set default user to current + 'user' => $this->getUser()->getId(), + //Set default slot to evening + //XXX: default to Evening (3) + 'slot' => $doctrine->getRepository(Slot::class)->findOneById(3) + ]); + + //Add form to context + $parameters['forms']['application'] = $application->createView(); + } + //Create login form for anonymous + } elseif (!$this->isGranted('IS_AUTHENTICATED_REMEMBERED')) { + //Create ApplicationType form + $login = $this->createForm('Rapsys\UserBundle\Form\LoginType', null, [ + //Set the action + 'action' => $this->generateUrl('rapsys_user_login'), + //Set the form attribute + 'attr' => [ 'class' => 'col' ] + ]); + + //Add form to context + $parameters['forms']['login'] = $login->createView(); + } + + //Call parent method + return $this->_render($view, $parameters, $response); + } }