3 namespace Rapsys\AirBundle\Controller
; 
   5 use Symfony\Bridge\Twig\Mime\TemplatedEmail
; 
   6 use Symfony\Component\DependencyInjection\ContainerAwareTrait
; 
   7 use Symfony\Component\DependencyInjection\ContainerInterface
; 
   8 use Symfony\Component\Form\FormError
; 
   9 use Symfony\Component\HttpFoundation\Request
; 
  10 use Symfony\Component\HttpFoundation\RequestStack
; 
  11 use Symfony\Component\HttpFoundation\Response
; 
  12 use Symfony\Component\Mailer\Exception\TransportExceptionInterface
; 
  13 use Symfony\Component\Mailer\MailerInterface
; 
  14 use Symfony\Component\Mime\Address
; 
  15 use Symfony\Component\Routing\RouterInterface
; 
  16 use Symfony\Component\Translation\TranslatorInterface
; 
  18 use Rapsys\AirBundle\Entity\Location
; 
  19 use Rapsys\AirBundle\Entity\Session
; 
  20 use Rapsys\AirBundle\Pdf\DisputePdf
; 
  22 class DefaultController 
extends AbstractController 
{ 
  26         ///ContainerInterface instance 
  35         ///Translator instance 
  36         protected $translator; 
  45          * Inject container, router and translator interface 
  47          * @param ContainerInterface $container The container instance 
  48          * @param RouterInterface $router The router instance 
  49          * @param TranslatorInterface $translator The translator instance 
  51         public function __construct(ContainerInterface 
$container, RouterInterface 
$router, TranslatorInterface 
$translator) { 
  53                 $this->config 
= $container->getParameter(self
::getAlias()); 
  56                 $this->container 
= $container; 
  59                 $this->router 
= $router; 
  62                 $this->translator 
= $translator; 
  67                                 'title' => $translator->trans($this->config
['contact']['title']), 
  68                                 'mail' => $this->config
['contact']['mail'] 
  71                                 'by' => $translator->trans($this->config
['copy']['by']), 
  72                                 'link' => $this->config
['copy']['link'], 
  73                                 'long' => $translator->trans($this->config
['copy']['long']), 
  74                                 'short' => $translator->trans($this->config
['copy']['short']), 
  75                                 'title' => $this->config
['copy']['title'] 
  78                                 'description' => null, 
  83                                 'donate' => $this->config
['site']['donate'], 
  84                                 'ico' => $this->config
['site']['ico'], 
  85                                 'logo' => $this->config
['site']['logo'], 
  86                                 'png' => $this->config
['site']['png'], 
  87                                 'svg' => $this->config
['site']['svg'], 
  88                                 'title' => $translator->trans($this->config
['site']['title']), 
  89                                 'url' => $router->generate($this->config
['site']['url']) 
  95                                         'og' => 'http://ogp.me/ns#', 
  96                                         'fb' => 'http://ogp.me/ns/fb#' 
  99                                         'og:type' => 'article', 
 100                                         'og:site_name' => $this->translator
->trans($this->config
['site']['title']), 
 101                                         #'fb:admins' => $this->config['facebook']['admins'], 
 102                                         'fb:app_id' => $this->config
['facebook']['apps'] 
 113          * @desc Display the about informations 
 115          * @param Request $request The request instance 
 116          * @return Response The rendered view 
 118         public function about(Request 
$request): Response 
{ 
 120                 $this->context
['page']['title'] = $this->translator
->trans('About'); 
 123                 $this->context
['page']['description'] = $this->translator
->trans('Libre Air about'); 
 126                 $this->context
['keywords'] = [ 
 127                         $this->translator
->trans('about'), 
 128                         $this->translator
->trans('Libre Air') 
 132                 $response = $this->render('@RapsysAir/default/about.html.twig', $this->context
); 
 133                 $response->setEtag(md5($response->getContent())); 
 134                 $response->setPublic(); 
 135                 $response->isNotModified($request); 
 144          * @desc Send a contact mail to configured contact 
 146          * @param Request $request The request instance 
 147          * @param MailerInterface $mailer The mailer instance 
 149          * @return Response The rendered view or redirection 
 151         public function contact(Request 
$request, MailerInterface 
$mailer): Response 
{ 
 153                 $this->context
['page']['title'] = $this->translator
->trans('Contact'); 
 156                 $this->context
['page']['description'] = $this->translator
->trans('Contact Libre Air'); 
 159                 $this->context
['keywords'] = [ 
 160                         $this->translator
->trans('contact'), 
 161                         $this->translator
->trans('Libre Air'), 
 162                         $this->translator
->trans('outdoor'), 
 163                         $this->translator
->trans('Argentine Tango'), 
 164                         $this->translator
->trans('calendar') 
 167                 //Create the form according to the FormType created previously. 
 168                 //And give the proper parameters 
 169                 $form = $this->createForm('Rapsys\AirBundle\Form\ContactType', null, [ 
 170                         'action' => $this->generateUrl('rapsys_air_contact'), 
 174                 if ($request->isMethod('POST')) { 
 175                         // Refill the fields in case the form is not valid. 
 176                         $form->handleRequest($request); 
 178                         if ($form->isValid()) { 
 180                                 $data = $form->getData(); 
 183                                 $message = (new TemplatedEmail()) 
 185                                         ->from(new Address($data['mail'], $data['name'])) 
 187                                         ->to(new Address($this->context
['contact']['mail'], $this->context
['contact']['title'])) 
 189                                         ->subject($data['subject']) 
 191                                         //Set path to twig templates 
 192                                         ->htmlTemplate('@RapsysAir/mail/contact.html.twig') 
 193                                         ->textTemplate('@RapsysAir/mail/contact.text.twig') 
 198                                                         'subject' => $data['subject'], 
 199                                                         'message' => strip_tags($data['message']), 
 203                                 //Try sending message 
 204                                 //XXX: mail delivery may silently fail 
 207                                         $mailer->send($message); 
 209                                         //Redirect on the same route with sent=1 to cleanup form 
 210                                         return $this->redirectToRoute($request->get('_route'), ['sent' => 1]+
$request->get('_route_params')); 
 211                                 //Catch obvious transport exception 
 212                                 } catch(TransportExceptionInterface 
$e) { 
 213                                         if ($message = $e->getMessage()) { 
 214                                                 //Add error message mail unreachable 
 215                                                 $form->get('mail')->addError(new FormError($this->translator
->trans('Unable to contact: %mail%: %message%', ['%mail%' => $this->context
['contact']['mail'], '%message%' => $this->translator
->trans($message)]))); 
 217                                                 //Add error message mail unreachable 
 218                                                 $form->get('mail')->addError(new FormError($this->translator
->trans('Unable to contact: %mail%', ['%mail%' => $this->context
['contact']['mail']]))); 
 225                 return $this->render('@RapsysAir/form/contact.html.twig', ['form' => $form->createView(), 'sent' => $request->query
->get('sent', 0)]+
$this->context
); 
 231          * @desc Generate a dispute document 
 233          * @param Request $request The request instance 
 234          * @param MailerInterface $mailer The mailer instance 
 236          * @return Response The rendered view or redirection 
 238         public function dispute(Request 
$request, MailerInterface 
$mailer): Response 
{ 
 239                 //Prevent non-guest to access here 
 240                 $this->denyAccessUnlessGranted('ROLE_USER', null, $this->translator
->trans('Unable to access this page without role %role%!', ['%role%' => $this->translator
->trans('User')])); 
 243                 $this->context
['page']['title'] = $this->translator
->trans('Dispute'); 
 246                 $this->context
['page']['description'] = $this->translator
->trans('Libre Air dispute'); 
 249                 $this->context
['keywords'] = [ 
 250                         $this->translator
->trans('dispute'), 
 251                         $this->translator
->trans('Libre Air'), 
 252                         $this->translator
->trans('outdoor'), 
 253                         $this->translator
->trans('Argentine Tango'), 
 254                         $this->translator
->trans('calendar') 
 257                 //Create the form according to the FormType created previously. 
 258                 //And give the proper parameters 
 259                 $form = $this->createForm('Rapsys\AirBundle\Form\DisputeType', ['court' => 'Paris', 'abstract' => 'Pour constater cette prétendue infraction, les agents verbalisateurs ont pénétré dans un jardin privatif, sans visibilité depuis la voie publique, situé derrière un batiment privé, pour ce faire ils ont franchi au moins un grillage de chantier ou des potteaux métalliques séparant le terrain privé de la voie publique de l\'autre cÓté du batiment.'], [ 
 260                         'action' => $this->generateUrl('rapsys_air_dispute'), 
 264                 if ($request->isMethod('POST')) { 
 265                         // Refill the fields in case the form is not valid. 
 266                         $form->handleRequest($request); 
 268                         if ($form->isValid()) { 
 270                                 $data = $form->getData(); 
 273                                 if (!empty($data['offense']) && $data['offense'] == 'gathering') { 
 275                                         $output = DisputePdf
::genGathering($data['court'], $data['notice'], $data['agent'], $data['service'], $data['abstract'], $this->translator
->trans($this->getUser()->getCivility()->getTitle()), $this->getUser()->getForename(), $this->getUser()->getSurname()); 
 277                                 } elseif (!empty($data['offense'] && $data['offense'] == 'traffic')) { 
 279                                         $output = DisputePdf
::genTraffic($data['court'], $data['notice'], $data['agent'], $data['service'], $data['abstract'], $this->translator
->trans($this->getUser()->getCivility()->getTitle()), $this->getUser()->getForename(), $this->getUser()->getSurname()); 
 280                                 //Unsupported offense 
 282                                         header('Content-Type: text/plain'); 
 287                                 //Send common headers 
 288                                 header('Content-Type: application/pdf'); 
 290                                 //Send remaining headers 
 291                                 header('Cache-Control: private, max-age=0, must-revalidate'); 
 292                                 header('Pragma: public'); 
 294                                 //Send content-length 
 295                                 header('Content-Length: '.strlen($output)); 
 304 #                               $message = (new TemplatedEmail()) 
 306 #                                       ->from(new Address($data['mail'], $data['name'])) 
 308 #                                       //XXX: remove the debug set in vendor/symfony/mime/Address.php +46 
 309 #                                       ->to(new Address($this->config['contact']['mail'], $this->config['contact']['title'])) 
 311 #                                       ->subject($data['subject']) 
 313 #                                       //Set path to twig templates 
 314 #                                       ->htmlTemplate('@RapsysAir/mail/contact.html.twig') 
 315 #                                       ->textTemplate('@RapsysAir/mail/contact.text.twig') 
 320 #                                                       'subject' => $data['subject'], 
 321 #                                                       'message' => strip_tags($data['message']), 
 325 #                               //Try sending message 
 326 #                               //XXX: mail delivery may silently fail 
 329 #                                       $mailer->send($message); 
 331 #                                       //Redirect on the same route with sent=1 to cleanup form 
 332 #                                       return $this->redirectToRoute($request->get('_route'), ['sent' => 1]+$request->get('_route_params')); 
 333 #                               //Catch obvious transport exception 
 334 #                               } catch(TransportExceptionInterface $e) { 
 335 #                                       if ($message = $e->getMessage()) { 
 336 #                                               //Add error message mail unreachable 
 337 #                                               $form->get('mail')->addError(new FormError($this->translator->trans('Unable to contact: %mail%: %message%', ['%mail%' => $this->config['contact']['mail'], '%message%' => $this->translator->trans($message)]))); 
 339 #                                               //Add error message mail unreachable 
 340 #                                               $form->get('mail')->addError(new FormError($this->translator->trans('Unable to contact: %mail%', ['%mail%' => $this->config['contact']['mail']]))); 
 347                 return $this->render('@RapsysAir/default/dispute.html.twig', ['form' => $form->createView(), 'sent' => $request->query
->get('sent', 0)]+
$this->context
); 
 353          * @desc Display all granted sessions with an application or login form 
 355          * @param Request $request The request instance 
 356          * @return Response The rendered view 
 358         public function index(Request 
$request): Response 
{ 
 360                 $doctrine = $this->getDoctrine(); 
 363                 $this->context
['page']['title'] = $this->translator
->trans('Argentine Tango in Paris'); 
 366                 $this->context
['page']['description'] = $this->translator
->trans('Outdoor Argentine Tango session calendar in Paris'); 
 369                 $this->context
['keywords'] = [ 
 370                         $this->translator
->trans('Argentine Tango'), 
 371                         $this->translator
->trans('Paris'), 
 372                         $this->translator
->trans('outdoor'), 
 373                         $this->translator
->trans('calendar'), 
 374                         $this->translator
->trans('Libre Air') 
 378                 //XXX: only valid for home page 
 379                 $this->context
['facebook']['metas']['og:type'] = 'website'; 
 382                 $period = new \
DatePeriod( 
 383                         //Start from first monday of week 
 384                         new \
DateTime('Monday this week'), 
 385                         //Iterate on each day 
 386                         new \
DateInterval('P1D'), 
 387                         //End with next sunday and 4 weeks 
 389                                 $this->isGranted('IS_AUTHENTICATED_REMEMBERED')?'Monday this week + 3 week':'Monday this week + 2 week' 
 394                 $calendar = $doctrine->getRepository(Session
::class)->fetchCalendarByDatePeriod($this->translator
, $period, null, $request->get('session'), !$this->isGranted('IS_AUTHENTICATED_REMEMBERED')); 
 397                 //XXX: we want to display all active locations anyway 
 398                 $locations = $doctrine->getRepository(Location
::class)->findTranslatedSortedByPeriod($this->translator
, $period); 
 401                 return $this->render('@RapsysAir/default/index.html.twig', ['calendar' => $calendar, 'locations' => $locations]+
$this->context
); 
 403                 //Set Cache-Control must-revalidate directive 
 404                 //TODO: add a javascript forced refresh after 1h ? or header refresh ? 
 405                 #$response->setPublic(true); 
 406                 #$response->setMaxAge(300); 
 407                 #$response->mustRevalidate(); 
 408                 ##$response->setCache(['public' => true, 'max_age' => 300]); 
 410                 //Return the response 
 415          * The organizer regulation page 
 417          * @desc Display the organizer regulation policy 
 419          * @param Request $request The request instance 
 420          * @return Response The rendered view 
 422         public function organizerRegulation(Request 
$request): Response 
{ 
 424                 $this->context
['page']['title'] = $this->translator
->trans('Organizer regulation'); 
 427                 $this->context
['page']['description'] = $this->translator
->trans('Libre Air organizer regulation'); 
 430                 $this->context
['keywords'] = [ 
 431                         $this->translator
->trans('organizer regulation'), 
 432                         $this->translator
->trans('Libre Air') 
 436                 $response = $this->render('@RapsysAir/default/organizer_regulation.html.twig', $this->context
); 
 439                 $response->setEtag(md5($response->getContent())); 
 440                 $response->setPublic(); 
 441                 $response->isNotModified($request); 
 448          * The terms of service page 
 450          * @desc Display the terms of service policy 
 452          * @param Request $request The request instance 
 453          * @return Response The rendered view 
 455         public function termsOfService(Request 
$request): Response 
{ 
 457                 $this->context
['page']['title'] = $this->translator
->trans('Terms of service'); 
 460                 $this->context
['page']['description'] = $this->translator
->trans('Libre Air terms of service'); 
 463                 $this->context
['keywords'] = [ 
 464                         $this->translator
->trans('terms of service'), 
 465                         $this->translator
->trans('Libre Air') 
 469                 $response = $this->render('@RapsysAir/default/terms_of_service.html.twig', $this->context
); 
 472                 $response->setEtag(md5($response->getContent())); 
 473                 $response->setPublic(); 
 474                 $response->isNotModified($request); 
 481          * The frequently asked questions page 
 483          * @desc Display the frequently asked questions 
 485          * @param Request $request The request instance 
 486          * @return Response The rendered view 
 488         public function frequentlyAskedQuestions(Request 
$request): Response 
{ 
 490                 $this->context
['page']['title'] = $this->translator
->trans('Frequently asked questions'); 
 493                 $this->context
['page']['description'] = $this->translator
->trans('Libre Air frequently asked questions'); 
 496                 $this->context
['keywords'] = [ 
 497                         $this->translator
->trans('frequently asked questions'), 
 498                         $this->translator
->trans('faq'), 
 499                         $this->translator
->trans('Libre Air') 
 503                 $response = $this->render('@RapsysAir/default/frequently_asked_questions.html.twig', $this->context
); 
 506                 $response->setEtag(md5($response->getContent())); 
 507                 $response->setPublic(); 
 508                 $response->isNotModified($request); 
 515          * Return the bundle alias 
 519         public function getAlias(): string { 
 528         /*protected function render(string $view, array $parameters = [], Response $response = null): Response { 
 530                 return parent::render($view, $parameters, $response);