Разбивка на страницы Doctrine ORM и использование с Twig

#symfony #orm #doctrine-orm #pagination #twig

#symfony #orm #doctrine-orm #разбиение на страницы #twig

Вопрос:

Я использую Symfony2 с Doctrine ORM и Twig для части просмотра.

На самом деле я пишу класс для разбиения на страницы доктрины статического вызова следующим образом :

 use DoctrineORMToolsPaginationPaginator;

class DoctrineHelp
{
    static public function paginate(Query $query, amp;$pageSize = 10, amp;$currentPage = 1){
        $pageSize = (int)$pageSize;
        $currentPage = (int)$currentPage;

        if( $pageSize < 1 ){
            $pageSize = 10;
        }

        if( $currentPage < 1 ){
            $currentPage = 1;
        }

        $paginator = new Paginator($query);

        $paginator
            ->getQuery()
            ->setFirstResult($pageSize * ($currentPage - 1))
            ->setMaxResults($pageSize)
        ;

        return $paginator;
    }
}
  

И в контроллерах (простое индексирование Sf2 в контроллере) создайте запрос, вызовите их и задайте все для части просмотра с помощью :

 $page = 1;
$pageSize = 5;
$articlesQuery = $em->getRepository('MyOwnBundle:Article')->getBlogArticles($languageId);
$ArticlesPaginator = DoctrineHelp::paginate($articlesQuery, $pageSize, $page);
return array('Articles' => $ArticlesPaginator);
  

метод getBlogArticles() :

 public function getBlogArticles($languageId){
    $qb = $this->createQueryBuilder(self::ALIAS_NAME);

    $qb->andWhere(self::ALIAS_NAME . '.language = :languageId')->setParameter('languageId', $languageId);
    $qb->andWhere(self::ALIAS_NAME . ".disabled_at IS NULL");

    $qb->addOrderBy(self::ALIAS_NAME . '.published_at', 'DESC');
    $qb->addOrderBy(self::ALIAS_NAME . '.id', 'DESC');

    return $qb->getQuery();
}
  

Теперь, когда я показываю, я получаю неожиданный результат, код для моей попытки в части Twig :

 {{ dump(Articles|length) }} {# here "int 23" for example in this case because result without limit is 23, ok I understand #}
{% for anArticle in Articles %}
{{ dump(loop.first) }} {# as expected here "true" for the first and false for other #}
{{ dump(loop.last) }} {# always "false" even for the fifth result who is suppose to be "true" #}
{{ dump(loop.length) }} {# here return always "int 23" in spite expected 5 #}
{% endfor %}
{# for display my 5 object in spite loop.last and loot.length not expected result #}
  

Я сообщаю о проблеме команде Sf2: https://github.com/symfony/symfony/issues/11316
и команда Doctrine ORM : http://www.doctrine-project.org/jira/browse/DDC-3207
но обе команды утверждают, что проблемы нет.

Теперь мой вопрос в том, как я предполагаю работать с объектом, если {{ цикл.last }} и {{ loop.length }} не дают правильного результата? (На самом деле я использую трюк с {{ loop.first }}, который выдает правильный результат, несмотря на номер текущей страницы (по крайней мере, для меня это ожидаемый результат)) Как это можно исправить, если обе команды утверждают, что проблемы нет?

Заранее благодарю вас.

Комментарии:

1. пожалуйста, добавьте в вопрос метоид getBlogArticles() репозитория.

2. Paginator Это DoctrineORMToolsPaginationPaginator ?

Ответ №1:

Наконец, решение заключается в циклическом использовании итератора, что означает :

 {% for anArticle in Articles.iterator %}
  

В этом случае весь дамп внутри добавляет ожидаемый результат 🙂