<?php
namespace App\Controller;
use App\Entity\Actualite;
use App\Entity\Contact;
use App\Entity\ContactPage;
use App\Entity\ExpertisePage;
use App\Entity\ExpertisePrive;
use App\Entity\ExpertisePublic;
use App\Entity\JobOffer;
use App\Entity\JobOfferCandidacy;
use App\Entity\JobOfferPage;
use App\Entity\LandingPage;
use App\Entity\Presentation;
use App\Entity\ReferencePage;
use App\Entity\ReferencePrive;
use App\Entity\ReferencePublic;
use App\Entity\Solution;
use App\Entity\SolutionPage;
use App\Entity\Team;
use App\Entity\ValeursEngagements;
use App\Form\ContactFormType;
use App\Form\JobOfferCandidacyFrontType;
use App\Repository\ActualiteRepository;
use App\Repository\ContactPageRepository;
use App\Repository\ExpertisePageRepository;
use App\Repository\ExpertisePriveRepository;
use App\Repository\ExpertisePublicRepository;
use App\Repository\HomepageRepository;
use App\Repository\JobOfferPageRepository;
use App\Repository\JobOfferRepository;
use App\Repository\LandingPageRepository;
use App\Repository\PresentationRepository;
use App\Repository\ReferencePageRepository;
use App\Repository\ReferencePublicRepository;
use App\Repository\ReferencePriveRepository;
use App\Repository\SolutionPageRepository;
use App\Repository\SolutionRepository;
use App\Repository\TeamMemberRepository;
use App\Repository\TeamRepository;
use App\Repository\ValeursEngagementsRepository;
use Cofondateur\SocleTechniqueBundle\Sitemap\SitemapService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Pagerfanta\Doctrine\ORM\QueryAdapter;
use Pagerfanta\Pagerfanta;
use Psr\Log\LoggerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Routing\Annotation\Route;
class FrontController extends AbstractController
{
/** @var ManagerRegistry */
private $em;
public function __construct(ManagerRegistry $em)
{
$this->em = $em;
}
/**
* @Route("/", name="app_homepage")
*/
public function index(HomepageRepository $homepageRepository, ExpertisePriveRepository $expertisePriveRepository, ExpertisePublicRepository $expertisePublicRepository, SolutionRepository $solutionRepository, ReferencePriveRepository $referencePriveRepository, ReferencePublicRepository $referencePublicRepository, ActualiteRepository $actualiteRepository): Response
{
$page = $homepageRepository->findUnique();
$expertisesPrive = $expertisePriveRepository->findAll();
$expertisesPublic = $expertisePublicRepository->findAll();
$solutions = $solutionRepository->findAll();
$referencesPrive = $referencePriveRepository->findAll();
$referencesPublic = $referencePublicRepository->findAll();
$actualites = $actualiteRepository->findBy(['published' => true], ['createdAt' => 'DESC'], 3);
return $this->render('front/index.html.twig', array(
'page' => $page,
'expertisesPrive' => $expertisesPrive,
'expertisesPublic' => $expertisesPublic,
'solutions' => $solutions,
'referencesPrive' => $referencesPrive,
'referencesPublic' => $referencesPublic,
'actualites' => $actualites,
));
}
/**
* @Route("/presentation", name="app_presentation_index")
*/
public function presentation(Request $request, ExpertisePriveRepository $expertisePriveRepository, ExpertisePublicRepository $expertisePublicRepository): Response
{
/** @var PresentationRepository $repo */
$repo = $this->em->getRepository(Presentation::class);
$page = $repo->findUnique();
$expertisesPrive = $expertisePriveRepository->findAll();
$expertisesPublic = $expertisePublicRepository->findAll();
return $this->render('front/Presentation/index.html.twig', array(
'page' => $page,
'expertisesPrive' => $expertisesPrive,
'expertisesPublic' => $expertisesPublic,
));
}
/**
* @Route("/valeursEngagements", name="app_valeurs_engagements_index")
*/
public function valeursEngagements(Request $request): Response
{
/** @var ValeursEngagementsRepository $repo */
$repo = $this->em->getRepository(ValeursEngagements::class);
$page = $repo->findUnique();
return $this->render('front/ValeursEngagements/index.html.twig', array('page' => $page));
}
/**
* @Route("/equipe", name="app_team_index")
*/
public function team(Request $request, TeamMemberRepository $teamMemberRepository): Response
{
/** @var TeamRepository $repo */
$repo = $this->em->getRepository(Team::class);
$page = $repo->findUnique();
$members = $teamMemberRepository->findBy([], ["position" => "ASC"]);
return $this->render('front/Team/index.html.twig', array(
'page' => $page,
'members' => $members
));
}
/**
* @Route("/expertises-decarbonation", name="app_expertise_page_index")
*/
public function expertisePage(Request $request, ExpertisePriveRepository $expertisePriveRepository, ExpertisePublicRepository $expertisePublicRepository): Response
{
/** @var ExpertisePageRepository $repo */
$repo = $this->em->getRepository(ExpertisePage::class);
$page = $repo->findUnique();
$expertisesPrive = $expertisePriveRepository->findAll();
$expertisesPublic = $expertisePublicRepository->findAll();
return $this->render('front/Expertise/list.html.twig', array(
'page' => $page,
'expertisesPrive' => $expertisesPrive,
'expertisesPublic' => $expertisesPublic,
));
}
/**
* @Route("/expertises-decarbonation/publique/{slug}", name="app_expertise_public_show")
*/
public function showExpertisePublic(Request $request, ExpertisePublic $expertisePublic, ExpertisePublicRepository $expertisePublicRepository): Response
{
$expertisesPublic = $expertisePublicRepository->findAll();
return $this->render('front/Expertise/show.html.twig', array(
'page' => $expertisePublic,
'expertises' => $expertisesPublic,
'categorie' => "public"
));
}
/**
* @Route("/expertises-decarbonation/prive/{slug}", name="app_expertise_prive_show")
*/
public function showExpertisePrive(Request $request, ExpertisePrive $expertisePrive, ExpertisePriveRepository $expertisePriveRepository): Response
{
$expertisesPrive = $expertisePriveRepository->findAll();
return $this->render('front/Expertise/show.html.twig', array(
'page' => $expertisePrive,
'expertises' => $expertisesPrive,
'categorie' => "prive",
));
}
/**
* @Route("/solutions-decarbonation", name="app_solution_page_index")
*/
public function solutionPage(Request $request, SolutionRepository $solutionRepository): Response
{
/** @var SolutionPageRepository $repo */
$repo = $this->em->getRepository(SolutionPage::class);
$page = $repo->findUnique();
$solutions = $solutionRepository->findAll();
return $this->render('front/Solution/list.html.twig', array(
'page' => $page,
'solutions' => $solutions
));
}
/**
* @Route("/solutions-decarbonation/detail/{slug}", name="app_solution_show")
*/
public function showSolution(Request $request, Solution $solution, ReferencePriveRepository $referencePriveRepository, ReferencePublicRepository $referencePublicRepository, SolutionRepository $solutionRepository): Response
{
$referencesPrive = $referencePriveRepository->findAll();
$referencesPublic = $referencePublicRepository->findAll();
$solutions = $solutionRepository->findAll();
return $this->render('front/Solution/show.html.twig', array(
'page' => $solution,
'referencesPrive' => $referencesPrive,
'referencesPublic' => $referencesPublic,
'solutions' => $solutions,
));
}
/**
* @Route("/actualites/detail/{slug}", name="app_actualite_show")
*/
public function showActualite(Request $request, Actualite $actualite, ActualiteRepository $actualiteRepository): Response
{
$actualites = $actualiteRepository->createQueryBuilder('a')
->andWhere('a != :actualite')
->andWhere('a.published = true')
->setParameter('actualite', $actualite)
->orderBy('a.createdAt', 'DESC')
->setMaxResults(3)
->getQuery()
->getResult();
return $this->render('front/Actualite/show.html.twig', array(
'page' => $actualite,
'actualites' => $actualites
));
}
/**
* @Route("/actualites/{page}", name="app_actualite_list", requirements={"page"="\d+"}, defaults={"page": 1})
*/
public function listActualites(Request $request, $page): Response
{
/** @var ActualiteRepository $repo */
$repo = $this->em->getRepository(Actualite::class);
$actualites = new Pagerfanta(new QueryAdapter($repo->createQueryBuilder('e')->andWhere("e.published = true")->orderBy('e.createdAt', 'DESC')));
$actualites->setMaxPerPage(6);
$actualites->setCurrentPage($page);
return $this->render('front/Actualite/list.html.twig', array('actualites' => $actualites));
}
/**
* @Route("/offres-emploi/{slug}", name="app_job_offer_show")
*/
public function showJobOffer(Request $request, JobOffer $jobOffer, JobOfferRepository $jobOfferRepository, EntityManagerInterface $em, MailerInterface $mailer, LoggerInterface $logger): Response
{
$jobOffers = $jobOfferRepository->findBy(['published' => true], ['idPost' => 'DESC'], 2);
$candidacy = new JobOfferCandidacy();
$candidacy->setJobOffer($jobOffer);
$form = $this->createForm(JobOfferCandidacyFrontType::class, $candidacy);
$form->handleRequest($request);
$sendOffer = false;
if ($form->isSubmitted() && $form->isValid()) {
$candidacy->setCreatedAt(new \DateTime());
$em->persist($candidacy);
$em->flush();
$recipients = $_ENV['MAIL_RECIPIENT_CANDIDACY'];
$recipients = explode(',', $recipients);
$email = (new TemplatedEmail())
->from(new Address($_ENV['MAIL_SENDER'], 'noocarb'))
->to(...$recipients)
->subject("Vous avez reçu une nouvelle candidature")
// path of the Twig template to render
->htmlTemplate('mail/candidacy.html.twig')
// pass variables (name => value) to the template
->context(["candidacy" => $candidacy, 'mail_hostname' => $_ENV['MAIL_HOSTNAME']]);
try {
$mailer->send($email);
$this->addFlash('successOffer', 'Merci pour votre candidature, notre équipe prend connaissance de votre dossier et reviendra vers vous dans les plus brefs délais.');
} catch (\Exception $e) {
$logger->error($e->getMessage());
$this->addFlash('errorsOffer', 'Une erreur est survenue, merci de rééssayer.');
}
$sendOffer = true;
}
return $this->render('front/JobOffer/show.html.twig', array(
'page' => $jobOffer,
'jobOffers' => $jobOffers,
'form' => $form->createView(),
'sendOffer' => $sendOffer
));
}
/**
* @Route("/offres-emploi", name="app_job_offer_list")
*/
public function jobOfferPage(Request $request, JobOfferRepository $jobOfferRepository): Response
{
/** @var JobOfferPageRepository $repo */
$repo = $this->em->getRepository(JobOfferPage::class);
$page = $repo->findUnique();
$jobOffers = $jobOfferRepository->findBy(['published' => true], ['id' => 'DESC']);
return $this->render('front/JobOffer/list.html.twig', array(
'page' => $page,
'jobOffers' => $jobOffers
));
}
/**
* @Route("/references/publique/{page}", name="app_reference_public_index", requirements={"page"="\d+"}, defaults={"page": 1})
*/
public function referencePublicPage(Request $request, $page, ReferencePublicRepository $referencePublicRepository): Response
{
/** @var ReferencePageRepository $repo */
$repo = $this->em->getRepository(ReferencePage::class);
$pageRepo = $repo->findUnique();
$referencesPublic = new Pagerfanta(new QueryAdapter($referencePublicRepository->createQueryBuilder('e')->orderBy('e.position', 'ASC')));
$referencesPublic->setMaxPerPage(6);
$referencesPublic->setCurrentPage($page);
return $this->render('front/Reference/list.html.twig', array(
'page' => $pageRepo,
'category' => "public",
'references' => $referencesPublic,
));
}
/**
* @Route("/references/prive/{page}", name="app_reference_prive_index", requirements={"page"="\d+"}, defaults={"page": 1})
*/
public function referencePrivePage(Request $request, $page, ReferencePriveRepository $referencePriveRepository): Response
{
/** @var ReferencePageRepository $repo */
$repo = $this->em->getRepository(ReferencePage::class);
$pageRepo = $repo->findUnique();
$referencesPrive = new Pagerfanta(new QueryAdapter($referencePriveRepository->createQueryBuilder('e')->orderBy('e.position', 'ASC')));
$referencesPrive->setMaxPerPage(6);
$referencesPrive->setCurrentPage($page);
return $this->render('front/Reference/list.html.twig', array(
'page' => $pageRepo,
'category' => "prive",
'references' => $referencesPrive,
));
}
/**
* @Route("/references/publique/{slug}", name="app_reference_public_show")
*/
public function showReferencePublic(Request $request, ReferencePublic $referencePublic, ReferencePublicRepository $referencePublicRepository): Response
{
$referencesPublic = $referencePublicRepository->findBy([], ['id' => 'DESC'], 3);
return $this->render('front/Reference/show.html.twig', array(
'page' => $referencePublic,
'references' => $referencesPublic,
'categorie' => 'public',
));
}
/**
* @Route("/references/prive/{slug}", name="app_reference_prive_show")
*/
public function showReferencePrive(Request $request, ReferencePrive $referencePrive, ReferencePriveRepository $referencePriveRepository): Response
{
$referencesPrive = $referencePriveRepository->findBy([], ['id' => 'DESC'], 3);
return $this->render('front/Reference/show.html.twig', array(
'page' => $referencePrive,
'references' => $referencesPrive,
'categorie' => 'prive',
));
}
/**
* @Route("/contact", name="app_contact_page_index")
*/
public function contactPage(Request $request, EntityManagerInterface $em, MailerInterface $mailer, LoggerInterface $logger): Response
{
/** @var ContactPageRepository $repo */
$repo = $this->em->getRepository(ContactPage::class);
$page = $repo->findUnique();
$contact = new Contact;
$form = $this->createForm(ContactFormType::class, $contact);
// dd($form->handleRequest($request));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var Contact $contact */
$contact->setDate(new \DateTime());
$em->persist($contact);
$em->flush();
$recipients = $_ENV['MAIL_RECIPIENT'];
$recipients = explode(',', $recipients);
$email = (new TemplatedEmail())
->from(new Address($_ENV['MAIL_SENDER'], 'noocarb'))
->to(...$recipients)
->subject("Vous avez reçu une nouvelle demande de contact")
// path of the Twig template to render
->htmlTemplate('mail/contact.html.twig')
// pass variables (name => value) to the template
->context(["contact" => $contact, 'mail_hostname' => $_ENV['MAIL_HOSTNAME']]);
try {
$mailer->send($email);
$this->addFlash('successContact', 'Merci nous avons reçu votre demande. Nous vous répondrons dans les plus brefs délais.');
} catch (\Exception $e) {
$logger->error($e->getMessage());
$this->addFlash('errorsContact', 'Une erreur est survenue, merci de rééssayer.');
}
}
return $this->render('front/ContactPage/index.html.twig', array(
'page' => $page,
'form' => $form->createView()
));
}
/**
* @Route("/newsletter", name="app_newsletter")
*/
public function addToNewsletter(Request $request)
{
$email = json_decode($request->request->get('email'), true);
$this->addFlash('sendNewsletter', 'send.');
if (empty($email)) {
return $this->redirectToRoute('app_homepage');
}
$mailchimp = new \MailchimpMarketing\ApiClient();
$mailchimp->setConfig([
'apiKey' => '35dba78e6d7db3328149aacfa1dfa53e-us10',
'server' => 'us10'
]);
$listMembers = $mailchimp->lists->getListMembersInfo("feda93d28a")->members;
foreach ($listMembers as $member) {
if ($member->email_address == $email) {
$this->addFlash('successNewsletter', "Votre email est déjà inscrit.");
return $this->redirectToRoute('app_homepage');
}
}
try {
$mailchimp->lists->addListMember("feda93d28a", [
"email_address" => $email,
"status" => "subscribed",
]);
$this->addFlash('successNewsletter', 'L\'email ' . $email . " a bien été ajouté à notre newsletter.");
return $this->redirectToRoute('app_homepage');
} catch (\Exception $e) {
$this->addFlash('errorsNewsletter', "Une erreur s'est produite, merci de rééssayer.");
return $this->redirectToRoute('app_homepage');
}
return $this->redirectToRoute('app_homepage');
}
/**
* @Route("/sitemap.{_format}", name="app_sitemap_front", format="html")
*/
public function sitemap(Request $request, SitemapService $sitemapService): Response
{
$format = $request->getRequestFormat();
$links = $sitemapService->generateSitemap();
$template = 'front/';
if ($format === 'xml') {
$template .= 'sitemap/index.xml.twig';
} else {
$template .= 'sitemap/index.html.twig';
}
return $this->render($template, [
'sitemapLinkGroups' => $links
]);
}
/**
* @Route("/mentions-legales", name="app_legal_terms")
*/
public function legalTerms(): Response
{
return $this->render('front/legalTerms.html.twig');
}
/**
* @Route("/confidentialite", name="app_confidentiality")
*/
public function confidentiality(): Response
{
return $this->render('front/confidentiality.html.twig',array(
'siteName' => $_ENV['SITENAME'],
'hostname' => $_ENV['HOSTNAME']
));
}
/**
* @Route("/page/{slug}", name="app_landing_page_show")
*/
public function showLandingPage(Request $request, ?LandingPage $landingPage=null): Response
{
if ($landingPage === null) {
throw $this->createNotFoundException();
}
return $this->render('front/LandingPage/show.html.twig', array('page' => $landingPage));
}
//
// /**
// * @Route("/landingPages/{page}", name="app_landing_page_list", requirements={"page"="\d+"}, defaults={"page": 1})
// */
// public function listLandingPages(Request $request, $page): Response
// {
// /** @var LandingPageRepository $repo */
// $repo = $this->em->getRepository(LandingPage::class);
// $landingPages = new Pagerfanta(new QueryAdapter($repo->createQueryBuilder('e')));
// $landingPages->setMaxPerPage(6);
// $landingPages->setCurrentPage($page);
// return $this->render('front/LandingPage/list.html.twig', array('landingPages' => $landingPages));
// }
}