<?php
namespace App\Renderer\Entry;
use App\Entity\ContactRequest;
use App\Form\ContactRequestType;
use App\Repository\ContactRequestRepository;
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 ContactRenderer implements RendererInterface
{
public function __construct(
private Environment $environment,
private FormFactoryInterface $formFactory,
private RequestStack $requestStack,
private RouterInterface $router,
private MailerInterface $mailer,
private readonly ContactRequestRepository $contactRequestRepository,
) {
}
public function getName(): string
{
return 'contact';
}
public function render(EntryInterface|ComponentInterface $content, array $context = []): string
{
$request = $this->requestStack->getCurrentRequest();
$contactRequest = new ContactRequest();
$form = $this->formFactory->create(ContactRequestType::class, $contactRequest);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->contactRequestRepository->add($contactRequest, true);
$this->sendEmail($contactRequest);
return new RedirectResponse($this->router->generate('contact', [
'completed' => true,
'store' => $contactRequest->getStore()?->getSlug(),
]));
}
return $this->environment->render('entry/contact.html.twig', [
'entry' => $content,
'form' => $form->createView(),
]);
}
public function sendEmail(ContactRequest $contactRequest): void
{
$email = (new TemplatedEmail())
->from('contact@solidpool.com')
->to('contact@solidpool.com')
->subject('Solidpool.fr : formulaire de contact')
->htmlTemplate('mail/contact.html.twig')
->textTemplate('mail/contact.txt.twig')
->context([
'name' => $contactRequest->getLastname(),
'firstname' => $contactRequest->getFirstname(),
'postalCode' => $contactRequest->getZipcode(),
'city' => $contactRequest->getCity(),
'mail' => $contactRequest->getEmail(),
'phone' => $contactRequest->getPhone(),
'message' => $contactRequest->getMessage(),
'store' => $contactRequest->getStore()?->getInternalName(),
]);
$this->mailer->send($email);
}
}