我使用ajax过滤返回的数据。
在后端,我使用Symfony和KnpPaginatorBundle。
现在,当我在不使用过滤器的情况下显示数据和分页时,它会起作用,并且当我在分页中单击第2页时。
例如,它也可以工作,但是当我使用ajax进行过滤时也可以工作,但是当我在分页中单击按钮2时,它将移至不使用过滤器的分页的第2页
例如,如果我使用name =“ david”进行过滤,则返回的数据为true并且显示为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 \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus;
$.growl.error({ message: error});
return false;
}
},
complete : function () {
}
});
return false;
})
};
答案 0 :(得分:0)
问题是您检查查询字符串,但通过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()