src/Form/ProspectType.php line 35

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: michael
  5.  * Date: 24/04/2019
  6.  * Time: 12:06
  7.  */
  8. namespace App\Form;
  9. use App\Entity\Store;
  10. use App\Form\Type\RadioButtonChoiceType;
  11. use App\Service\GmapsService;
  12. use App\Service\RefereeService;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Doctrine\ORM\EntityRepository;
  15. use Sonata\AdminBundle\Form\Type\CollectionType;
  16. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  17. use App\Entity\ProspectOnStore;
  18. use Symfony\Component\Form\AbstractType;
  19. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  20. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  21. use Symfony\Component\Form\Extension\Core\Type\DateType;
  22. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  23. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  24. use Symfony\Component\Form\Extension\Core\Type\RadioType;
  25. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  26. use Symfony\Component\Form\Extension\Core\Type\TelType;
  27. use Symfony\Component\Form\Extension\Core\Type\TextType;
  28. use Symfony\Component\Form\FormBuilderInterface;
  29. use Symfony\Component\OptionsResolver\OptionsResolver;
  30. use Symfony\Component\Validator\Constraints\Length;
  31. class ProspectType extends AbstractType
  32. {
  33.     protected $gmapsService;
  34.     protected $refereeService;
  35.     private  $entityManager;
  36.     public function __construct(GmapsService $gmapsServiceRefereeService $refereeServiceEntityManagerInterface $entityManager)
  37.     {
  38.         $this->gmapsService $gmapsService;
  39.         $this->refereeService $refereeService;
  40.         $this->entityManager $entityManager;
  41.     }
  42.     public function buildForm(FormBuilderInterface $builder, array $options)
  43.     {
  44.         // WARNING : Deux formulaires (avec et sans étape)
  45.         if(isset($options['flow_step'])) {
  46.             // formulaire avec étape
  47.             switch ($options['flow_step']) {
  48.                 case 1:
  49.                     $builder
  50.                         ->add('lastname'TextType::class, [
  51.                             'label' => false,
  52.                             'attr' => [
  53.                                 'placeholder' => 'Nom'
  54.                             ]
  55.                         ])
  56.                         ->add('firstname'TextType::class, [
  57.                             'label' => false,
  58.                             'attr' => [
  59.                                 'placeholder' => 'Prénom',
  60.                             ]
  61.                         ])
  62.                         ->add('phoneNumber'TelType::class, [
  63.                             'label' => false,
  64.                             'attr' => [
  65.                                 'placeholder' => 'Téléphone',
  66.                                 'class' => 'cleave-phone-number'
  67.                             ]
  68.                         ])
  69.                         ->add('email'EmailType::class, [
  70.                             'label' => false,
  71.                             'attr' => [
  72.                                 'placeholder' => 'Email'
  73.                             ],
  74.                         ])
  75.                         ->add('yearOfBirth'IntegerType::class, [
  76.                             'label' => false,
  77.                             'attr' => [
  78.                                 'placeholder' => 'Année de naissance',
  79.                                 'class' => 'cleave-year-of-birth hide-number-input'
  80.                             ],
  81.                         ])
  82.                         ->add('address'TextType::class, [
  83.                             'label' => false,
  84.                             'attr' => [
  85.                                 'placeholder' => 'Adresse'
  86.                             ],
  87.                         ])
  88.                         ->add('postalcode'IntegerType::class, [
  89.                             'label' => false,
  90.                             'attr' => [
  91.                                 'placeholder' => 'Code postal',
  92.                                 'class' => 'cleave-postal-code autocomplete-postal-code hide-number-input'
  93.                             ],
  94.                         ])
  95.                         ->add('city'TextType::class, [
  96.                             'label' => false,
  97.                             'attr' => [
  98.                                 'placeholder' => 'Ville',
  99.                                 'class' => 'autocomplete-city'
  100.                             ],
  101.                         ])
  102.                         ->add('is_orl_prescription'RadioButtonChoiceType::class, [
  103.                             'required' => true,
  104.                             'choices' => [
  105.                                 'Oui' => '1',
  106.                                 'Non' => '0'
  107.                             ],
  108.                             'label' => 'Avez-vous une ordonnance ORL ?',
  109.                             'attr' => ['class' => 'form-inline form-check-input']
  110.                         ])
  111.                         ->add('is_privacy'CheckboxType::class, [
  112.                             'label' => 'J\'accepte la politique de protection des données personnelles',
  113.                         ])
  114.                         ->add('is_optin'CheckboxType::class, [
  115.                             'label' => 'J\'accepte de recevoir par e-mail ou sms les offres et actualités de Mon Centre Auditif',
  116.                             'required' => false,
  117.                         ])
  118.                         ->add('is_partner_offer'CheckboxType::class, [
  119.                             'label' => 'J’accepte de recevoir des offres commerciales de la part du ou des partenaires audioprothésistes.',
  120.                             'required' => false,
  121.                         ]);
  122.                     break;
  123.                 case 2:
  124.                     $fullAddress $options['data']->getAddress() . ' ' $options['data']->getPostalCode() . ' ' $options['data']->getCity();
  125.                     $geocode $this->gmapsService->getLatitudeLongitudeFromAddress($fullAddress);
  126.                     // récupérer les 3 centres les plus proches de l'adresse de l'utilisateur
  127.                     /*
  128.                      * SELECTION MCA
  129.                      */
  130.                     // Application de l'algorithme de trie (SAW) sur les stores clients MCA
  131.                     $storeBySaw $this->refereeService->sawAnalysisFunction($geocode[0], $geocode[1], Store::AREA_SEARCHStore::WEIGHT_LEAD_COSTStore::WEIGHT_RATIO_CAPPINGStore::WEIGHT_DISTANCE);
  132.                     if($storeBySaw === null) {
  133.                         $wideAreaDistance Store::AREA_SEARCH 50;
  134.                         $storeBySaw $this->refereeService->sawAnalysisFunction($geocode[0], $geocode[1], $wideAreaDistanceStore::WEIGHT_LEAD_COSTStore::WEIGHT_RATIO_CAPPINGStore::WEIGHT_DISTANCE);
  135.                     }
  136.                     $i 0;
  137.                     $tabStore = [];
  138.                     $tabDistance = [];
  139.                     while ($i count($storeBySaw)) {
  140.                         $tabStore[] = $storeBySaw[$i]['store'];
  141.                         $tabDistance[] = [$i => $storeBySaw[$i]['distance_reel']];
  142.                         if($i >= Store::NUM_TOP_CLIENT_STORE 1) {
  143.                             break;
  144.                         }
  145.                         ++$i;
  146.                     }
  147.                     $builder
  148.                         ->add('prospectsOnStore'ChoiceType::class, [
  149.                             'choices' => $tabStore,
  150.                             'choice_value' => function ($entity null) {
  151.                                 return ($entity instanceof Store) ? $entity->getId() : '';
  152.                             },
  153.                             'choice_attr' => $tabDistance,
  154.                             'label' => false,
  155.                             'expanded' => true,
  156.                             'multiple' => false,
  157.                             'mapped' => false,
  158.                             'attr' => [
  159.                                 'class' => 'sr-only'
  160.                             ],
  161.                             'preferred_choices' => [$tabStore[0]],
  162.                             'data' => 0
  163.                         ])
  164.                         ->add('prospect_id'null, [
  165.                             'mapped' => false,
  166.                             'data' => $options['data']->getId(),
  167.                             'label' => false,
  168.                             'attr' => [
  169.                                 'hidden' => true
  170.                             ],
  171.                         ])
  172.                     ;
  173.                     break;
  174.                     /*$builder
  175.                         ->add('prospectsOnStore', EntityType::class, array(
  176.                             'multiple' => true,   // Multiple selection allowed
  177.                             'expanded' => true,   // Render as checkboxes
  178.                             'class' => Store::class,
  179.                             'label' => false,
  180.                             'choice_label' => function (Store $store) {
  181.                                 return ' ';
  182.                             },
  183.                             'choice_attr' => function($choice, $key, $value) {
  184.                                 // adds a class like attending_yes, attending_no, etc
  185.                                 return ['address'  . '/' . $choice . '/' . $key];
  186.                             },
  187.                             'query_builder' => function (EntityRepository $er) use ($options, $geocode) {
  188.                                 $results = $er->createQueryBuilder('s')
  189.                                     ->select('h, s')
  190.                                     ->join('s.hearingBrand', 'h')
  191.                                     ->andwhere('s.zipCode = :zipcode')
  192.                                     ->andwhere('s.state = :state')
  193.                                     ->setParameters(['zipcode' => $options['data']->getPostalcode(), 'state' => 'valid'])
  194.                                     ->addGroupBy('h.id')
  195.                                     ->setMaxResults('3')
  196.                                     ;
  197.                                 return $results;
  198.                             },
  199.                             'mapped' => false,
  200.                         ));
  201.                     break;*/
  202.             }
  203.         } else {
  204.             // formulaire sans étape
  205.             $builder
  206.                 ->add('firstname'TextType::class, [
  207.                     'label' => 'Prénom',
  208.                     'required' => true,
  209.                     'attr' => [
  210.                         //'placeholder' => 'Eric'
  211.                         'placeholder' => 'Prénom'
  212.                     ]
  213.                 ])
  214.                 ->add('lastname'TextType::class, [
  215.                     'label' => 'Nom' ,
  216.                     'attr' => [
  217.                         //'placeholder' => 'BOIS'
  218.                         'placeholder' => 'Nom'
  219.                     ]
  220.                 ])
  221.                 ->add('phoneNumber'TelType::class, [
  222.                     'label' => 'Téléphone',
  223.                     'attr' => [
  224.                         //'placeholder' => '06 57 34 57 00',
  225.                         'placeholder' => 'Téléphone',
  226.                         'class' => 'cleave-phone-number'
  227.                     ]
  228.                 ])
  229.                 ->add('email'TextType::class, [
  230.                     'label' => 'Email',
  231.                     'attr' => [
  232.                         'placeholder' => 'Email'
  233.                         //'placeholder' => 'eric.bois@gmail.com'
  234.                     ]
  235.                 ])
  236.                 ->add('yearOfBirth'IntegerType::class, [
  237.                     'label' => 'Année de naissance',
  238.                     'attr' => [
  239.                         //'placeholder' => '1996',
  240.                         'placeholder' => 'Année de naissance',
  241.                         'class' => 'cleave-year-of-birth hide-number-input'
  242.                     ]
  243.                 ])
  244.                 ->add('address'TextType::class, [
  245.                     'label' => 'Adresse',
  246.                     'attr' => [
  247.                         //'placeholder' => '124 rue Lamarck'
  248.                         'placeholder' => 'Adresse'
  249.                     ],
  250.                 ])
  251.                 ->add('postalcode'TelType::class, [
  252.                     'label' => 'Code postal',
  253.                     'attr' => [
  254.                         //'placeholder' => '75018',
  255.                         'placeholder' => 'Code postal',
  256.                         'class' => 'cleave-postal-code autocomplete-postal-code hide-number-input',
  257.                         'list' => 'output',
  258.                     ],
  259.                 ])
  260.                 ->add('city'TextType::class, [
  261.                     'label' => 'Ville',
  262.                     'attr' => [
  263.                         //'placeholder' => 'Paris',
  264.                         'placeholder' => 'Ville',
  265.                         'class' => 'autocomplete-city'
  266.                     ],
  267.                 ])
  268.                ->add('is_orl_prescription'RadioButtonChoiceType::class, [
  269.                    'required' => true,
  270.                    'choices' => [
  271.                        'Oui' => '1',
  272.                        'Non' => '0'
  273.                    ],
  274.                    'label' => 'Avez-vous une ordonnance ORL ?',
  275.                    'attr' => ['class' => 'form-inline my-3']
  276.                ])
  277.                 ->add('is_privacy'CheckboxType::class, [
  278.                     'label' => 'J\'accepte la politique de protection des données personnelles',
  279.                     'constraints' => array(
  280.                         new \Symfony\Component\Validator\Constraints\NotBlank(['message' => 'Champ obligatoire']),
  281.                     ),
  282.                     'attr' => [
  283.                         'placeholder' => 'Accepter',
  284.                     ]
  285.                 ])
  286.                 ->add('is_optin'CheckboxType::class, [
  287.                     'label' => 'J\'accepte de recevoir par e-mail ou sms les offres et actualités de Mon Centre Auditif',
  288.                     'required' => false,
  289.                 ])
  290.                 ->add('submit'SubmitType::class, [
  291.                     'label' => 'Je valide ma demande',
  292.                     'attr' => [
  293.                         'class' => 'w-100 btn btn-success'
  294.                     ]
  295.                 ])
  296.                 ->add('is_partner_offer'CheckboxType::class, [
  297.                     'label' => 'J’accepte de recevoir des offres commerciales de la part du ou des partenaires audioprothésistes.',
  298.                     'required' => false,
  299.                 ])
  300.             ;
  301.         }
  302.     }
  303.     public function getBlockPrefix() {
  304.         return 'prospectTypeStep1';
  305.     }
  306.     public function configureOptions(OptionsResolver $resolver)
  307.     {
  308.         $resolver->setDefaults([
  309.             'csrf_protection' => true,
  310.             'csrf_field_name' => '_token',
  311.             // important part; unique key
  312.             'csrf_token_id'   => 'prospect_token',
  313.         ]);
  314.     }
  315. }