фильтр symfony с ajax и knpPaginatorBundle - PullRequest
0 голосов
/ 13 июня 2019

Я использую ajax для фильтрации возвращаемых данных.
В бэкэнде я использую Symfony и KnpPaginatorBundle.

теперь, когда я отображаю данные и нумерацию страниц без фильтра, и это работает, и когда я нажимаю на страницу 2 в пагинации.

Например, он также работает, но когда я фильтрую с помощью ajax, тоже работает, но когда я нажимаю кнопку 2 на пагинации, он переходит на страницу 2 разбиения на страницы без фильтра

Например, если яфильтр с name = "david" возвращенные данные имеют значение true, а отображение - true, но когда я щелкаю страницу 2 для разбивки на страницы, я перехожу на страницу 2 без фильтра (я получаю данные для страницы 2 без фильтра)

code sf:

    /**
                 * @Route({
                 *     "fr": "/list",
                 *     "de": "/list",
                 *     "en": "/list"
                 * } , options = { "expose" = true } , name="front.babysitter.list", methods={"GET"})
                 *
                 * @param Request $request
                 */
                public function list(Request $request){
                    $this->urls_intl = $this->getCurrentUrl("front.babysitter.list",[]);
                    $form = $this->createForm(BabySitterFrontSearchType::class, null);

                    if(empty($request->query->all())){
                        $listBabySitters = $this->babySitterRepository->findBy(['status' => 1]);
                    } else {
                        $listBabySitters = $this->babySitterRepository->findBabySitter($request->query->get("babysitter_search"));
                    }

                    $listBabySittersPaginate  = $this->paginator->paginate(
                        $listBabySitters,
                        $request->query->get('page', 1),
                        $this->paginate
                    );

                    return $this->render('babysitter/list.html.twig',[
                        'listBabySitters' => $listBabySittersPaginate,
                        'form' => $form->createView()
                    ]);
                }

хранилище кодов:

    public function findBabySitter($searchQuery, $distance = 10): array
                {
                    $query = $this->createQueryBuilder('b')
                        ->where('b.status = 1');

                    if (isset($searchQuery['spokLanguage']) && $searchQuery['spokLanguage']){
                        $query
                            ->join('b.spokLanguages','sp')
                            ->andWhere('sp.language in ( :language_id )')
                            ->setParameter('language_id', $searchQuery['spokLanguage'])
                        ;
                    }
}

//just example for filter

код js:

    var searchBabySitters = function(){
            $("#ajax-form-search-babysitter").on('submit', function () {
                $('.loading').show();
                history.pushState(null, null, window.location.href+'?'+$('#ajax-form-search-babysitter').serialize());

                $.ajax({
                    url: Routing.generate("front.babysitter.filter"),
                    type: "POST",
                    headers: { "cache-control": "no-cache" },
                    async: false,
                    cache: false,
                    data: $(this).serialize(),
                    success: function (XMLHttpRequest){
                        $('.loading').hide();
                        $('.list').html(XMLHttpRequest);
                    },
                    error: function (XMLHttpRequest, textStatus) {
                        if (textStatus !== 'abort')
                        {
                            var error = "TECHNICAL ERROR: unable to send login informations \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus;
                            $.growl.error({ message: error});
                            return false;
                        }
                    },
                    complete : function () {
                    }
                });
                return false;
            })
        };

1 Ответ

0 голосов
/ 13 июня 2019

Проблема в том, что вы проверяете строку запроса, но отправляете запрос POST через ajax.

Вам необходимо изменить if(empty($request->request->all())){ и $request->request->get("babysitter_search") для запроса ajax.Или отправьте запрос GET

Правильный способ будет получать данные из данных формы, а не из запроса:

$form = $this->createForm(BabySitterFrontSearchType::class, null, [
    'method' => 'POST', // or GET
]);
$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
    $data = $form->getData();
    $listBabySitters = $this->babySitterRepository->findBabySitter($data["babysitter_search"]);
} else {
    $listBabySitters = $this->babySitterRepository->findBy(['status' => 1]);
}

Также в вашем javascript необходимо использовать data: $(this).serializeArray()

...