Symfony2 KnpPaginator 包,在我看来无法使用 2 个分页表进行排序

Posted

技术标签:

【中文标题】Symfony2 KnpPaginator 包,在我看来无法使用 2 个分页表进行排序【英文标题】:Symfony2 KnpPaginator bundle, cannot do sorting with 2 paginated tables in my view 【发布时间】:2012-05-07 10:43:46 【问题描述】:

我有 1 个控制器,它使用 KnpPaginator Bundle 将 2 个分页结果集传递给一个树枝(作为代表表格的 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)时才会出现错误,如果我只通过一个,它会完美运行。

谁能告诉我如何解决这个问题?

【问题讨论】:

【参考方案1】:

您的示例不起作用,因为您对两个分页集使用了相同的页面变量“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 

享受吧!

【讨论】:

谢谢,这解决了问题。在搜索了 knp 组件文件 (Paginatior.php) 之后,我发现我必须设置 'sortFieldParameterName' => "sort1", "sortDirectionParameterName" => "direction1" 才能进行排序。现在效果很好:) 我刚刚检查了您针对该问题的解决方案,但即使我按照您的解释做了所有事情,我仍然收到与@Rishi 描述的相同的错误消息。有什么想法吗? 你好,索尼娅。我已经有一段时间没有使用这个捆绑包了,但是从下面 TekMi 的回答中猜测,我猜你可能还需要设置 'sortFieldParameterName' 和/或 'sortDirectionParameterName' 参数,除了 Andrey 提到的不同的 'pageParameterName' 之外。 【参考方案2】:

现在是 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']
]

排序参数名称出现问题,因为两个分页器都使用默认的“排序”键,从全局 $_GET 数组中获取 - 您可以自己检查:Knp\Component\Pager\Event\Subscriber\Sortable\教义\ORM\QuerySubscriber

然而,神秘的部分是抛出的错误:

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

为了避免这种怪异/废话,我找到了一个“sortFieldParameterName”选项,您可以将其添加到所有分页器的选项中:

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

【讨论】:

看起来这与我在评论中讨论的参数相同:“在搜索 knp 组件文件 (Paginatior.php) 后,我发现我必须设置 'sortFieldParameterName' => "sort1" , "sortDirectionParameterName" => "direction1" 也让排序工作。"我猜在 2017 年他们仍然没有准确的文档。

以上是关于Symfony2 KnpPaginator 包,在我看来无法使用 2 个分页表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2:KnpPaginator 仅显示带有 POST 表单的第一页

Symfony2 - KnpPaginator - AJAX/嵌入式控制器

Symfony2 KnpPaginator bundle 从多个实体获取数据并在一个网格/分页中呈现

Symfony2 KNP 分页“无法计数查询”

Symfony2 KNP PAGINATOR for php 模板

配置 KnpPaginator 以使用 Twitter Bootstrap