src/Form/TransporteurType.php line 201

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\{TransporteurDepartmentCountryProfessionalType};
  4. use App\Form\UserTransporteurType;
  5. use App\Repository\{DepartmentRepositoryCountryRepository};
  6. use Symfony\Component\Form\AbstractType;
  7. use Symfony\Component\Form\FormBuilderInterface;
  8. use Symfony\Component\OptionsResolver\OptionsResolver;
  9. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  10. use Symfony\Component\Form\Extension\Core\Type\TextType;
  11. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  12. use Symfony\Component\Form\Extension\Core\Type\TelType;
  13. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  14. use Symfony\Component\Form\Extension\Core\Type\DateType;
  15. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  16. use Symfony\Component\Form\Extension\Core\Type\FileType;
  17. use Symfony\Component\Validator\Constraints\Email;
  18. use Symfony\Component\Validator\Constraints\IsTrue;
  19. use Symfony\Component\Validator\Constraints\Length;
  20. use Symfony\Component\Validator\Constraints\NotBlank;
  21. use Symfony\Component\Validator\Constraints\Count;
  22. use App\Validator\Constraints\UniqueEmail;
  23. use App\Validator\Constraints\ValidPhoneNumber;
  24. use Symfony\Component\Validator\Constraints\Regex;
  25. use Symfony\Component\Routing\RouterInterface;
  26. use Symfony\Contracts\Translation\TranslatorInterface;
  27. class TransporteurType extends AbstractType
  28. {
  29.     private $router;
  30.     private $translator;
  31.     public function __construct(RouterInterface $routerTranslatorInterface $translator)
  32.     {
  33.         $this->router $router;
  34.         $this->translator $translator;
  35.     }
  36.     public function buildForm(FormBuilderInterface $builder, array $options): void
  37.     {
  38.         $termsUrl $this->router->generate('app_front_terms');
  39.         $privacyUrl $this->router->generate('app_front_privacy');
  40.         $builder
  41.             ->add('professionalType'EntityType::class, [
  42.                 'label' => 'Type de professionnel',
  43.                 'label_attr' => [
  44.                     'class' => 'width-auto mt-08rem'
  45.                 ],
  46.                 'attr' => [
  47.                     'class' => 'chosen-select search-select nice-select-profession mb-0'
  48.                 ],
  49.                 'class' => ProfessionalType::class,
  50.                 'choice_label' => 'name',
  51.                 'multiple' => true,
  52.                 'expanded' => false,
  53.                 'required' => true,
  54.                 'constraints' => [
  55.                     new NotBlank([
  56.                         'message' => 'Veuillez entrer votre type de professionnel !',
  57.                     ])
  58.                 ]
  59.             ])
  60.             ->add('socialDenomination'TextType::class, [
  61.                 'label' => '<i class="fas fa-building"></i> Dénomination sociale',
  62.                 'label_html' => true,
  63.                 'constraints' => [
  64.                     new NotBlank([
  65.                         'message' => 'Veuillez entrer votre dénomination sociale !',
  66.                     ]),
  67.                 ],
  68.                 'required' => true
  69.             ])
  70.             ->add('siret'TextType::class, [
  71.                 'label' => '<i class="fas fa-id-card"></i> Numéro Siret ou Siren',
  72.                 'label_html' => true,
  73.                 'attr' => [
  74.                     'maxlength' => '14',
  75.                     'minlength' => '9'
  76.                 ],
  77.                 'constraints' => [
  78.                     new Length([
  79.                         'min' => 9,
  80.                         'max' => 14,
  81.                         'minMessage' => 'Le Numéro Siret ou Siren doit avoir au moins {{ limit }} caractères.',
  82.                         'maxMessage' => 'Le numéro SIRET ou SIREN ne peut pas contenir plus de {{ limit }} caractères.',
  83.                     ]),
  84.                     new NotBlank([
  85.                         'message' => 'Veuillez entrer votre numéro SIRET ou SIREN !',
  86.                     ]),
  87.                 ],
  88.                 'required' => true
  89.             ])
  90.             ->add('tva'TextType::class, [
  91.                 'label' => '<i class="fas fa-receipt"></i> TVA',
  92.                 'label_html' => true,
  93.                 'required' => false
  94.             ])
  95.             ->add('landlinePhone'TelType::class, [
  96.                 'label' => 'Téléphone professionnel <i class="far fa-phone-office"></i>',
  97.                 'label_html' => true,
  98.                 'attr' => [
  99.                     'maxlength' => 20
  100.                 ],
  101.                 'constraints' => [
  102.                     new ValidPhoneNumber(),
  103.                     new Length([
  104.                         'min' => 8,
  105.                         'minMessage' => 'Le numéro de téléphone fixe doit avoir au moins {{ limit }} caractères.',
  106.                     ])
  107.                 ],
  108.                 'required' => false
  109.             ])
  110.             ->add('address'TextType::class, [
  111.                 'label' => 'Adresse <i class="fas fa-map-marker"></i>',
  112.                 'label_html' => true,
  113.                 'constraints' => [
  114.                     new NotBlank([
  115.                         'message' => 'Veuillez entrer votre adresse !',
  116.                     ]),
  117.                     new Length([
  118.                         'min' => 3,
  119.                         'minMessage' => 'L\'adresse doit avoir au moins {{ limit }} caractères.',
  120.                     ]),
  121.                 ],
  122.                 'attr' => [
  123.                     'placeholder' => 'Choisissez votre adresse',
  124.                     'autocomplete' => 'off',
  125.                     'class' => 'autocomplete-input-transporteur'
  126.                 ],
  127.                 'required' => true
  128.             ])
  129.             ->add('address1'TextType::class, [
  130.                 'label' => 'Adresse 2 <i class="fas fa-map-marker"></i>',
  131.                 'label_html' => true,
  132.                 'constraints' => [
  133.                     new Length([
  134.                         'min' => 3,
  135.                         'minMessage' => 'L\'adresse 2 doit avoir au moins {{ limit }} caractères.',
  136.                     ]),
  137.                 ],
  138.                 'attr' => [
  139.                     'placeholder' => 'Complément d\'adresse',
  140.                     'minlength' => 3,
  141.                     'autocomplete' => 'off'
  142.                 ],
  143.                 'required' => false
  144.             ])
  145.             ->add('postalCode'TextType::class, [
  146.                 'label' => 'Code postal <i class="fas fas fa-map-pin"></i>',
  147.                 'label_html' => true,
  148.                 'constraints' => [
  149.                     new NotBlank([
  150.                         'message' => 'Veuillez entrer votre code postal !',
  151.                     ]),
  152.                     new Regex([
  153.                         'pattern' => '/^\d+$/',
  154.                         'message' => 'Le code postal doit contenir uniquement des chiffres.',
  155.                     ]),
  156.                     new Length([
  157.                         'min' => 3,
  158.                         'minMessage' => 'Le code postal doit avoir au moins {{ limit }} chiffres.',
  159.                     ]),
  160.                 ],
  161.                 'attr' => [
  162.                     'minlength' => 3
  163.                 ],
  164.                 'required' => true
  165.             ])
  166.             ->add('city'TextType::class, [
  167.                 'label' => 'Ville <i class="fas fa-city"></i>',
  168.                 'label_html' => true,
  169.                 'constraints' => [
  170.                     new NotBlank([
  171.                         'message' => 'Veuillez entrer votre ville !',
  172.                     ]),
  173.                     new Length([
  174.                         'min' => 3,
  175.                         'minMessage' => 'La ville doit avoir au moins {{ limit }} caractères.',
  176.                     ]),
  177.                 ],
  178.                 'attr' => [
  179.                     'minlength' => 3,
  180.                 ],
  181.                 'required' => true
  182.             ])
  183.             ->add('department'EntityType::class, [
  184.                 'label' => 'Département de travail principal',
  185.                 'attr' => [
  186.                     'class' => 'chosen-select search-select nice-select-map mb-0'
  187.                 ],
  188.                 'class' => Department::class,
  189.                 'choice_label' => 'name',
  190.                 'query_builder' => function (DepartmentRepository $repo) {
  191.                     return $repo->createQueryBuilder('d')
  192.                                 ->where('d.status = :status')
  193.                                 ->setParameter('status'true);
  194.                 },
  195.                 'constraints' => [
  196.                     new NotBlank([
  197.                         'message' => 'Veuillez entrer votre département !',
  198.                     ])
  199.                 ],
  200.                 'required' => true
  201.             ])
  202.             ->add('country'EntityType::class, [
  203.                 'label' => 'Pays',
  204.                 'attr' => [
  205.                     'class' => 'chosen-select search-select nice-select-country mb-0'
  206.                 ],
  207.                 'class' => Country::class,
  208.                 'choice_label' => function (Country $country) {
  209.                     return $country->getPays();
  210.                 },
  211.                 'query_builder' => function (CountryRepository $repo) {
  212.                     return $repo->createQueryBuilder('c')
  213.                                 ->where('c.status = :status')
  214.                                 ->setParameter('status'true);
  215.                 },
  216.                 'constraints' => [
  217.                     new NotBlank([
  218.                         'message' => 'Veuillez entrer votre pays !',
  219.                     ]),
  220.                 ],
  221.                 'required' => true,
  222.             ])
  223.             ->add('longitude'TextType::class, [
  224.                 'label' => 'Longitude <i class="fal fa-long-arrow-alt-right"></i>',
  225.                 'label_html' => true,
  226.                 'label_attr' => [
  227.                     'class' => 'width-auto mt-08rem'
  228.                 ],
  229.                 'constraints' => [
  230.                     new NotBlank([
  231.                         'message' => 'Veuillez entrer votre longitude !',
  232.                     ]),
  233.                 ],
  234.                 'attr' => [
  235.                     'placeholder' => 'Map Longitude'
  236.                 ],
  237.                 'required' => true
  238.             ])
  239.             ->add('latitude'TextType::class, [
  240.                 'label' => 'Latitude <i class="fal fa-long-arrow-alt-right"></i>',
  241.                 'label_html' => true,
  242.                 'label_attr' => [
  243.                     'class' => 'width-auto mt-08rem'
  244.                 ],
  245.                 'constraints' => [
  246.                     new NotBlank([
  247.                         'message' => 'Veuillez entrer votre latitude !',
  248.                     ]),
  249.                 ],
  250.                 'attr' => [
  251.                     'placeholder' => 'Map Latitude'
  252.                 ],
  253.                 'required' => true
  254.             ])
  255.             ->add('typePersonne'ChoiceType::class, [
  256.                 'label' => 'J\'interviens en tant que',
  257.                 'choices' => [
  258.                     'Dirigeant de l\'entreprise' => 'Dirigeant de l\'entreprise',
  259.                     'Responsable' => 'Responsable',
  260.                     'Secrétaire' => 'Secrétaire',
  261.                     'Autre' => 'Autre',
  262.                 ],
  263.                 'expanded' => true,
  264.                 'multiple' => false,
  265.                 'required' => true 
  266.                 // 'data' => 'Dirigeant de l\'entreprise'
  267.             ])
  268.             ->add('otherFunction'TextType::class, [
  269.                 'label' => 'Précisez votre profession (si autre)',
  270.                 'required' => false
  271.             ])
  272.             ->add('user'UserTransporteurType::class, [
  273.                 'label' => true
  274.             ])
  275.             ->add('birthday'DateType::class, [
  276.                 'label' => 'Date de naissance <i class="fas fa-calendar-alt"></i>',
  277.                 'label_html' => true,
  278.                 'widget' => 'single_text',
  279.                 'constraints' => [
  280.                     new NotBlank([
  281.                         'message' => 'Veuillez entrer votre date de naissance !',
  282.                     ])
  283.                 ],
  284.                 'html5' => false,
  285.                 'format' => 'dd-MM-yyyy',
  286.                 'attr' => [
  287.                     'class' => 'flatpickr-birthday',
  288.                     'placeholder' => 'jj-mm-aaaa',
  289.                     'readonly' => true
  290.                 ],
  291.                 'required' => true
  292.             ])
  293.             ->add('birthplace'TextType::class, [
  294.                 'label' => 'Lieu de naissance <i class="fas fa-map-marker-alt"></i>',
  295.                 'label_html' => true,
  296.                 'constraints' => [
  297.                     new NotBlank([
  298.                         'message' => 'Veuillez entrer votre lieu de naissance !',
  299.                     ]),
  300.                 ],
  301.                 'required' => true
  302.             ])
  303.             ->add('mobilePhone'TelType::class, [
  304.                 'label' => 'Téléphone personnel <i class="far fa-phone"></i>',
  305.                 'label_html' => true,
  306.                 'attr' => [
  307.                     'maxlength' => 20
  308.                 ],
  309.                 'constraints' => [
  310.                     new NotBlank([
  311.                         'message' => 'Veuillez entrer votre numéro de téléphone !',
  312.                     ]),
  313.                     new ValidPhoneNumber(),
  314.                     new Length([
  315.                         'min' => 10,
  316.                         'minMessage' => 'Le numéro de téléphone mobile doit avoir au moins {{ limit }} caractères.',
  317.                     ])
  318.                 ],
  319.                 'required' => true
  320.             ])
  321.             
  322.             ->add('agreeTerms'CheckboxType::class, [
  323.                 'mapped' => false,
  324.                 'constraints' => [
  325.                     new IsTrue([
  326.                         'message' => 'Vous devez accepter notre conditions.',
  327.                     ]),
  328.                 ],
  329.                 'label_attr' => [
  330.                     'style' => 'width: 90% !important; margin-left: 0.5rem; cursor: pointer !important'
  331.                 ],
  332.                 'label' => sprintf(
  333.                     'J\'accepte les <a href="%s" class="text-theme-blue">%s</a> et la <a href="%s" class="text-theme-blue">%s</a>.',
  334.                     $termsUrl,
  335.                     $this->translator->trans('conditions d\'utilisation'),
  336.                     $privacyUrl,
  337.                     $this->translator->trans('politique de confidentialité')
  338.                 ),
  339.                 'label_html' => true,
  340.                 'required' => true
  341.             ])
  342.         ;
  343.     }
  344.     public function configureOptions(OptionsResolver $resolver): void
  345.     {
  346.         $resolver->setDefaults([
  347.             'data_class' => Transporteur::class,
  348.         ]);
  349.     }
  350.     /**
  351.      * {@inheritdoc}
  352.      */
  353.     public function getBlockPrefix()
  354.     {
  355.         return 'sg_transporteur';
  356.     }
  357. }