【问题标题】:What is correct way to use Pagerfanta for pagination in Symfony2在 Symfony2 中使用 Pagerfanta 进行分页的正确方法是什么
【发布时间】:2012-09-10 13:39:53
【问题描述】:

我读到 Pagerfanta 是 Symfony2 的首选分页插件,但我在让它正常工作时遇到了一些麻烦。我已经下载了 pagerfanta 和 PagerfantaBundle 的代码,并按照WhiteOctober Github readme filethis tutorial 中的描述安装了它们。我很确定我的控制器中的代码没问题,但是我的模板文件有问题。

我的控制器代码:

public function indexAction($page =  null)
{
    ...
    $query = $em->createQuery('SELECT something FROM some_table');
    $adapter = new DoctrineORMAdapter($query);
    $pager =  new Pagerfanta($adapter);
    $pager->setMaxPerPage(10);
    if (!$page)    $page = 1;
    try  {
        $pager->setCurrentPage($page);
    }
    catch(NotValidCurrentPageException $e) {
      throw new NotFoundHttpException('Illegal page');
    }
    return $this->render('MyBundle:MyEntity:index.html.twig', array(
        'pager' => $pager,
    ));
}

在我的模板中:

...
<table>
  {% for object in pager.currentPageResults %}
    <tr>
      <td>{{ object.attribute1 }}</td>
      <td>{{ object.attribute2 }}</td>
      <td>{{ object.attribute3 }}</td>
    </tr>
  {% endfor %}
</table>

{% if pager.haveToPaginate %}
  {{ pagerfanta(pager) }}
{% endif %}

当我转到该页面时,我会得到前 10 个对象的列表。但是,分页器的呈现只是将 PreviousNext 作为一个单词(不是链接,也没有第 1、2、3 页等)。

如果我将 ?page=2 添加到 URL,它不会显示列表中的下 10 个项目。

我没有更改添加分页代码之前的路线,因为文档说:

使用变量“page”为当前路由自动生成路由以传播页码。

...但我想知道不正确的路由是否是问题的一部分。假设是这种情况,我不确定如何继续。

除了我上面链接的来源之外,我找不到任何说明,所以如果成功实施此操作的人可以分享他们如何做的详细信息,那就太好了。

【问题讨论】:

  • 你的路由模式是否包含页面属性?即/articles/{page}
  • 更新:控制器似乎确实有问题。具体来说,DocrtineORMAdapter 不能正常工作(即$pagerfanta-&gt;getNbResults() 返回 0 - 因此在 Prevous 和 Next 之间没有页面)。文档指出传递给构造函数的参数可以是 Query 或 QueryBuilder,但我怀疑只有后者是正确的。当我更改为 $pagerfanta = new Pagerfanta(new ArrayAdapter($query-&gt;getResult()) 时,它会返回正确数量的结果。 @AdrienBrault - 我对路由模式进行了您建议的更改,现在它可以工作了,但不需要。
  • 所以我仍然想知道为什么 ?page= 没有根据文档自动添加到路由中以及为什么没有应用 css(现在分页器看起来像 Previous123Next,与没有空格或格式)

标签: php symfony twig pagerfanta


【解决方案1】:

我认为您的应用程序不知道如何将 ?page=2 解析为控制器操作。

在您的路线中包含一个{page}(正如@AdrienBrault 回复的那样),您希望对其进行分页。

像这样:

my_index:
  pattern:  /{page}
  defaults: { _controller: MyTestBundle:Object:index, page: 1 }
  requirements:
    _method:  GET
    page: \d+

PagerFantaBundle 将(我猜)尝试猜测正确的路线。

为我工作。

【讨论】:

  • 这可行,但实际上这可以通过 OP 要求的查询参数来完成。只需将Request $request 添加到操作并从$request-&gt;get('page', 1) 获取$page
  • Request 的get 方法会遍历所有(查询、属性和请求)参数。当您知道参数的来源时,官方建议避免使用它:在这种情况下,您需要使用$request-&gt;query-&gt;get('page', 1)
【解决方案2】:

我不得不在我的路由中使用“currenPage”而不是“page”,我找到了一种方法:

{{ pagerfanta(pager, 'my_pager_view', {'pageParameter':'[currentPage]'}) }}

【讨论】:

    猜你喜欢
    • 2020-12-19
    • 2018-08-16
    • 1970-01-01
    • 2011-08-13
    • 2019-04-05
    • 2016-05-18
    • 2014-05-16
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多