symfony filter with ajax and knpPaginatorBundle



我使用 ajax 来过滤返回的数据。
在后端,我使用Symfony和KnpPaginatorBundle。

现在,当我在没有过滤器的情况下显示数据和分页并且它可以工作时,当我单击分页中的第 2 页时。

例如,它也可以工作,但是当我使用 ajax 过滤时也可以工作,但是当我单击分页中的按钮 2 时,它会移动到没有过滤器的分页第 2 页

例如,如果我使用 name = "david" 进行过滤,返回的数据为 true 并且显示为真,但是当我单击第 2 页进行分页时,我移动到没有过滤器的第 2 页(我获取第 2 页的数据而不带过滤器(

代码 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 nnDetails:nError thrown: " + XMLHttpRequest + "n" + 'Text status: ' + textStatus;
                            $.growl.error({ message: error});
                            return false;
                        }
                    },
                    complete : function () {
                    }
                });
                return false;
            })
        };

问题是你检查查询字符串,但通过ajax发送POST请求。

您需要更改 ajax 请求的if(empty($request->request->all())){$request->request->get("babysitter_search")。或发送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()

相关内容

  • 没有找到相关文章

最新更新