2012-05-07 1 views
1

У меня есть 1 контроллер, который передает 2 paginated набор результатов на веточку (в виде 2 массивов, представляющих таблицы), используя пакет KnpPaginator Bundle.Symfony2 KnpPaginator bundle, не может сортировать по 2 таблицам с разбивкой по страницам в моем представлении

Пока обе таблицы отображаются и разбиты на страницы, я не могу их отсортировать. Редактировать: Когда я меняю страницу таблицы 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

Ваш пример не работает, потому что вы используете одну и ту же переменную страницы «страница» для обоих наборов страниц.

Если вы хотите использовать два или более наборов нумерации страниц в одном месте, вы должны сделать это:

Ваш контроллер:

... 

$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 }} 

Наслаждайтесь!

+2

Спасибо, это решает проблему. После поиска файлов knp-компонентов (Paginatior.php) Я обнаружил, что для сортировки я должен установить 'sortFieldParameterName' => "sort1", "sortDirectionParameterName" => "direction1". Хорошо работает сейчас :) – Rishi

+0

Я просто использую ваше решение для этой проблемы, но хотя я и сделал все, как вы объяснили, я все равно получаю те же сообщения об ошибках, что и @Rishi. Любые идеи? – sonja

+0

Привет, Соня. Я не использовал этот пакет некоторое время, но, угадывая ответ TekMi ниже, я думаю, возможно, вам также нужно установить параметры «sortFieldParameterName» и/или «sortDirectionParameterName», а также другое «pageParameterName», как упоминалось Андреем. – Rishi

0

Это 2017 год, и у меня возникла аналогичная проблема. Просто для справки, я использую:

"knplabs/knp-paginator-bundle": "^2.5", 

Я пытался запустить несколько функциональных тестов с гусеничным Symfony в. Некоторые из них используют КНП 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 использовали ключ defaul «сортировку», принимая он из глобального массива $ _GET - вы можете проверить его сами: Knp \ Component \ Pager \ Event \ Subscriber \ Sortable \ Doctrine \ ORM \ QuerySubscriber.

Однако загадочная часть была ошибка броска:

UnexpectedValueException: There is no component aliased by [event] in the given Query 

Для того, чтобы избежать этого чудаков/crappiness, я нашел ВАРИАНТ А «sortFieldParameterName», который вы можете добавить все ваши Paginators' варианты:

[ 
    'sortFieldParameterName' => 'sort_event', 
    'defaultSortFieldName' => 'event.id', 
    'defaultSortDirection' => 'DESC', 
    'wrap-queries' => true, 
] 
+0

Похоже, что это тот самый параметр, о котором я говорил в своем комментарии: «После поиска в файлах knp-component (Paginatior.php) я обнаружил, что мне нужно установить« sortFieldParameterName »=>« sort1 »,« sortDirectionParameterName »=>" direction1 "также для сортировки для работы." Думаю, в 2017 году у них все еще нет точной документации. – Rishi

Смежные вопросы