Пакет Symfony2 KnpPaginator, не могу выполнить сортировку с 2 разбитыми на страницы таблицами, на мой взгляд
У меня есть 1 контроллер, который передает 2 разбитых на страницы набора результатов в веточку (как 2 массива, представляющих таблицы), используя KnpPaginator Bundle.
Хотя обе таблицы отображаются и разбиты на страницы, я не могу их отсортировать.Изменить: Когда я изменяю страницу таблицы 1, страница таблицы 2 также меняется на номер этой страницы.
Попытка сортировки любого из них возвращает: нет компонента с псевдонимом [t] в данном запросе или нет компонента с псевдонимом [r] в данном запросе.
Контроллер:
$em = $this->getDoctrine()->getEntityManager();
$pageSize = $this->container->getParameter('page_size');
$paginator = $this->get('knp_paginator');
/* Queries */
$queryTest = $em
->createQuery('
SELECT t FROM PanasonicTestEtAvisBundle:Test t
JOIN t.product p
WHERE p.id = :id
AND t.isDeleted = :isdeleted
ORDER BY t.creationDate DESC'
)->setParameter('id', $id)
->setParameter('isdeleted', '0');
$queryReview = $em
->createQuery('
SELECT r FROM PanasonicTestEtAvisBundle:Review r
JOIN r.product p
WHERE p.id = :id
AND r.isDeleted = :isdeleted
ORDER BY r.creationDate DESC'
)->setParameter('id', $id)
->setParameter('isdeleted', '0');
/* paginated results */
$paginationTest = $paginator->paginate($queryTest, $this->get('request')->query->get('page', 1), $pageSize);
// compact('paginationTest');
$paginationReview = $paginator->paginate($queryReview, $this->get('request')->query->get('page', 1), $pageSize);
// compact('paginationReview');
// compact('pagination');
return $this->render('PanasonicTestEtAvisBundle:Product:show.html.twig', array(
'paginationTest' => $paginationTest,
'paginationReview' => $paginationReview
));
Ошибка появляется только когда я прохожу обе страницы (paginationTest & paginationReview), если я передаю только одну, она работает безупречно.
Кто-нибудь может сказать мне, как я могу решить эту проблему?
2 ответа
Ваш пример не сработал, потому что вы используете одну и ту же переменную страницы "page" для обоих наборов нумерации страниц.
Если вы хотите использовать два или более наборов нумерации страниц в одном месте, вы должны сделать это:
Ваш контроллер:
...
$pagename1 = 'page1'; // Set custom page variable name
$page1 = this->get('request')->query->get($pagename1, 1); // Get custom page variable
$paginationReview = $paginator->paginate(
$queryReview,
$page1,
$pageSize,
array('pageParameterName' => $pagename1)
);
$pagename2 = 'page2'; // Set another custom page variable name
$page2 = this->get('request')->query->get($pagename2, 1); // Get another custom page variable
$paginationReview = $paginator->paginate(
$queryReview,
$page2,
$pageSize,
array('pageParameterName' => $pagename2)
);
return $this->render('PanasonicTestEtAvisBundle:Product:show.html.twig', array(
'paginationTest' => $paginationTest,
'paginationReview' => $paginationReview
));
Ваш взгляд:
// PanasonicTestEtAvisBundle:Product:show.html.twig
{# First set #}
{% for test in paginationTest %}
<tr>
<td>{{ test.id }}</td>
</tr>
{% endfor %}
{{ paginationTest.render()|raw }}
{# Second set #}
{% for review in paginationReview %}
<tr>
<td>{{ review.id }}</td>
</tr>
{% endfor %}
{{ paginationReview.render()|raw }}
Наслаждайтесь!
Это 2017 год, и я попал в аналогичную проблему. Просто для справки, я использую:
"knplabs/knp-paginator-bundle": "^2.5",
Я пытался запустить несколько функциональных тестов с помощью сканера Symfony. Некоторые из них использовали Knp Paginator с такими опциями:
[
'defaultSortFieldName' => 'voucher.id',
'defaultSortDirection' => 'DESC',
'wrap-queries' => true,
'defaultFilterFields' => ['voucherText.title']
]
в то время как другие с этими вариантами:
[
'defaultSortFieldName' => 'event.id',
'defaultSortDirection' => 'DESC',
'wrap-queries' => true,
'defaultFilterFields' => ['event.name', 'eventText.description']
]
Возникла проблема с сортировкой имени параметра, потому что оба Paginators использовали по умолчанию ключ 'sort', беря его из глобального массива $_GET - вы можете проверить это сами: Knp \ Component \ Pager \ Event \ Subscriber \ Sortable \ Doctrine \ ORM \ QuerySubscriber.
Однако загадочной частью была брошенная ошибка:
UnexpectedValueException: There is no component aliased by [event] in the given Query
Чтобы избежать этой странности / дерьма, я нашел опцию " sortFieldParameterName ", которую вы можете добавить ко всем опциям вашего Paginators:
[
'sortFieldParameterName' => 'sort_event',
'defaultSortFieldName' => 'event.id',
'defaultSortDirection' => 'DESC',
'wrap-queries' => true,
]