<?php
namespace App\Controller\Website;
use App\Client\ErpClient;
use App\Form\Website\Type\Contact\ContactType;
use App\Form\Website\Type\Newsletter\NewsletterType;
use Croisiland\CommonBundle\Model\CivilityEnum;
use Croisiland\CommonBundle\Model\ProspectRequestModel;
use Sulu\Component\Content\Compat\StructureInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class FormController extends BaseWebsiteController
{
private const FORM_TYPES = [
'contact' => ContactType::class,
'newsletter' => NewsletterType::class,
];
protected ErpClient $erpClient;
public function __construct(ErpClient $erpClient)
{
$this->erpClient = $erpClient;
}
public function indexAction(StructureInterface $structure, $preview = false, $partial = false)
{
// Récupération de la requête via le container
$request = $this->container->get('request_stack')->getCurrentRequest();
// Récupération du type de formulaire sélectionné
$formType = null;
try {
$formType = $structure->getPropertyValue('formType');
} catch (\InvalidArgumentException $exception) {
$formType = 'contact'; // Valeur par défaut
}
// Vérification que le type de formulaire existe
if (!isset(self::FORM_TYPES[$formType])) {
$formType = 'contact'; // Fallback sur contact
}
// Création du formulaire correspondant
$formClass = self::FORM_TYPES[$formType];
$initialData = null;
if (
$formType === 'newsletter'
&& $request
&& $request->isMethod(Request::METHOD_GET)
) {
$emailFromQuery = $request->query->get('email');
if (\is_string($emailFromQuery)) {
$emailFromQuery = trim($emailFromQuery);
if ($emailFromQuery !== '') {
$initialData = [
'email' => $emailFromQuery,
'emailConfirmation' => $emailFromQuery,
];
}
}
}
$form = $this->createForm($formClass, $initialData);
// Traitement de la soumission du formulaire
if ($request) {
$form->handleRequest($request);
}
// Si le formulaire est soumis et valide
if ($form->isSubmitted() && $form->isValid()) {
// TODO: Traiter les données du formulaire ici (email, CRM, etc.)
// Page de confirmation dédiée (évite le re-submit lors d'un refresh).
if ($formType === 'contact' && $request && $request->isMethod(\Symfony\Component\HttpFoundation\Request::METHOD_POST)) {
$data = $form->getData();
$prospectRequestModel = (new ProspectRequestModel())
->setCivility($data['civility'] === "M." ? CivilityEnum::MR : CivilityEnum::MRS)
->setFirstName($data['firstName'])
->setLastName($data['lastName'])
->setMessage($data['message'])
->setEmail($data['email'])
->setPhoneNumber($data['phone'])
->setCallbackDate($data['wantsCallback'] ? $data['callbackDateTime'] : null)
->setCallbackTime($data['wantsCallback'] ? $data['callbackDateTime'] : null)
;
$isValid = true;
try {
switch ($data['subject']) {
case 'reservation_info': $this->erpClient->createQuoteRequest($prospectRequestModel); break;
case 'existing_reservation': $this->erpClient->createAdvRequest($prospectRequestModel); break;
case 'group_travel': $this->erpClient->createTravelRequest($prospectRequestModel); break;
default: $this->erpClient->createContactRequest($prospectRequestModel); break;
}
}
catch (\Exception $exception) {
if ($exception->getCode() === Response::HTTP_NOT_ACCEPTABLE) {
$form->addError(new FormError($exception->getMessage()));
}
else {
$form->addError(new FormError("Une erreur est survenue lors du traitement de votre demande. Merci de réessayer plus tard."));
}
$isValid = false;
}
if ($isValid) {
$query = $request->query->all();
$query['contactConfirmation'] = '1';
$redirectUrl = $request->getPathInfo();
if (!empty($query)) {
$redirectUrl .= '?' . http_build_query($query);
}
return $this->redirect($redirectUrl);
}
}
}
$attributes = array_merge($this->getSharedLayoutFormViews(), [
'form' => $form->createView(),
'formType' => $formType,
]);
return $this->renderStructure(
$structure,
$attributes,
$preview,
$partial
);
}
}