Symfony2, Как передать параметры сортировки и направления с помощью KnpPaginatorBundle и QueryBuilder

Я использую 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 )); }