src/Controller/Front/CityController.php line 42

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: michael
  5.  * Date: 19/06/2019
  6.  * Time: 14:59
  7.  */
  8. namespace App\Controller\Front;
  9. use App\Controller\Front\LandingPage\AbstractProspectCreationController;
  10. use App\Entity\CityPost;
  11. use App\Entity\Prospect;
  12. use App\Entity\Store;
  13. use App\Form\FilterCityType;
  14. use App\Form\Model\FilterCityModel;
  15. use App\Form\ProspectType;
  16. use App\Repository\CityPostRepository;
  17. use App\Repository\ProspectOnStoreRepository;
  18. use App\Repository\StoreRepository;
  19. use App\Service\GmapsService;
  20. use App\Service\RefereeService;
  21. use App\Service\StoreService;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Doctrine\ORM\NonUniqueResultException;
  24. use Geocoder\Exception\Exception;
  25. use Knp\Component\Pager\PaginatorInterface;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. class CityController extends AbstractProspectCreationController
  30. {
  31.     /**
  32.      * @Route("/villes", name="city_post_list")
  33.      * @param CityPostRepository $cityPostRepository
  34.      * @param PaginatorInterface $paginator
  35.      * @param Request $request
  36.      * @return Response
  37.      */
  38.     public function listCityAction(CityPostRepository $cityPostRepositoryPaginatorInterface $paginatorRequest $request): Response
  39.     {
  40.         $search = new FilterCityModel();
  41.         $form $this->createForm(FilterCityType::class, $search);
  42.         $form->handleRequest($request);
  43.         $pagination $paginator->paginate(
  44.             $cityPostRepository->getFilteredCity($search),
  45.             $request->query->getInt('page'1)
  46.         );
  47.         return $this->render('front_v4/mca/city/list.html.twig', [
  48.             'pagination' => $pagination,
  49.             'form' => $form->createView()
  50.         ]);
  51.     }
  52.     /**
  53.      * @Route("/ville/{slug}", name="city_post_show", methods={"GET", "POST"})
  54.      * @param Request $request
  55.      * @param CityPost $cityPost
  56.      * @param RefereeService $refereeService
  57.      * @param StoreService $storeService
  58.      * @param GmapsService $gmapsService
  59.      * @param StoreRepository $storeRepository
  60.      * @param PaginatorInterface $paginator
  61.      * @param ProspectOnStoreRepository $prospectOnStoreRepository
  62.      * @param EntityManagerInterface $em
  63.      * @return Response
  64.      * @throws Exception
  65.      * @throws NonUniqueResultException
  66.      */
  67.     public function showCity(
  68.          Request                   $request,
  69.          CityPost                  $cityPost,
  70.          RefereeService            $refereeService,
  71.          StoreService              $storeService,
  72.          GmapsService              $gmapsService,
  73.          StoreRepository           $storeRepository,
  74.          PaginatorInterface        $paginator,
  75.          ProspectOnStoreRepository $prospectOnStoreRepository,
  76.          EntityManagerInterface    $em
  77.     ): Response
  78.     {
  79.         /* @var Prospect $propect */
  80.         $prospect = new Prospect();
  81.         $prospectForm $this->createForm(ProspectType::class, $prospect);
  82.         // Initializations
  83.         $scrollToLeadForm false// autoscroll to lead_form
  84.         $numberStoresPerPage 3;
  85.         $stores null;
  86.         $arrayPresentableStore = [];
  87.         $arraySelectionStore = [];
  88.         $arraySelectionSerialize = [];
  89.         // geocoding and find store around city
  90.         $geocodeAddress $gmapsService->getLatitudeLongitudeFromAddress(
  91.             $cityPost->getName(),
  92.             ['components' => 'zipcode:' $cityPost->getZipcode()]
  93.         );
  94.         if ($geocodeAddress !== null) {
  95.             $storeAndDistance $storeRepository->findActiveStoresAroundLocation(
  96.                 $geocodeAddress[0],
  97.                 $geocodeAddress[1],
  98.                 $request->query->get('area_search'Store::AREA_SEARCH)
  99.             );
  100.             if (!empty($storeAndDistance)) {
  101.                 foreach ($storeAndDistance as $storeWithDistance) {
  102.                     // store handling
  103.                     $store $storeWithDistance[0];
  104.                     $distance $storeWithDistance['distance'];
  105.                     $arrayPresentableStore[$store->getId()] = $storeService->serializeStoreForView($store$distance);
  106.                 }
  107.                 // page handling
  108.                 // display preferredStores only on the first page
  109.                 if ($request->query->getInt('page'1) == 1) {
  110.                     $arraySelectionStore $refereeService->getHightligthStore($geocodeAddress[0], $geocodeAddress[1]);
  111.                 }
  112.                 foreach ($arraySelectionStore as $selectedStoreWithDistance) {
  113.                     $selectedStoreId $selectedStoreWithDistance['store']->getId();
  114.                     // withdraw preferredStore of listing store
  115.                     unset($arrayPresentableStore[$selectedStoreId]);
  116.                     // array of selected store with serialization
  117.                     $arraySelectionSerialize[$selectedStoreId] = $storeService->serializeStoreForView(
  118.                         $selectedStoreWithDistance['store'],
  119.                         $selectedStoreWithDistance['distance_reel']
  120.                     );
  121.                 }
  122.                 $paginatorOnStore $paginator->paginate(
  123.                     $arrayPresentableStore,
  124.                     $request->query->getInt('page'1),
  125.                     $numberStoresPerPage,
  126.                     array('wrap-queries' => true)
  127.                 );
  128.                 $stores $paginatorOnStore->getItems();
  129.             }
  130.             // send form modal
  131.             $prospectForm->handleRequest($request);
  132.             if ($prospectForm->isSubmitted()) {
  133.                 $scrollToLeadForm true;
  134.             }
  135.             if ($prospectForm->isSubmitted() && $prospectForm->isValid()) {
  136.                 $prospect $prospectForm->getData();
  137.                 $prospect->setRequest('checkup');
  138.                 // create a prospect or redirect to a specific page if duplicate has been found
  139.                 $redirection $this->createProspectOrRedirect($prospect);
  140.                 // apply redirection if one is returned
  141.                 if (!is_null($redirection)) {
  142.                     return $redirection;
  143.                 }
  144.                 $em->flush();
  145.                 unset($prospectForm);
  146.                 $pos $prospectOnStoreRepository->findLastedProspectOnStore($prospect);
  147.                 // redirect to success page
  148.                 return $this->render('front_v4/mca/city/single.html.twig', [
  149.                     'preferred_stores' => $arraySelectionSerialize,
  150.                     'stores' => empty($paginatorOnStore) ? null $paginatorOnStore->getItems(),
  151.                     'city_post' => $cityPost,
  152.                     'scroll_to_lead_form' => $scrollToLeadForm,
  153.                     'status' => 'send_success',
  154.                     'lead_number' => md5($prospect->getEmail()),
  155.                     'pos_id' => empty($pos) ? null $pos->getId(),
  156.                 ]);
  157.             }
  158.         }
  159.         return $this->render('front_v4/mca/city/single.html.twig', [
  160.             'preferred_stores' => $arraySelectionSerialize,
  161.             'stores' => $stores,
  162.             'city_post' => $cityPost,
  163.             'prospectForm' => $prospectForm->createView(),
  164.             'scroll_to_lead_form' => $scrollToLeadForm,
  165.         ]);
  166.     }
  167. }