нумерация страниц с фильтром knp paginator - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь отфильтровать с помощью нумерации страниц.Когда я пытаюсь сделать это, первая страница в порядке, когда я нажимаю, чтобы перейти на вторую страницу, она показывает первоначальный результат, без какого-либо фильтра.они оба размещают на одном маршруте фильтр и выводят на экран это мой контроллер:

/**
     * @Route("/", name="home")
     */
    public function home(Request $request)
        {
            $property = new Property();

            $searchForm = $this->createFormBuilder($property)
                ->add('type', EntityType::class, [
                    'class' => Type::class,
                    'choice_label' => 'name',
                    'mapped' => false,
                    'expanded' => true,
                    'multiple' => true,
                    'label' => false,
                ])
                ->add('filter', SubmitType::class, [
                    'attr' => [
                        'class' => 'btn btn-outline-dark btn-rounded waves-effect'
                    ]
                ])
                ->getForm();

            $searchForm -> handleRequest($request);

            if ($searchForm->isSubmitted() && $searchForm->isValid()){
                $type = $searchForm->get('type')->getData();

                $search = $this->getDoctrine()->getRepository(Property::class)->findByType($type);
                if (count($type) == 0) {
                    $search = $this->getDoctrine()->getRepository(Property::class)->findBy(['isSold' => 0]);
                }

            } else {
                $search = $this->getDoctrine()->getRepository(Property::class)->findBy(['isSold' => 0]);
            }

            $paginator = $this->get('knp_paginator');
            $result = $paginator->paginate(
                $search,
                $request->query->getInt('page', 1),
                $request->query->getInt('limit', 10)
            );

            }

            return $this->render('home/index.html.twig', [
                'property' => $result,
                'searchForm' => $searchForm->createView(),
                'propertyCountByType' => $propertyCountByType,

            ]);
        }

вот запрос в хранилище:

public function findByType($type){
        $query = $this->createQueryBuilder('p')
            ->andWhere('p.type IN (:type)')
            ->andWhere('p.isSold = 0')
            ->setParameter('type', $type)
            ->getQuery();
        return $query->execute();
    }

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я нашел решение самостоятельно.->setMethod('GET') сделал разницу.

$searchForm = $this->createFormBuilder($property)
            ->add('type', EntityType::class, [
                'class' => Type::class,
                'choice_label' => 'name',
                'mapped' => false,
                'expanded' => true,
                'multiple' => true,
                'label' => false,
            ])
            ->add('filter', SubmitType::class, [
                'attr' => [
                    'class' => 'btn btn-outline-dark btn-rounded waves-effect'
                ]
            ])
            ->setMethod('GET')
            ->getForm();
0 голосов
/ 28 февраля 2019

Проблема в том, что вы выполняете запрос (на самом деле странно, что paginator не жалуется на это ... должна быть ошибка типа "Ожидается запрос типа, получен ArrayCollection" или что-то в этом роде.

Пагинатор ожидает, что вы передадите объект Query, тогда он будет «расширять» этот запрос с помощью setMaxResults и setFirstResult, в зависимости от параметров из запроса.

Когда вы запускаете findByили ваш findByType, результат равен ArrayCollection, поэтому в этот момент его уже "слишком поздно" разбивать на страницы.

Возможно, я что-то здесь упустил, вы можете дважды проверить, что предоставленный вами коддействительно "работает, но не так, как ожидалось"?

...