<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Messenger\MessageBusInterface;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Symfony\Component\Routing\Generator\UrlGenerator;
use App\Entity\Event;
use App\Entity\Media;
use App\Entity\Period;
use App\Form\SuggestEventType;
use App\Controller\Admin\EventCrudController;
use App\Message\HighPriorityEmail;
// use Knp\Component\Pager\PaginatorInterface;
class EventController extends AbstractController
{
private $adminUrlGenerator;
public function __construct(AdminUrlGenerator $adminUrlGenerator)
{
$this->adminUrlGenerator = $adminUrlGenerator;
}
/**
* @Route("/evenement/{id}", name="showEvent", requirements={"id"="\d+"})
*/
public function showEvent(Request $request, $id)
{
$event = $this->getDoctrine()->getRepository(Event::class)->find($id);
if (!$event) {
throw $this->createNotFoundException('Pas d\'évènement avec l\'id ' . $id . '.');
// the above is just a shortcut for:
// throw new NotFoundHttpException('The product does not exist');
}
$slug = $event->getSlug();
if($slug && $slug !== "") {
return $this->redirect($this->generateUrl('showEventBySlug', ['slug' => $slug]));
} else {
if(!$event->getPublished()) {
$redirectUrl = $this->_notPublished($request);
if($redirectUrl) return $this->redirect($redirectUrl);
}
return $this->render('event/show.html.twig', [
'event' => $event
]);
}
}
/**
* @Route("/evenement/{slug}", name="showEventBySlug")
*/
public function showEventBySlug(Request $request, $slug)
{
$event = $this->getDoctrine()->getRepository(Event::class)->findOneBySlug($slug);
if (!$event) {
throw $this->createNotFoundException('Pas d\'évènement avec le slug "' . $slug . '".');
}
if(!$event->getPublished()) {
$redirectUrl = $this->_notPublished($request);
if($redirectUrl) return $this->redirect($redirectUrl);
}
return $this->render('event/show.html.twig', [
'event' => $event
]);
}
/**
* action if entity not published
* @return string $redirectUrl
*/
private function _notPublished(Request $request) {
if(!$this->isGranted('ROLE_ADMIN')) {
$requestUri = $request->getRequestUri();
$baseUrl = $request->getSchemeAndHttpHost();
$this->addFlash(
'error-popup',
'L\'url demandée : "' . $baseUrl . $requestUri . '" n\'existe pas.'
);
$referer = $request->headers->get('referer');
if(null != $referer && substr($referer, 0, strlen($baseUrl)) === $baseUrl) {
// on retourne de là oú l'on vient, si l'on vient de ce site
$redirectUrl = substr($referer, strlen($baseUrl));
} else {
// pas de referer trouvé ou appel depuis site extérieur, on va donc à la home
$redirectUrl = $this->generateUrl('home');
}
} else {
// rôle admin, on laisse consulter
$this->addFlash(
'notice',
'Cette question-réponse n\'est pas publiée. En tant qu\'admin vous pouvez toutefois la voir.'
);
$redirectUrl = null;
}
return $redirectUrl;
}
/**
* @Route("/proposer-evenement/", name="suggestEvent")
*/
public function suggestEvent(Request $request, MessageBusInterface $bus)
{
$event = new Event();
$form = $this->createForm(SuggestEventType::class, $event);
$form->handleRequest($request);
if ($form->isSubmitted() and $form->isValid()) {
// dump($form->getData()); exit;
$senderEmail = $form->get('email')->getData();
$senderTel = $form->get('tel')->getData() != null ? $form->get('tel')->getData() : "";
// création de l'événement suggeré avec ses medias
$event = $this->_makeSuggestedEventWithMedias($event, $form);
// traitement de l'envoi de mail
$isSent = false; // default value
if($event->getId()) { // l'événement a été enregistré correctement
$copyToSender = true;
$isSent = $this->_sendMailAboutSuggestedEvent($event, $bus, $senderEmail, $senderTel, $copyToSender);
}
if($event && $isSent) {
$this->addFlash(
'notice-popup',
'L\'événement a été créé. Nous devrions le publier sous peu.<br>
Nous vous avons envoyé un mail à ce propos.<br>
Nous vous tenons informé. Merci.'
);
} else {
$this->addFlash(
'error-popup',
'L\'événement n\'a pas pu être créé. Veuillez réessayer plus tard. Désolé. Merci.'
);
}
return $this->redirectToRoute('home');
}
return $this->render('event/suggestEvent.html.twig', [
'form' => $form->createView(),
]);
}
/**
* Sous fonction pour créer l'événement suggeré avec ses medias
* @param Event $event
* @param $form : le formulaire valide soumis
* @return Event $event : l'événement mis à jour et enregistré
*/
private function _makeSuggestedEventWithMedias(Event $event, $form) : Event
{
// EVENT
// dump($event);
$event->setPublished(false);
$event->setPriority(0);
$event->setName($event->getTitle());
// PERIOD
$eventStart = $form->get('eventStart')->getData();
$eventEnd = $form->get('eventEnd')->getData();
$allDay = $form->get('allDay')->getData();
$period = new Period;
$period->setPeriodStart($eventStart);
$period->setPeriodEnd($eventEnd);
$period->setAllDay($allDay);
$event->addPeriod($period);
// MEDIAS
// cf. https://symfony.com/doc/current/controller/upload_file.html (pas utilisé ici)
$fichier1 = $form->get('fichier1')->getData();
$fichier2 = $form->get('fichier2')->getData();
$fichier3 = $form->get('fichier3')->getData();
$files = [];
for ($i=1; $i <= 3; $i++) {
if(null !== ${"fichier" . $i}) $files[] = ${"fichier" . $i};
}
$manager = $this->getDoctrine()->getManager();
foreach ($files as $file) {
$name = $file->getClientOriginalName(); // after last occurrence of \/
$ext = substr(strrchr($name, "."), 1); // after last occurrence of .
// $mime = $file->getMimeType($ext);
$size = filesize($file);
$media = new Media;
$ext == "pdf" ? $media->setRole("pdf") : $media->setRole("image");
$media->setName($name);
$media->setFile($file);
$media->setTypes([Media::TYPES["évènement"]]);
if(isset($size)) $media->setSize($size);
$media->addEvent($event);
$manager->persist($media);
}
$manager->persist($event);
$manager->flush();
return $event;
}
/**
* Sous fonction pour envoyer le mail suite à la suggestion d'un événement
* @param Event $event
* @param MessageBusInterface $bus
* @param bool $copyToSender
* @return bool $isSent
*/
private function _sendMailAboutSuggestedEvent(Event $event, MessageBusInterface $bus, string $senderEmail, string $senderTel = "", ?bool $copyToSender = true) : bool
{
$eaUrl = $this->adminUrlGenerator
->setController(EventCrudController::class)
->setAction(Action::EDIT)
->setEntityId($event->getId())
->generateUrl()
;
$eventUrl = $this->generateUrl('showEvent', ['id' => $event->getId()], UrlGenerator::ABSOLUTE_URL);
// dump($eaUrl); dump($eventUrl); exit;
if(!$eaUrl || !$eventUrl) return false;
if("" == $senderTel) $senderTel = "non-renseigné";
$webmasterMsg = "<p><strong>Suggestion d'événement depuis le site ici-grenoble par : " . $senderEmail . " (téléphone : " . $senderTel . ")</strong></p>\n";
$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";
$webmasterMsg .= "Il est toutefois visible en suivant ce lien : <a href=\"" . $eventUrl . "\">" . $eventUrl . "</a><br>\n";
$webmasterMsg .= "Et administrable, si vous avez les droits nécessaires, en suivant ce lien <a href=\"" . $eaUrl . "\">" . $eaUrl . "</a><br>\n";
$webmasterMsg .= "</p>\n";
$senderMsg = "<p><strong>Suggestion d'événement depuis le site ici-grenoble par : " . $senderEmail . " (téléphone : " . $senderTel . ")</strong></p>\n";
$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";
$senderMsg .= "Il est toutefois visible en suivant ce lien : <a href=\"" . $eventUrl . "\">" . $eventUrl . "</a><br>\n";
$senderMsg .= "</p>\n";
// -> avec méthode messenger
$fromEmail = $_ENV['FROM_MAIL'];
$toEmails = "ici-Grenoble <" . $_ENV['CONTACT_MAIL'] . ">";
$subject = "Suggestion d'événement pour ici-Grenoble : " . $event->getName();
$content = $webmasterMsg;
$contentHtml = null;
$ccEmails = null;
$bccEmails = null;
$replytoEmail = $senderEmail;
$beforeSubject = null; // = ""; // defaults to App\Message\BaseEmail::DEFAULT_BEFORE_SUBJECT
// will cause the HighPriorityEmailHandler to be called
$bus->dispatch(new HighPriorityEmail($fromEmail, $toEmails, $subject, $content, $contentHtml, $ccEmails, $bccEmails, $replytoEmail, $beforeSubject));
// COPIE POUR L'ENVOYEUR
if($copyToSender) {
// -> avec méthode messenger
$fromEmail = $_ENV['FROM_MAIL'];
$toEmails = $senderEmail;
$subject = "Suggestion d'événement pour ici-Grenoble : " . $event->getName();
$content = $senderMsg;
$contentHtml = null;
$ccEmails = null;
$bccEmails = null;
$replytoEmail = $_ENV['REPLYTO_MAIL'];
$beforeSubject = null; // = ""; // defaults to App\Message\BaseEmail::DEFAULT_BEFORE_SUBJECT
// will cause the HighPriorityEmailHandler to be called
$bus->dispatch(new HighPriorityEmail($fromEmail, $toEmails, $subject, $content, $contentHtml, $ccEmails, $bccEmails, $replytoEmail, $beforeSubject));
}
$isSent = true; // Je présuppose le succès de l'envoi
return $isSent;
}
// *** inutile ?
// /**
// * @Route("/event/teaser/{id}", name="showEventTeaser")
// */
// public function showEventTeaser($id)
// {
// $event = $this->getDoctrine()->getRepository(Event::class)->find($id);
// return $this->render('event/showTeaser.html.twig', [
// 'event' => $event
// ]);
// }
/**
* @Route("/event/teasers/{ids}", name="showSearchResult")
* @param string $ids liste d'ids séparées par des tirets
* @param bool $listWithThumbnails si on veut afficher une liste d'images, sinon liste textuelle
*/
public function showSearchResult($ids, $listWithThumbnails = false)
{
$ids = explode("-", $ids); // $ids devient un array d'ids
$events = [];
foreach ($ids as $id) {
$event = $this->getDoctrine()->getRepository(Event::class)->find($id);
if($event) {
$key = sprintf('%08d', $event->getPriority()) . "_" . substr($event->getName(), 0, 20) . "_" . sprintf('%08d', $event->getId()); // pour ksort par la suite
if(! isset($events[$key])) $events[$key] = $event;
}
}
krsort($events);
return $this->render('event/searchResult.html.twig', [
'listWithThumbnails' => $listWithThumbnails,
'events' => $events
]);
}
// *** inutile ?
// /**
// * @Route("/event/switch/{id}", name="switchImportant")
// */
// public function switchImportant(int $id) {
// $event = $this->getDoctrine()->getRepository(Article::class)->find($id);
// switch ($event->getImportant()) {
// case true:
// $event->setImportant(false);
// break;
// case false:
// $event->setImportant(true);
// break;
// }
// $manager = $this->getDoctrine()->getManager();
// $manager->persist($event);
// $manager->flush();
// // var_dump($event->getImportant());
// return $this->index();
// }
}