src/Controller/Website/FormController.php line 28

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Website;
  3. use App\Client\ErpClient;
  4. use App\Form\Website\Type\Contact\ContactType;
  5. use App\Form\Website\Type\Newsletter\NewsletterType;
  6. use Croisiland\CommonBundle\Model\CivilityEnum;
  7. use Croisiland\CommonBundle\Model\ProspectRequestModel;
  8. use Sulu\Component\Content\Compat\StructureInterface;
  9. use Symfony\Component\Form\FormError;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. class FormController extends BaseWebsiteController
  13. {
  14. private const FORM_TYPES = [
  15. 'contact' => ContactType::class,
  16. 'newsletter' => NewsletterType::class,
  17. ];
  18. protected ErpClient $erpClient;
  19. public function __construct(ErpClient $erpClient)
  20. {
  21. $this->erpClient = $erpClient;
  22. }
  23. public function indexAction(StructureInterface $structure, $preview = false, $partial = false)
  24. {
  25. // Récupération de la requête via le container
  26. $request = $this->container->get('request_stack')->getCurrentRequest();
  27. // Récupération du type de formulaire sélectionné
  28. $formType = null;
  29. try {
  30. $formType = $structure->getPropertyValue('formType');
  31. } catch (\InvalidArgumentException $exception) {
  32. $formType = 'contact'; // Valeur par défaut
  33. }
  34. // Vérification que le type de formulaire existe
  35. if (!isset(self::FORM_TYPES[$formType])) {
  36. $formType = 'contact'; // Fallback sur contact
  37. }
  38. // Création du formulaire correspondant
  39. $formClass = self::FORM_TYPES[$formType];
  40. $initialData = null;
  41. if (
  42. $formType === 'newsletter'
  43. && $request
  44. && $request->isMethod(Request::METHOD_GET)
  45. ) {
  46. $emailFromQuery = $request->query->get('email');
  47. if (\is_string($emailFromQuery)) {
  48. $emailFromQuery = trim($emailFromQuery);
  49. if ($emailFromQuery !== '') {
  50. $initialData = [
  51. 'email' => $emailFromQuery,
  52. 'emailConfirmation' => $emailFromQuery,
  53. ];
  54. }
  55. }
  56. }
  57. $form = $this->createForm($formClass, $initialData);
  58. // Traitement de la soumission du formulaire
  59. if ($request) {
  60. $form->handleRequest($request);
  61. }
  62. // Si le formulaire est soumis et valide
  63. if ($form->isSubmitted() && $form->isValid()) {
  64. // TODO: Traiter les données du formulaire ici (email, CRM, etc.)
  65. // Page de confirmation dédiée (évite le re-submit lors d'un refresh).
  66. if ($formType === 'contact' && $request && $request->isMethod(\Symfony\Component\HttpFoundation\Request::METHOD_POST)) {
  67. $data = $form->getData();
  68. $prospectRequestModel = (new ProspectRequestModel())
  69. ->setCivility($data['civility'] === "M." ? CivilityEnum::MR : CivilityEnum::MRS)
  70. ->setFirstName($data['firstName'])
  71. ->setLastName($data['lastName'])
  72. ->setMessage($data['message'])
  73. ->setEmail($data['email'])
  74. ->setPhoneNumber($data['phone'])
  75. ->setCallbackDate($data['wantsCallback'] ? $data['callbackDateTime'] : null)
  76. ->setCallbackTime($data['wantsCallback'] ? $data['callbackDateTime'] : null)
  77. ;
  78. $isValid = true;
  79. try {
  80. switch ($data['subject']) {
  81. case 'reservation_info': $this->erpClient->createQuoteRequest($prospectRequestModel); break;
  82. case 'existing_reservation': $this->erpClient->createAdvRequest($prospectRequestModel); break;
  83. case 'group_travel': $this->erpClient->createTravelRequest($prospectRequestModel); break;
  84. default: $this->erpClient->createContactRequest($prospectRequestModel); break;
  85. }
  86. }
  87. catch (\Exception $exception) {
  88. if ($exception->getCode() === Response::HTTP_NOT_ACCEPTABLE) {
  89. $form->addError(new FormError($exception->getMessage()));
  90. }
  91. else {
  92. $form->addError(new FormError("Une erreur est survenue lors du traitement de votre demande. Merci de réessayer plus tard."));
  93. }
  94. $isValid = false;
  95. }
  96. if ($isValid) {
  97. $query = $request->query->all();
  98. $query['contactConfirmation'] = '1';
  99. $redirectUrl = $request->getPathInfo();
  100. if (!empty($query)) {
  101. $redirectUrl .= '?' . http_build_query($query);
  102. }
  103. return $this->redirect($redirectUrl);
  104. }
  105. }
  106. }
  107. $attributes = array_merge($this->getSharedLayoutFormViews(), [
  108. 'form' => $form->createView(),
  109. 'formType' => $formType,
  110. ]);
  111. return $this->renderStructure(
  112. $structure,
  113. $attributes,
  114. $preview,
  115. $partial
  116. );
  117. }
  118. }