我使用 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()