<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
// use Doctrine\Persistence\ObjectManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use App\Entity\Article;
// use App\Entity\ArticleType;
// use App\Entity\Event;
use App\Entity\Donation;
use App\Entity\Page;
use App\Entity\Theme;
use App\Entity\Subscriber;
use App\Entity\SubscriberList;
use App\Form\DonationType;
use App\Form\RechercheType;
use App\Form\SubscriberType;
class PageController extends AbstractController
{
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
/**
* @Route("/test-from-controller", name="testFromController")
*/
public function testFromController(Request $request)
{
$entitiesClasses = [
"Article",
"Event",
"Newsletter",
"Page",
"QuestionAnswer",
"Structure"
];
$key = 0;
$entity = null;
while(!$entity && $key < count($entitiesClasses)) {
$repo = $this->getDoctrine()->getRepository('App\\Entity\\' . $entitiesClasses[$key]);
$entity = $repo->findOneByTmpOldId(10293);
if(!$entity) $key ++; // si pas d'entité trouvée, on change de classe d'entité
}
if(!$entity) {
print " pas d'entité trouvée pour l'oldTmpId : " . "10293" . ")\n";
}
dump($entity);
exit;
return new Response("ok");
}
/**
* @Route("/page/{id}", name="showPage", requirements={"id"="\d+"})
*/
public function showPage(Request $request, $id)
{
$page = $this->getDoctrine()->getRepository(Page::class)->find($id);
if (!$page) {
throw $this->createNotFoundException('Pas d\'article avec l\'id ' . $id . '.');
}
if(!$page->getPublished()) {
$redirectUrl = $this->_notPublished($request);
if($redirectUrl) return $this->redirect($redirectUrl);
}
switch ($page->getName()) {
case 'home':
$url = $this->generateUrl('home', []);
break;
case 'participer':
$url = $this->generateUrl('participer', []);
break;
case 'pourquoi Ici Grenoble':
$url = $this->generateUrl('pourquoiIciGrenoble', []);
break;
case 'newsletter':
$url = $this->generateUrl('newsletter', []);
break;
case 'contact':
$url = $this->generateUrl('contact', []);
break;
default:
$url = null;
break;
}
if($url) {
return $this->redirect($url);
} else {
return $this->render('page/show.html.twig', [
'page' => $page
]);
}
}
/**
* action if entity not published
* @return string $redirectUrl
*/
private function _notPublished($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("/", name="home")
*/
public function showHome(Request $request) {
$articleRepository = $this->getDoctrine()->getRepository(Article::class);
$articlesUne = $articleRepository->getArticlesByTypeName("a-la-une", 9);
$articlesFond = $articleRepository->getArticlesByTypeName("article-fond", 8);
$publications = $articleRepository->getArticlesByTypeName("publication", 4);
$pageRepository = $this->getDoctrine()->getRepository(Page::class);
$page = $pageRepository->findOneByName("home");
/* // -> rendered in template
$searchForm = $this->createForm(RechercheType::class); // cf. https://symfony.com/doc/current/form/without_class.html
$searchForm->handleRequest($request);
if ($searchForm->isSubmitted() && $searchForm->isValid()) {
$term = $searchForm->getData()["term"];
// $term = $request->request->get('recherche')["term"]; // fonctionne aussi
// dump($searchForm->getData()); dump($request->request->get('recherche')["term"]); exit;
return $this->redirect($this->generateUrl('showTagBySlug', ['slug' => $term]));
}
*/
return $this->render('page/home.html.twig', [
'page' => $page,
'articlesUne' => $articlesUne,
'articlesFond' => $articlesFond,
'publications' => $publications,
// 'searchForm' => $searchForm->createView(),
]);
}
/**
* @Route("/carte", name="carte")
*/
public function showCarte(Request $request)
{
$themesRepository = $this->getDoctrine()->getRepository(Theme::class);
$themes = $themesRepository->findAllOrdered();
$searchForm = $this->createForm(RechercheType::class); // cf. https://symfony.com/doc/current/form/without_class.html
$searchForm->handleRequest($request);
if ($searchForm->isSubmitted() && $searchForm->isValid()) {
$term = $searchForm->getData()["term"];
// $term = $request->request->get('recherche')["term"]; // fonctionne aussi
// dump($searchForm->getData()); dump($request->request->get('recherche')["term"]); exit;
return $this->redirect($this->generateUrl('showTagBySlug', ['slug' => $term]));
}
return $this->render('page/carte.html.twig', [
'themes' => $themes,
'searchForm' => $searchForm->createView(),
]);
}
/**
* @Route("/newsletter", name="newsletter")
*/
public function showNewsletter(Request $request)
{
$subscriber = new Subscriber();
$form = $this->createForm(SubscriberType::class, $subscriber);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$subscriberRepository = $this->getDoctrine()->getRepository(Subscriber::class);
$subscriberListRepository = $this->getDoctrine()->getRepository(SubscriberList::class);
$subscriberListIciG = $subscriberListRepository->findOneByName('ici-grenoble');
$email = strtolower($form->getData()->getEmail());
$existentSubscriber = $subscriberRepository->findOneByEmail($email);
if (!$existentSubscriber) {
$subscriber = $form->getData();
$subscriber->setEmail($email); // pour s'assurer que l'email soit tout en minuscule
$subscriber->addSubscriberList($subscriberListIciG);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($subscriber);
$entityManager->flush();
$this->addFlash(
'notice-popup',
'Votre email <em>' . $email . '</em> a été ajouté à notre liste de diffusion. Merci.'
);
} else { // normalement, cela ne devrait pas arriver puisque la validation du formulaire empêche d'introduire un mail existant dans la liste
$this->addFlash(
'notice-popup',
'Votre email <em>' . $email . '</em> fait déjà partie de notre liste de diffusion. Merci.'
);
}
return $this->redirectToRoute('home');
}
$slug = "newsletter";
$page = $this->getDoctrine()->getRepository(Page::class)->findOneBySlug($slug);
if (!$page) {
throw $this->createNotFoundException('Pas de page avec le slug "' . $slug . '".');
}
return $this->render('page/newsletter.html.twig', [
'page' => $page,
'form' => $form->createView(),
]);
}
/**
* @Route("/info/realisation", name="realisation")
*/
public function showRealisation()
{
return $this->render('page/realisation.html.twig');
}
/**
* @Route("/info/participer", name="participer")
*/
public function showParticiper()
{
$page = $this->getDoctrine()->getRepository(Page::class)->findOneBySlug("participer");
if (!$page) {
return $this->render('page/participer.html.twig');
} else {
return $this->render('page/show.html.twig', [
'page' => $page
]);
}
}
/**
* @Route("/info/pourquoi-ici-grenoble", name="pourquoiIciGrenoble")
*/
public function showPourquoi()
{
$page = $this->getDoctrine()->getRepository(Page::class)->findOneBySlug("pourquoi-ici-grenoble");
if (!$page) {
return $this->render('page/pourquoiIciGrenoble.html.twig');
} else {
return $this->render('page/show.html.twig', [
'page' => $page
]);
}
}
/**
* creates donation page if it doesn't exist
* @return $page, the new created donation page
*/
private function _createMakeDonationPage() {
$page = new Page;
$page->setName("Faire un don");
$page->setSlug("faire-un-don");
$page->setTitle("Faire un don");
$page->setContent("Il est possible de faire un don et nous vous en remercions");
$this->entityManager->persist($page);
$this->entityManager->flush();
return $page;
}
/**
* @Route("/faire-un-don", name="makeDonation")
*/
public function makeDonation(Request $request)
{
$donation = new Donation();
$form = $this->createForm(DonationType::class, $donation);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$donation = $form->getData();
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($donation);
$entityManager->flush();
$session = $request->getSession();
if(!$session) {
$session = new Session();
$session->start();
}
$session->set('donation_id', $donation->getId());
$this->addFlash(
'notice-popup',
'Merci pour votre souhait de donation.<br/>
Pour que celle-ci soit effective, vous devez s\'il vous plait procéder au paiement en ligne.'
);
return $this->redirectToRoute('payment_url');
}
$page = $this->getDoctrine()->getRepository(Page::class)->findOneBySlug("faire-un-don");
if (!$page) {
$page = $this->_createMakeDonationPage();
}
return $this->render('page/makeDonation.html.twig', [
'page' => $page,
'form' => $form->createView(),
]);
}
}