src/Controller/ProfileSearchController.php line 55

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by simpson <simpsonwork@gmail.com>
  4.  * Date: 2019-04-05
  5.  * Time: 20:11
  6.  */
  7. namespace App\Controller;
  8. use App\Entity\Location\City;
  9. use App\Form\SearchProfileForm;
  10. use App\Service\ProfileList;
  11. use App\Specification\ElasticSearch\Spec;
  12. use App\Specification\Profile\ProfileIsProvidingMostOfServices;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  15. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  16. use Symfony\Component\Form\FormInterface;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  19. use Symfony\Component\HttpFoundation\Response;
  20. class ProfileSearchController extends AbstractController
  21. {
  22.     use ExtendedPaginationTrait;
  23.     const ENTRIES_ON_PAGE 36;
  24.     private int $cookieTime;
  25.     public function __construct(
  26.         ParameterBagInterface $parameterBag
  27.     ) {
  28.         $this->cookieTime = (int)$parameterBag->get('search.form_cookie_time') ?: 1200;
  29.     }
  30.     #[ParamConverter("city"converter"city_converter")]
  31.     public function page(Request $requestCity $cityProfileList $profileList): Response
  32.     {
  33.         $isAjax $request->isXmlHttpRequest();
  34.         $formFields null;
  35.         if($isAjax) {
  36.             $content json_decode($request->getContent(), true);
  37.             parse_str($content['form'], $data);
  38.             $formFields current($data);
  39.         } else {
  40.             $requestedPage $request->attributes->get('page');
  41.             //если просто рефрешнули страницу с результатами после нажатия кнопки "Показать еще"
  42.             /*if($requestedPage > 1 && ($savedForm = $request->cookies->get('search_form'))) {
  43.                 $formFields = json_decode($savedForm, true);
  44.             }*/
  45.         }
  46.         $form $this->createForm(SearchProfileForm::class, null, [
  47.             'action'          => $this->generateUrl('profile_search.page', ['city' => $city->getUriIdentity()]),
  48.             'csrf_protection' => false,
  49.             'city'            => $city,
  50.         ]);
  51.         if($formFields) {
  52.             $this->cleanAndCastFormFields($formFields$formtrue);
  53.             $form->submit($formFields);
  54.         } else {
  55.             $form->handleRequest($request);
  56.         }
  57.         if ($form->isSubmitted() && $form->isValid()) {
  58.             $additionalSpecs = [];
  59.             /** @var ProfileIsProvidingMostOfServices $servicesSpec */
  60.             if(($servicesSpec $form->getViewData()['services']) != null) {
  61.                 $additionalSpecs[] = $servicesSpec;
  62.             }
  63.             $profiles $profileList->listActiveWithinCityOrderedByStatusWithSpec($city$form->getData(), $additionalSpecs);
  64.         }
  65.         if($isAjax) {
  66.             $response $this->render('ProfileList/list.profiles.html.twig', [
  67.                 'profiles' => $profiles ?? null,
  68.             ]);
  69.             $content preg_replace('/\s{2,}/'' '$response->getContent());
  70.             $response->setContent($content);
  71.             return $response;
  72.         } else {
  73.             $response $this->render('ProfileSearch/list.html.twig', [
  74.                 'profiles' => $profiles ?? null,
  75.                 'form' => $form->createView(),
  76.                 'recommendationSpec' => Spec::andX(),
  77.             ]);
  78.             if($form->isSubmitted() && $request->request->get($form->getName())) {
  79.                 $formFields $request->request->get($form->getName());
  80.                 $this->cleanAndCastFormFields($formFields$formfalse);
  81.                 //$response->headers->setCookie(new Cookie('search_form', json_encode($formFields), mktime() + $this->cookieTime));
  82.             }
  83.             return $response;
  84.         }
  85.     }
  86.     protected function cleanAndCastFormFields(array &$fieldsFormInterface $formbool $cast): void
  87.     {
  88.         //если значение пустое - удаляем соотв. ключ, оставляя тольно заполненные поля
  89.         //если значение массив - проходимся внутри, пустые массивы в результате удаляем
  90.         //если в форме это поле чекбокс - конвертим в bool
  91.         foreach ($fields as $k=>$v) {
  92.             if ($v === '')
  93.                 unset($fields[$k]);
  94.             if (is_array($v) && $this->isAssociativeArray($v)) {
  95.                 $this->cleanAndCastFormFields($v$form->get($k), $cast);
  96.                 if (empty($v))
  97.                     unset($fields[$k]);
  98.             }
  99.             if($cast && $form->get($k)->getConfig()->getType()->getInnerType() instanceof CheckboxType)
  100.                 $fields[$k] = (bool)$fields[$k];
  101.         }
  102.     }
  103.     protected function isAssociativeArray(array $arr): bool
  104.     {
  105.         if (array() === $arr) return false;
  106.         return array_keys($arr) !== range(0count($arr) - 1);
  107.     }
  108. }