src/Form/Website/Type/PurchaseQuoteRequest/PurchaseQuoteRequestType.php line 187

Open in your IDE?
  1. <?php
  2. namespace App\Form\Website\Type\PurchaseQuoteRequest;
  3. use Crea\ToolsBundle\Helper\EntityManagerHelper;
  4. use Croisiland\CommonBundle\Entity\Cabin\CabinCategory;
  5. use Croisiland\CommonBundle\Entity\Cruise\Cruise;
  6. use Croisiland\CommonBundle\Entity\Partner\Partner;
  7. use Croisiland\CommonBundle\Model\CivilityEnum;
  8. use Croisiland\CommonBundle\Model\ProspectRequestModel;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\Form\AbstractType;
  11. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  12. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  13. use Symfony\Component\Form\Extension\Core\Type\CollectionType;
  14. use Symfony\Component\Form\Extension\Core\Type\DateType;
  15. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  16. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  17. use Symfony\Component\Form\Extension\Core\Type\TelType;
  18. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  19. use Symfony\Component\Form\Extension\Core\Type\TextType;
  20. use Symfony\Component\Form\Extension\Core\Type\TimeType;
  21. use Symfony\Component\Form\FormBuilderInterface;
  22. use Symfony\Component\Form\FormEvent;
  23. use Symfony\Component\Form\FormEvents;
  24. use Symfony\Component\OptionsResolver\OptionsResolver;
  25. use Symfony\Component\Validator\Constraints\Email;
  26. use Symfony\Component\Validator\Constraints\IsTrue;
  27. use Symfony\Component\Validator\Constraints\Length;
  28. use Symfony\Component\Validator\Constraints\NotBlank;
  29. use Symfony\Component\Validator\Constraints\Regex;
  30. use Symfony\Contracts\Translation\TranslatorInterface;
  31. class PurchaseQuoteRequestType extends AbstractType
  32. {
  33. protected TranslatorInterface $translator;
  34. protected EntityManagerInterface $entityManager;
  35. public function __construct(TranslatorInterface $translator, EntityManagerInterface $entityManager)
  36. {
  37. $this->translator = $translator;
  38. $this->entityManager = $entityManager;
  39. }
  40. public function buildForm(FormBuilderInterface $builder, array $options): void
  41. {
  42. $builder
  43. ->add('civility', ChoiceType::class, [
  44. 'label' => 'website.forms.contact.label.civility',
  45. 'choices' => [
  46. 'website.forms.civility.man' => CivilityEnum::MR->value,
  47. 'website.forms.civility.women' => CivilityEnum::MRS->value
  48. ],
  49. 'expanded' => true,
  50. 'getter' => function (ProspectRequestModel $prospectRequestModel): string {
  51. return $prospectRequestModel->getCivility()->value;
  52. },
  53. 'setter' => function (ProspectRequestModel $prospectRequestModel, ?string $choice): void {
  54. $prospectRequestModel->setCivility($choice === CivilityEnum::MR->value ? CivilityEnum::MR : CivilityEnum::MRS);
  55. },
  56. ])
  57. ->add('lastName', TextType::class, [
  58. 'label' => 'website.forms.contact.label.last_name',
  59. 'attr' => [
  60. 'placeholder' => 'website.forms.contact.placeholder.last_name',
  61. ],
  62. 'constraints' => [
  63. new NotBlank(),
  64. new Length(null, 2, 255),
  65. ]
  66. ])
  67. ->add('firstName', TextType::class, [
  68. 'label' => 'website.forms.contact.label.first_name',
  69. 'attr' => [
  70. 'placeholder' => 'website.forms.contact.placeholder.first_name',
  71. ],
  72. 'constraints' => [
  73. new NotBlank(),
  74. new Length(null, 2, 255),
  75. ]
  76. ])
  77. ->add('email', EmailType::class, [
  78. 'label' => 'website.forms.contact.label.email',
  79. 'attr' => [
  80. 'placeholder' => 'website.forms.contact.placeholder.email',
  81. ],
  82. 'constraints' => [
  83. new NotBlank(),
  84. new Email(),
  85. new Length(null, 2, 255),
  86. ]
  87. ])
  88. ->add('phoneNumber', TelType::class, [
  89. 'label' => 'website.forms.contact.label.phone_number',
  90. 'constraints' => [
  91. new NotBlank(),
  92. new Regex([
  93. 'pattern' => '/^\\+?[0-9][0-9\\s\\-\\(\\)]{8,}$/',
  94. 'message' => 'Veuillez saisir un numéro de téléphone valide.',
  95. ]),
  96. ],
  97. ])
  98. ->add('purchaseQuoteRequestPassengers', CollectionType::class, [
  99. 'label' => 'website.forms.cruise_prospect_request.label.passengers',
  100. 'entry_type' => PurchaseQuoteRequestPassengerType::class,
  101. 'allow_add' => true,
  102. 'allow_delete' => true,
  103. 'by_reference' => false,
  104. 'error_bubbling' => false,
  105. ])
  106. ->add('message', TextareaType::class, [
  107. 'label' => $this->translator->trans('website.forms.contact.label.message'),
  108. 'attr' => [
  109. 'placeholder' => $this->translator->trans('website.forms.contact.label.content'),
  110. 'data-max-words' => 225
  111. ],
  112. 'constraints' => [
  113. new NotBlank(),
  114. new Length(['max' => 1125]) // 225 mots × 5 caractères par mot en moyenne
  115. ]
  116. ])
  117. ->add('newsletter', CheckboxType::class, [
  118. 'label' => 'website.forms.quote_request.label.newsletter',
  119. 'required' => false
  120. ])
  121. ->add('purchaseId', HiddenType::class, [
  122. 'required' => false,
  123. 'mapped' => false,
  124. ])
  125. ->add('cabinId', HiddenType::class, [
  126. 'required' => false,
  127. 'mapped' => false,
  128. ])
  129. ->add('atmosphereId', HiddenType::class, [
  130. 'required' => false,
  131. 'mapped' => false,
  132. ])
  133. ->add('subtypeId', HiddenType::class, [
  134. 'required' => false,
  135. 'mapped' => false,
  136. ])
  137. ->add('categoryId', HiddenType::class, [
  138. 'required' => false,
  139. 'mapped' => false
  140. ])
  141. ->add('price', HiddenType::class, [
  142. 'required' => false
  143. ])
  144. ->add('reservationMethod', HiddenType::class, [
  145. 'required' => false,
  146. 'mapped' => false,
  147. ])
  148. ->add('consent', CheckboxType::class, [
  149. 'label' => 'website.forms.quote_request.label.consent',
  150. 'required' => true,
  151. 'mapped' => false,
  152. 'constraints' => [
  153. new IsTrue([
  154. 'message' => 'Vous devez accepter l\'exploitation de vos données.',
  155. ]),
  156. ],
  157. ])
  158. ->add('cruise', HiddenType::class, [
  159. 'required' => false,
  160. 'getter' => function (ProspectRequestModel $prospectRequestModel): ?int {
  161. return $prospectRequestModel->getCruise()?->getId();
  162. },
  163. 'setter' => function (ProspectRequestModel $prospectRequestModel, ?int $cruiseId): void {
  164. if ($cruiseId !== null) {
  165. $prospectRequestModel->setCruise($this->entityManager->getRepository(Cruise::class)->find($cruiseId));
  166. }
  167. },
  168. ])
  169. ->add('partner', HiddenType::class, [
  170. 'required' => false,
  171. 'getter' => function (ProspectRequestModel $prospectRequestModel): ?int {
  172. return $prospectRequestModel->getPartner()?->getId();
  173. },
  174. 'setter' => function (ProspectRequestModel $prospectRequestModel, ?int $partnerId): void {
  175. if ($partnerId !== null) {
  176. $prospectRequestModel->setPartner($this->entityManager->getRepository(Partner::class)->find($partnerId));
  177. }
  178. },
  179. ])
  180. ->add('cabinCategory', HiddenType::class, [
  181. 'required' => false,
  182. 'getter' => function (ProspectRequestModel $prospectRequestModel): ?int {
  183. return $prospectRequestModel->getCabinCategory()?->getId();
  184. },
  185. 'setter' => function (ProspectRequestModel $prospectRequestModel, ?int $cabinCategoryId): void {
  186. if ($cabinCategoryId !== null) {
  187. $prospectRequestModel->setCabinCategory($this->entityManager->getRepository(CabinCategory::class)->find($cabinCategoryId));
  188. }
  189. },
  190. ])
  191. ;
  192. $builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
  193. $form = $event->getForm();
  194. $data = $event->getData();
  195. $passengersCount = 0;
  196. if (is_object($data) && method_exists($data, 'getPurchaseQuoteRequestPassengers')) {
  197. $passengersCount = count($data->getPurchaseQuoteRequestPassengers());
  198. } elseif (is_array($data) && isset($data['purchaseQuoteRequestPassengers'])) {
  199. $passengersCount = count($data['purchaseQuoteRequestPassengers']);
  200. }
  201. $form
  202. ->add('purchaseQuoteRequestPassengersSelect', ChoiceType::class, [
  203. 'label' => null,
  204. 'choices' => [
  205. '1' => '1',
  206. '2' => '2',
  207. '3' => '3',
  208. '4' => '4',
  209. '5' => '5',
  210. '6' => '6'
  211. ],
  212. 'data' => $passengersCount > 0 ? (string)$passengersCount : '1',
  213. 'mapped' => false,
  214. ])
  215. ;
  216. // Champs de rappel obligatoires
  217. $form
  218. ->add('callbackDate', DateType::class, [
  219. 'label' => $this->translator->trans('website.forms.contact.label.callback_date'),
  220. 'widget' => 'single_text',
  221. 'format' => 'yyyy-MM-dd',
  222. 'attr' => [
  223. 'placeholder' => $this->translator->trans('website.forms.contact.placeholder.callback_date'),
  224. ],
  225. 'required' => true
  226. ])
  227. ->add('callbackTime', TimeType::class, [
  228. 'label' => ' ',
  229. 'required' => true,
  230. 'widget' => 'single_text',
  231. 'attr' => [
  232. 'placeholder' => $this->translator->trans('website.forms.contact.placeholder.callback_time'),
  233. ],
  234. ])
  235. ;
  236. });
  237. }
  238. public function configureOptions(OptionsResolver $resolver)
  239. {
  240. $resolver->setDefaults([
  241. "data_class" => ProspectRequestModel::class,
  242. "translation_domain" => "messages",
  243. "validation_groups" => ['Default', 'prospect_request_model_form_validator']
  244. ]);
  245. }
  246. }