1

Doctrine 2 Paginatorを使用していますが、Twigで(おそらく)バグが発生しています。単純なPaginator初期化について考えてみましょう。

    $current = 1;
    $limit   = 5;
    $offset  = ($current - 1) * $limit;

    $qb->setFirstResult($offset)->setMaxResults($this->limit);

    // No fetch joins
    $items = new \Doctrine\ORM\Tools\Pagination\Paginator($qb->getQuery, false);

    // Total count
    var_dump($items->count()); // Prints 8

    // Number of items displayed
    var_dump(count($items)); // Prints 5

    // Items
    foreach($items as $item) :
        var_dump($items->getId()); // Prints 1, 2, 3, 4, 5
    endif;

カウントは私には問題ありません。しかし、それをTwigに割り当てた後array('items' => $items)

{% for item in items %}
    {{ loop.index }}/{{ loop.length }}
{% endfo %}

出力が間違っています。特にloop.length、コレクション全体(現在のアイテムのセットではありません)を参照しています。したがって、たとえば、次を使用することはできませんloop.last

1/8
2/8
3/8
4/8
5/8
4

3 に答える 3

2

自己回答。Doctrineのドキュメントからのこのコードは、私を迷わせました。

$paginator = new Paginator($query, $fetchJoinCollection = true);

$c = count($paginator);
foreach ($paginator as $post) {
    echo $post->getHeadline() . "\n";
}

間違い。パギネーターインスタンス自体ではなく、イテレーターをTwigに割り当てる必要があります。

return array('items' => $paginator->getIterator());

編集:申し訳ありませんが、私はそれを見つけたcount($paginator) == $paginator->count()ので、現在のアイテム数は$paginator->getIterator()->count()です。

于 2012-07-20T15:50:32.127 に答える
1

@gremoの言うことを拡張するために、単純なポケットベルの場合(誇りに思っていない場合)、コントローラーで次のようなことを行うことができます。

$em = $this->getDoctrine()->getManager();
// Select your items.
$dql = "SELECT i FROM ShopBundle:Issue i ORDER BY i.liveDate DESC";
// Limit per page.
$limit = 10;
// See what page we're on from the query string.
$page = $this->getRequest()->query->get("page", 1);
// Determine our offset.
$offset = ($page - 1) * $limit;
// Create the query
$query = $em->createQuery($dql);
$query->setFirstResult($offset)->setMaxResults($limit);
// Create a pager object.
$paginator = new Paginator($query, $fetchJoinCollection = FALSE);
...
return $this->render('ShopBundle:Issue:list.html.twig', array(
    'totalPages' => (int) ($paginator->count() / $limit), // Calc total number of pages.
    'currentPage' => $page,
    'issues' => $paginator->getIterator(),
    )
);

次に、テンプレートで(小枝に含まれるように):

<div class="pagination">
    <ul>
        <li>
            <a href="{{ path(route) }}">&laquo;</a>
        </li>
        {% if currentPage != 1 %}
        <li>
            <a href="{{ path(route, {'page': (currentPage - 1)}) }}">&lsaquo;</a>
        </li>
        {% endif %}
        {% for i in 1..totalPages %}
        <li>
            <a{% if  i == currentPage %} class="disabled"{% endif %} href="{{ path(route, {'page': i}) }}">{{ i }}</a>
        </li>
        {% endfor %}
        {% if currentPage != totalPages %}
        <li>
            <a href="{{ path(route, {'page': (currentPage + 1)}) }}">&rsaquo;</a>
        </li>
        {% endif %}

        <li>
            <a href="{{ path(route, {'page': totalPages}) }}">&raquo;</a>
        </li>
    </ul>
</div>

はどこrouteにありますか'route_to_your_controller'

于 2014-03-28T17:10:06.257 に答える
0

Doctrine2Paginatorのページは多くを提供します。私も見つかりませんでした

Doctrine \ ORM \ Tools \ Pagination \ Paginator;

追加のファイルをダウンロードしましたか?利用可能なバンドルのいくつかではなく、あなたの答えを本当に使いたいと思います。

于 2012-08-08T01:14:08.150 に答える