src/Controller/ProfileFilterController.php line 33

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