src/Controller/EventController.php line 116

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Doctrine\Persistence\ManagerRegistry;
  7. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  8. use Symfony\Component\Messenger\MessageBusInterface;
  9. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  10. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  11. use Symfony\Component\Routing\Generator\UrlGenerator;
  12. use App\Entity\Event;
  13. use App\Entity\Media;
  14. use App\Entity\Period;
  15. use App\Form\SuggestEventType;
  16. use App\Controller\Admin\EventCrudController;
  17. use App\Message\HighPriorityEmail;
  18. // use Knp\Component\Pager\PaginatorInterface;
  19. class EventController extends AbstractController
  20. {
  21.     private $adminUrlGenerator;
  22.     public function __construct(AdminUrlGenerator $adminUrlGenerator)
  23.     {
  24.         $this->adminUrlGenerator $adminUrlGenerator;
  25.     }
  26.     
  27.     /**
  28.      * @Route("/evenement/{id}", name="showEvent", requirements={"id"="\d+"})
  29.      */
  30.     public function showEvent(Request $request$id)
  31.     {
  32.         $event $this->getDoctrine()->getRepository(Event::class)->find($id);
  33.         if (!$event) {
  34.             throw $this->createNotFoundException('Pas d\'évènement avec l\'id ' $id '.');
  35.     
  36.             // the above is just a shortcut for:
  37.             // throw new NotFoundHttpException('The product does not exist');
  38.         }
  39.         $slug $event->getSlug();
  40.         if($slug && $slug !== "") {
  41.             return $this->redirect($this->generateUrl('showEventBySlug', ['slug' => $slug]));
  42.         } else {
  43.             if(!$event->getPublished()) {
  44.                 $redirectUrl $this->_notPublished($request);
  45.                 if($redirectUrl) return $this->redirect($redirectUrl);
  46.             }
  47.             return $this->render('event/show.html.twig', [
  48.                 'event' => $event
  49.             ]);
  50.         }
  51.     }
  52.     
  53.     /**
  54.      * @Route("/evenement/{slug}", name="showEventBySlug")
  55.      */
  56.     public function showEventBySlug(Request $request$slug)
  57.     {
  58.         $event $this->getDoctrine()->getRepository(Event::class)->findOneBySlug($slug);
  59.         if (!$event) {
  60.             throw $this->createNotFoundException('Pas d\'évènement avec le slug "' $slug '".');
  61.         }
  62.         if(!$event->getPublished()) {
  63.             $redirectUrl $this->_notPublished($request);
  64.             if($redirectUrl) return $this->redirect($redirectUrl);
  65.         }
  66.         return $this->render('event/show.html.twig', [
  67.             'event' => $event
  68.         ]);
  69.     }
  70.     /**
  71.      * action if entity not published
  72.      * @return string $redirectUrl
  73.      */
  74.     private function _notPublished(Request $request) {
  75.         if(!$this->isGranted('ROLE_ADMIN')) {
  76.             $requestUri $request->getRequestUri();
  77.             $baseUrl $request->getSchemeAndHttpHost();
  78.             $this->addFlash(
  79.                 'error-popup',
  80.                 'L\'url demandée : "' $baseUrl $requestUri '" n\'existe pas.'
  81.             );
  82.             $referer $request->headers->get('referer');
  83.             if(null != $referer && substr($referer0strlen($baseUrl)) === $baseUrl) {
  84.                 // on retourne de là oú l'on vient, si l'on vient de ce site
  85.                 $redirectUrl substr($refererstrlen($baseUrl));
  86.             } else {
  87.                 // pas de referer trouvé ou appel depuis site extérieur, on va donc à la home
  88.                 $redirectUrl $this->generateUrl('home');
  89.             }
  90.             
  91.         } else { 
  92.             // rôle admin, on laisse consulter
  93.             $this->addFlash(
  94.                 'notice',
  95.                 'Cette question-réponse n\'est pas publiée. En tant qu\'admin vous pouvez toutefois la voir.'
  96.             );
  97.             $redirectUrl null;
  98.         }
  99.         return $redirectUrl;
  100.     }
  101.     /**
  102.      * @Route("/proposer-evenement/", name="suggestEvent")
  103.      */
  104.     public function suggestEvent(Request $requestMessageBusInterface $bus)
  105.     {
  106.         $event = new Event();
  107.         $form $this->createForm(SuggestEventType::class, $event);
  108.         $form->handleRequest($request);
  109.         
  110.         if ($form->isSubmitted() and $form->isValid()) {
  111.             // dump($form->getData()); exit;
  112.             $senderEmail $form->get('email')->getData();
  113.             $senderTel $form->get('tel')->getData() != null $form->get('tel')->getData() : "";
  114.             
  115.             // création de l'événement suggeré avec ses medias
  116.             $event $this->_makeSuggestedEventWithMedias($event$form);
  117.             
  118.             // traitement de l'envoi de mail
  119.             $isSent false// default value
  120.             if($event->getId()) { // l'événement a été enregistré correctement
  121.                 $copyToSender true;
  122.                 $isSent $this->_sendMailAboutSuggestedEvent($event$bus$senderEmail$senderTel$copyToSender);
  123.             }
  124.             
  125.             if($event && $isSent) {
  126.                 $this->addFlash(
  127.                     'notice-popup',
  128.                     'L\'événement a été créé. Nous devrions le publier sous peu.<br>
  129.                     Nous vous avons envoyé un mail à ce propos.<br>
  130.                     Nous vous tenons informé. Merci.'
  131.                 );
  132.             } else {
  133.                 $this->addFlash(
  134.                     'error-popup',
  135.                     'L\'événement n\'a pas pu être créé. Veuillez réessayer plus tard. Désolé. Merci.'
  136.                 );
  137.             }
  138.             return $this->redirectToRoute('home');
  139.         }
  140.         
  141.         return $this->render('event/suggestEvent.html.twig', [
  142.             'form' => $form->createView(),
  143.         ]);
  144.     }
  145.     /**
  146.      * Sous fonction pour créer l'événement suggeré avec ses medias
  147.      * @param Event $event 
  148.      * @param $form : le formulaire valide soumis
  149.      * @return Event $event : l'événement mis à jour et enregistré
  150.      */
  151.     private function _makeSuggestedEventWithMedias(Event $event$form) : Event
  152.     {        
  153.         // EVENT
  154.         // dump($event);
  155.         $event->setPublished(false);
  156.         $event->setPriority(0);
  157.         $event->setName($event->getTitle());
  158.         // PERIOD
  159.         $eventStart $form->get('eventStart')->getData();
  160.         $eventEnd $form->get('eventEnd')->getData();
  161.         $allDay $form->get('allDay')->getData();
  162.         $period = new Period;
  163.         $period->setPeriodStart($eventStart);
  164.         $period->setPeriodEnd($eventEnd);
  165.         $period->setAllDay($allDay);
  166.         $event->addPeriod($period);
  167.         
  168.         // MEDIAS
  169.         // cf. https://symfony.com/doc/current/controller/upload_file.html (pas utilisé ici)
  170.         $fichier1 $form->get('fichier1')->getData();
  171.         $fichier2 $form->get('fichier2')->getData();
  172.         $fichier3 $form->get('fichier3')->getData();
  173.         $files = [];
  174.         for ($i=1$i <= 3$i++) { 
  175.             if(null !== ${"fichier" $i}) $files[] = ${"fichier" $i};
  176.         }
  177.         $manager $this->getDoctrine()->getManager();
  178.         foreach ($files as $file) {
  179.             $name $file->getClientOriginalName(); // after last occurrence of \/
  180.             $ext substr(strrchr($name"."), 1); // after last occurrence of .
  181.             // $mime = $file->getMimeType($ext);
  182.             $size filesize($file);
  183.             $media = new Media;
  184.             $ext == "pdf" $media->setRole("pdf") : $media->setRole("image");
  185.             $media->setName($name);
  186.             $media->setFile($file);
  187.             $media->setTypes([Media::TYPES["évènement"]]);
  188.             if(isset($size)) $media->setSize($size);
  189.             $media->addEvent($event);
  190.             $manager->persist($media);
  191.         }
  192.         $manager->persist($event);
  193.         $manager->flush();
  194.         return $event;
  195.     }
  196.     /**
  197.      * Sous fonction pour envoyer le mail suite à la suggestion d'un événement
  198.      * @param Event $event 
  199.      * @param MessageBusInterface $bus 
  200.      * @param bool $copyToSender 
  201.      * @return bool $isSent
  202.      */
  203.     private function _sendMailAboutSuggestedEvent(Event $eventMessageBusInterface $busstring $senderEmailstring $senderTel "", ?bool $copyToSender true) : bool
  204.     {
  205.         $eaUrl $this->adminUrlGenerator
  206.             ->setController(EventCrudController::class)
  207.             ->setAction(Action::EDIT)
  208.             ->setEntityId($event->getId())
  209.             ->generateUrl()
  210.         ;
  211.             
  212.         $eventUrl $this->generateUrl('showEvent', ['id' => $event->getId()], UrlGenerator::ABSOLUTE_URL);
  213.         // dump($eaUrl); dump($eventUrl); exit;
  214.         if(!$eaUrl || !$eventUrl) return false;
  215.         if("" == $senderTel$senderTel "non-renseigné";
  216.         $webmasterMsg "<p><strong>Suggestion d'événement depuis le site ici-grenoble par : " $senderEmail " (téléphone : " $senderTel ")</strong></p>\n";
  217.         $webmasterMsg .= "<p>L'évenement \"" $event->getName() . "\" a été créé. Il n'est pas publié pour l'instant et ne sera donc pas lié au site.<br>\n";
  218.         $webmasterMsg .= "Il est toutefois visible en suivant ce lien : <a href=\"" $eventUrl "\">" $eventUrl "</a><br>\n";
  219.         $webmasterMsg .= "Et administrable, si vous avez les droits nécessaires, en suivant ce lien <a href=\"" $eaUrl "\">" $eaUrl "</a><br>\n";
  220.         $webmasterMsg .= "</p>\n";
  221.         $senderMsg "<p><strong>Suggestion d'événement depuis le site ici-grenoble par : " $senderEmail " (téléphone : " $senderTel ")</strong></p>\n";
  222.         $senderMsg .= "<p>L'évenement \"" $event->getName() . "\" a été créé. Il n'est pas publié pour l'instant et ne sera donc pas lié au site.<br>\n";
  223.         $senderMsg .= "Il est toutefois visible en suivant ce lien : <a href=\"" $eventUrl "\">" $eventUrl "</a><br>\n";
  224.         $senderMsg .= "</p>\n";
  225.         
  226.         // -> avec méthode messenger
  227.         $fromEmail $_ENV['FROM_MAIL'];
  228.         $toEmails "ici-Grenoble <" $_ENV['CONTACT_MAIL'] . ">";
  229.         $subject "Suggestion d'événement pour ici-Grenoble : " $event->getName();
  230.         $content $webmasterMsg;
  231.         $contentHtml null;
  232.         $ccEmails =  null;
  233.         $bccEmails =  null;
  234.         $replytoEmail $senderEmail;
  235.         $beforeSubject null// = ""; // defaults to App\Message\BaseEmail::DEFAULT_BEFORE_SUBJECT
  236.         // will cause the HighPriorityEmailHandler to be called
  237.         $bus->dispatch(new HighPriorityEmail($fromEmail$toEmails$subject$content$contentHtml$ccEmails$bccEmails$replytoEmail$beforeSubject));
  238.         // COPIE POUR L'ENVOYEUR
  239.         if($copyToSender) {
  240.             // -> avec méthode messenger
  241.             $fromEmail $_ENV['FROM_MAIL'];
  242.             $toEmails $senderEmail;
  243.             $subject "Suggestion d'événement pour ici-Grenoble : " $event->getName();
  244.             $content $senderMsg;
  245.             $contentHtml null;
  246.             $ccEmails =  null;
  247.             $bccEmails =  null;
  248.             $replytoEmail $_ENV['REPLYTO_MAIL'];  
  249.             $beforeSubject null// = ""; // defaults to App\Message\BaseEmail::DEFAULT_BEFORE_SUBJECT
  250.             // will cause the HighPriorityEmailHandler to be called
  251.             $bus->dispatch(new HighPriorityEmail($fromEmail$toEmails$subject$content$contentHtml$ccEmails$bccEmails$replytoEmail$beforeSubject));
  252.         }
  253.         $isSent true// Je présuppose le succès de l'envoi
  254.         return $isSent;
  255.     }
  256.     // *** inutile ?
  257.     // /**
  258.     //  * @Route("/event/teaser/{id}", name="showEventTeaser")
  259.     //  */
  260.     // public function showEventTeaser($id)
  261.     // {
  262.     //     $event = $this->getDoctrine()->getRepository(Event::class)->find($id);
  263.     //     return $this->render('event/showTeaser.html.twig', [
  264.     //                          'event' => $event
  265.     //     ]);
  266.     // }
  267.     /**
  268.      * @Route("/event/teasers/{ids}", name="showSearchResult")
  269.      * @param string $ids liste d'ids séparées par des tirets 
  270.      * @param bool $listWithThumbnails si on veut afficher une liste d'images, sinon liste textuelle 
  271.      */
  272.     public function showSearchResult($ids$listWithThumbnails false)
  273.     {
  274.         $ids explode("-"$ids); // $ids devient un array d'ids
  275.         $events = [];
  276.         foreach ($ids as $id) {
  277.             $event $this->getDoctrine()->getRepository(Event::class)->find($id);
  278.             if($event) {
  279.                 $key sprintf('%08d'$event->getPriority()) . "_" substr($event->getName(), 020) . "_" sprintf('%08d'$event->getId()); // pour ksort par la suite
  280.                 if(! isset($events[$key])) $events[$key] = $event;
  281.             }
  282.         }
  283.         krsort($events);
  284.         return $this->render('event/searchResult.html.twig', [
  285.             'listWithThumbnails' => $listWithThumbnails,
  286.             'events' => $events
  287.         ]);
  288.     }
  289.     //     *** inutile ?
  290.     //         /**
  291.     //      * @Route("/event/switch/{id}", name="switchImportant")
  292.     //      */
  293.     //     public function switchImportant(int $id) {
  294.     //         $event = $this->getDoctrine()->getRepository(Article::class)->find($id);
  295.             
  296.     //         switch ($event->getImportant()) {
  297.     //             case true:
  298.     //             $event->setImportant(false);
  299.     //             break;
  300.                 
  301.     //             case false:
  302.     //             $event->setImportant(true);
  303.     //             break;
  304.     //         }
  305.             
  306.     //         $manager = $this->getDoctrine()->getManager();
  307.     //         $manager->persist($event);
  308.     //         $manager->flush();
  309.     // //         var_dump($event->getImportant());
  310.     //         return $this->index();
  311.     //     }
  312. }