src/Controller/ProfileFilterController.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Dto\ProfileFilterFormData;
  4. use App\Dto\ProfileFilterFormDataFilters;
  5. use App\Dto\ProfileListSpecification;
  6. use App\Entity\Location\City;
  7. use App\Form\ProfileFilterForm;
  8. use App\Service\ProfileList;
  9. use App\Service\ProfileListingDataCreator;
  10. use App\Service\ProfileFilterService;
  11. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  16. class ProfileFilterController extends AbstractController
  17. {
  18.     use ResponseTrait;
  19.     public function __construct(
  20.         private ProfileListingDataCreator $profileListingDataCreator,
  21.         private ProfileFilterService $profilesFilterService,
  22.         private ProfileList $profileList,
  23.     ) {}
  24.     #[ParamConverter("city"converter"city_converter")]
  25.     public function form(City $cityRequest $request): Response
  26.     {
  27.         if(!$request->isXmlHttpRequest()) {
  28.             throw new BadRequestHttpException();
  29.         }
  30.         $listing $request->request->get('listing');
  31.         $listingParameters json_decode($request->request->get('listingParams'), true);
  32.         $formData = new ProfileFilterFormData($listing$listingParameters, new ProfileFilterFormDataFilters());
  33.         $listingData $this->profileListingDataCreator->getListingDataForFilter($listing$listingParameters$city);
  34.         /** @var ProfileListSpecification $specs */
  35.         $specs $listingData['specs'];
  36.         //холостой вызов, чтобы сформировался запрос и записался в свойство ProfileList
  37.         $this->profileList->listActiveWithinCityOrderedByStatusWithSpecAvoidingTopPlacement($city$specs->spec(), $specs->additionalSpecs(), $specs->genders());
  38.         $this->profilesFilterService->checkProfilesPresenceByFilters($city$listingData['listingTypeName']);
  39.         $profilePresenceByFilters $this->profilesFilterService->profilesPresenceByFilters();
  40.         $form $this->createForm(ProfileFilterForm::class, $formData, [
  41.             'action'          => $this->generateUrl('profile_filters.filter', ['city' => $city->getUriIdentity()]),
  42.             'csrf_protection' => false,
  43.             'form_data' => $formData,
  44.             'profiles_presence_by_filters' => $profilePresenceByFilters,
  45.         ]);
  46.         return $this->prepareForXhr($this->render('ProfileList/filter/form.html.twig', [
  47.             'profiles_presence_by_filters' => $profilePresenceByFilters,
  48.             'profile_filter_form' => $form->createView(),
  49.         ]));
  50.     }
  51.     #[ParamConverter("city"converter"city_converter")]
  52.     public function filter(City $cityRequest $requestProfileFilterService $profilesFilterService): Response
  53.     {
  54.         if(!$request->isXmlHttpRequest()) {
  55.             throw new BadRequestHttpException();
  56.         }
  57.         $form $this->createForm(ProfileFilterForm::class, new ProfileFilterFormData('', [], new ProfileFilterFormDataFilters()), [
  58.             'action' => $this->generateUrl('profile_filters.filter', ['city' => $city->getUriIdentity()]),
  59.             'csrf_protection' => false,
  60.         ]);
  61.         $form->handleRequest($request);
  62.         if (false === $form->isSubmitted() || false === $form->isValid()) {
  63.             throw new BadRequestHttpException('Form is not submitted');
  64.         }
  65.         /** @var ProfileFilterFormData $formData */
  66.         $formData $form->getData();
  67. //        $specs = $this->profileListSpecificationService->{$listingType}(...$listingArgs);
  68.         $listingData $this->profileListingDataCreator->getListingDataForFilter($formData->listing$formData->listingParameters$city);
  69.         $specs $listingData['specs'];
  70.         $listingTypeName $listingData['listingTypeName'];
  71.         $result $profilesFilterService->filter($city$listingTypeName$formData->filters$specs->spec(), $specs->additionalSpecs(), $specs->genders());
  72.         $presence $profilesFilterService->profilesPresenceByFilters();
  73.         $form $this->createForm(ProfileFilterForm::class, $formData, [
  74.             'action' => $this->generateUrl('profile_filters.filter', ['city' => $city->getUriIdentity()]),
  75.             'csrf_protection' => false,
  76.             'form_data' => $formData,
  77.             'profiles_presence_by_filters' => $presence,
  78.         ]);
  79.         return $this->prepareForXhr($this->render('ProfileList/profile_filter.profiles.partial.html.twig', [
  80.             'profiles' => $result,
  81.             'recommendationSpec' => \App\Specification\ElasticSearch\ProfileIsLocated::withinCity($city),
  82.             'show_pagination' => true,
  83.             'profiles_presence_by_filters' => $presence,
  84.             'profile_filter_form' => $form->createView(),
  85.         ]));
  86.     }
  87. }