<?php
namespace App\Renderer\Entry;
use App\Entity\AffiliateRequest;
use App\Form\AffiliateRequestType;
use App\Repository\AffiliateRequestRepository;
use Moka\Cms\Entity\ComponentInterface;
use Moka\Cms\Entity\EntryInterface;
use Moka\Cms\Renderer\RendererInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\RouterInterface;
use Twig\Environment;
class AffiliateRenderer implements RendererInterface
{
public function __construct(
private Environment $environment,
private FormFactoryInterface $formFactory,
private RequestStack $requestStack,
private RouterInterface $router,
private MailerInterface $mailer,
private readonly AffiliateRequestRepository $affiliateRequestRepository,
) {
}
public function getName(): string
{
return 'affiliate';
}
public function render(EntryInterface|ComponentInterface $content, array $context = []): string
{
$request = $this->requestStack->getCurrentRequest();
$affiliateRequest = new AffiliateRequest();
$form = $this->formFactory->create(AffiliateRequestType::class, $affiliateRequest);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->affiliateRequestRepository->add($affiliateRequest, true);
$this->sendEmail($affiliateRequest);
return new RedirectResponse($this->router->generate('affiliate', ['completed' => true]));
}
return $this->environment->render('entry/affiliate.html.twig', [
'entry' => $content,
'form' => $form->createView(),
]);
}
public function sendEmail(AffiliateRequest $affiliateRequest): void
{
$email = (new TemplatedEmail())
->from('contact@solidpool.com')
->to('s.gauthier@solidpool.com')
->subject('Solidpool.fr : demande d\'affiliation')
->htmlTemplate('mail/affiliate.html.twig')
->textTemplate('mail/affiliate.txt.twig')
->context([
'lastname' => $affiliateRequest->getLastname(),
'firstname' => $affiliateRequest->getFirstname(),
'mail' => $affiliateRequest->getEmail(),
'phone' => $affiliateRequest->getPhone(),
'city' => $affiliateRequest->getCity(),
'message' => $affiliateRequest->getMessage(),
]);
$this->mailer->send($email);
}
}