Я использую KnpPaginatorBundle, и я использую QueryBuilder в репозитории для выбора данных. Я хотел бы знать, как передать параметры сортировки и направления, отправленные формой в запросе.
Это форма:
<form action="" method="get" class="form_sort" id="myForm">
<span class="manage_title">Sort by:</span>
<select class="select_styled white_select" id="sort_list" name="option">
<option value="">-------</option>
{{ knp_pagination_sortable(pagination, 'Country A-Z', 'country', {'sort': 'country', 'direction': 'asc'}) }}
{{ knp_pagination_sortable(pagination, 'Country Z-A', 'country', {'sort': 'country', 'direction': 'desc'}) }}
{{ knp_pagination_sortable(pagination, 'City A-Z', 'destination', {'sort': 'destination', 'direction': 'asc'}) }}
{{ knp_pagination_sortable(pagination, 'City Z-A', 'destination', {'sort': 'destination', 'direction': 'desc'}) }}
</select>
</form>
Контроллер действия:
public function listAction($page, Request $request)
{
$em = $this->getDoctrine()->getManager();
$paginator = $this->get('knp_paginator');
$listTravels = $em->getRepository('ProjectTravelBundle:Travel')->getListTravelsFrontend();
$pagination = $paginator->paginate(
$listTravels,
$this->get('request')->query->get('page', $page)/*page number*/,
10/*limit per page*/
);
return $this->render('ProjectFrontendBundle:Frontend:list.html.twig',array(
'pagination' => $pagination
));
}
TravelReopsitory:
public function getListTravelsFrontend()
{
$qb = $this->createQueryBuilder('t')
->leftJoin('t.image', 'i')
->addSelect('i')
->leftJoin('t.agence', 'a')
->addSelect('a')
->Where('t.enabled = 1');
return $qb->getQuery()->getResult();
}
Сортировка - это дескриптор в базе данных (с помощью mysql ORDER BY
), поэтому вы не можете передать массив данных из getResult()
. Вам нужно будет передать экземпляр QueryBuilder
в качестве объекта для вызова QueryBuilder
paginate()
. KnpPaginator имеет специальный Listener и Walker, который может модифицировать ваш запрос с помощью правильного ORDER BY
на основе запроса и затем выполнить его paginate для вас.
TravelReopsitory:
public function getListTravelsFrontendQueryBuilder()
{
$qb = $this->createQueryBuilder('t')
->leftJoin('t.image', 'i')
->addSelect('i')
->leftJoin('t.agence', 'a')
->addSelect('a')
->Where('t.enabled = 1');
return $qb;
}
Контроллер действия:
public function listAction($page, Request $request)
{
$em = $this->getDoctrine()->getManager();
$paginator = $this->get('knp_paginator');
$qb = $em->getRepository('ProjectTravelBundle:Travel')->getListTravelsFrontendQueryBuilder();
$pagination = $paginator->paginate(
$qb,
$request->query->get('page', $page)/*page number*/,
10/*limit per page*/
);
return $this->render('ProjectFrontendBundle:Frontend:list.html.twig',array(
'pagination' => $pagination
));
}
/travels?sort=country&direction=asc
Sort /travels?sort=country&direction=asc
не так, как это /travels?sort=t.country&direction=asc
?