Пакет 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,
]
Другие вопросы по тегам