<?php
namespace App\Controller\Front;
use App\Entity\NewsletterSubscriber;
use App\Form\NewsletterSubscriberType;
use App\Form\UnsubscribeNewsletterType;
use App\Repository\NewsletterSubscriberRepository;
use App\Service\NewsLetterSubscriberService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
#[Route('/front/newsletter/subscriber')]
class NewsletterSubscriberController extends AbstractController
{
#[Route('/', name: 'app_front_newsletter_subscriber_index', methods: ['GET'])]
public function index(Request $request , NewsletterSubscriberRepository $newsletterSubscriberRepository): Response
{
$template = $request->query->get('ajax') ? '_list.html.twig':'index.html.twig';
return $this->render('front/newsletter_subscriber/' .$template, [
'newsletter_subscribers' => $newsletterSubscriberRepository->findAll(),
]);
}
#[Route('/new', name: 'app_front_newsletter_subscriber_new', methods: ['GET', 'POST'])]
public function new(
Request $request,
EntityManagerInterface $entityManager,
TranslatorInterface $translator,
NewsLetterSubscriberService $newsLetterSubscriberService,
): Response
{
$newsletterSubscriber = new NewsletterSubscriber();
$newsletterSubscriber->setActive(true);
$form = $this->createForm(NewsletterSubscriberType::class, $newsletterSubscriber);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if (!$newsLetterSubscriberService->isSubscribed($newsletterSubscriber->getEmail())) {
$entityManager->persist($newsletterSubscriber);
}
if ($newsLetterSubscriberService->sendWelcomeNewsLetter($newsletterSubscriber)) {
$this->addFlash('success', 'A welcome Email have been sent');
} else {
$this->addFlash('error', "Email didn't send ");
}
$entityManager->flush();
return $this->redirectToRoute('app_main');
}
return $this->renderForm('front/newsletter_subscriber/new.html.twig', [
'newsletter_subscriber' => $newsletterSubscriber,
'form' => $form,
]);
}
#[Route('/delete', name: 'app_front_newsletter_subscriber_delete', methods: ['GET', 'POST'])]
public function delete(
Request $request,
EntityManagerInterface $entityManager,
NewsletterSubscriberRepository $subscriberRepository,
): Response
{
$form = $this->createForm(UnsubscribeNewsletterType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$newsletterSubscriber = $subscriberRepository->findOneBy(['email' => $form->get('email')->getData()]);
if ($newsletterSubscriber?->isActive()) {
$newsletterSubscriber->setActive(false);
$entityManager->persist($newsletterSubscriber);
$entityManager->flush();
$this->addFlash('success', 'success');
return $this->render('front/newsletter_subscriber/_unsubscribe_accept.html.twig');
}
$this->addFlash('error', "doesn't exist");
}
return $this->render('front/newsletter_subscriber/_delete_form.html.twig', [
'form' => $form->createView()
]);
}
#[Route('/{id}', name: 'app_front_newsletter_subscriber_show', methods: ['GET'])]
public function show(NewsletterSubscriber $newsletterSubscriber): Response
{
return $this->render('front/newsletter_subscriber/show.html.twig', [
'newsletter_subscriber' => $newsletterSubscriber,
]);
}
#[Route('/{id}/edit', name: 'app_front_newsletter_subscriber_edit', methods: ['GET', 'POST'])]
public function edit(
Request $request,
NewsletterSubscriber $newsletterSubscriber,
EntityManagerInterface $entityManager
): Response
{
$form = $this->createForm(NewsletterSubscriberType::class, $newsletterSubscriber);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->flush();
return $this->redirectToRoute('app_front_newsletter_subscriber_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('front/newsletter_subscriber/edit.html.twig', [
'newsletter_subscriber' => $newsletterSubscriber,
'form' => $form,
]);
}
#[Route('/{id}/edit_state', name: 'app_front_newsletter_subscriber_edit_state', methods: ['GET', 'POST'])]
public function editState(
Request $request,
NewsletterSubscriber $newsletterSubscriber,
EntityManagerInterface $entityManager
): Response
{
if ($this->isCsrfTokenValid($newsletterSubscriber->getId(), $request->request->get('_token'))) {
$newsletterSubscriber->setActive(!$newsletterSubscriber->isActive());
$entityManager->persist($newsletterSubscriber);
$entityManager->flush();
if ($request->isXmlHttpRequest()) {
return new Response(null, Response::HTTP_OK);
}
}
return $this->renderForm('admin/change_state_form.html.twig', [
'entity' => $newsletterSubscriber,
'action' => $request->getPathInfo()
]);
}
}