Symfony2 datagridbundle/SonataNewsBundle Результаты пейджера не рассчитаны правильно


Я расширил список новостей Sonata, чтобы включить регион для новостей. Это делается для того, чтобы показывать посетителям Великобритании новости Великобритании, посетителям США новости США и так далее.

Несмотря на то, что запрос, используемый в объекте пейджера, является правильным, счетчик nbResults и страница подсчитывают новости во всех регионах, а не только в регионе в запросе. Это приводит к неправильному количеству страниц.

Пейджер.GetResults() выбирает правильные сообщения. Вот дамп ветки объекта пейджера для справки. Этот это новости Великобритании, которые показывают только 2 сообщения в архиве, но имеют количество 26 на 3 страницах:

Pager {#1493 ▼
    #queryBuilder: null
    #page: 1
    #maxPerPage: 10
    #lastPage: 3.0
    #nbResults: "26"
    #cursor: 1
    #parameters: []
    #currentMaxLink: 1
    #maxRecordLimit: false
    #maxPageLinks: 0
    #results: null
    #resultsCounter: 0
    #query: ProxyQuery {#1504 ▼
        #queryBuilder: QueryBuilder {#1492 ▼
            -_em: EntityManager {#537 …11}
            -_dqlParts: array:9 [▶]
            -_type: 0
            -_state: 1
            -_dql: "SELECT p, t FROM Acme\NewsBundle\Entity\Post p LEFT JOIN p.tags t WITH t.enabled = true LEFT JOIN p.author a WITH a.enabled = true LEFT JOIN p.regions r WHERE p.enabled = :enabled AND p.publicationDateStart <= :startDate AND p.collection = :collectionid AND r.id = :region AND p.id IN ('2','1') ORDER BY p.publicationDateStart DESC"
            -parameters: ArrayCollection {#1500 ▶}
            -_firstResult: null
            -_maxResults: null
            -joinRootAliases: array:3 [▶]
            #cacheable: false
            #cacheRegion: null
            #cacheMode: null
            #lifetime: 0
        }
        #sortBy: null
        #sortOrder: null
        #firstResult: 0
        #maxResults: 10
        #results: null
    }
    #countColumn: array:1 [▶]
}

Это разметка веточки (слегка сокращенная)

<div class="container news-list">
    {% set posts = pager.getResults() %}
    {% for post in posts %}
        <div class="news-item">
            // Mark up for post item
        </div>
    {% else %}
        {{ 'no_post_found'|trans({}, 'SonataNewsBundle') }}
    {% endfor %}

    <ul class="pager">
        <li class="previous">
            <a class="btn {% if pager.page == pager.firstPage %} disabled{% endif %}"
               {% if pager.page != pager.firstPage %}
                   href="{{ url(route, route_parameters|merge({'page': pager.previouspage})) }}"
               {% endif %}
               title="{{ 'link_previous_page'|trans({}, 'SonataNewsBundle') }}">
                {{ 'link_previous_page'|trans({}, 'SonataNewsBundle') }}
            </a>
        </li>
        <li class="next">
            <a class="btn {% if pager.page == pager.lastPage %} disabled{% endif %}"
               {% if pager.page != pager.lastPage %}
                   href="{{ url(route, route_parameters|merge({'page': pager.nextpage})) }}"
               {% endif %}
               title="{{ 'link_next_page'|trans({}, 'SonataNewsBundle') }}">
                {{ 'link_next_page'|trans({}, 'SonataNewsBundle') }}
            </a>
        </li>
    </ul>
</div>

Как я могу заставить пейджер отображать правильную информацию о странице?

Author: OK sure, 2016-10-18

1 answers

Решение оказалось односторонним. В тех случаях, когда пейджер расширялся для добавления критериев, его необходимо было повторно инициализировать:

public function getPager(array $criteria, $page, $limit = 10, array $sort = array())
{
    $criteria['date'] = [
        'query' => 'p.publicationDateStart <= :startDate',
        'params' => [
            'startDate' => new \DateTime(),
        ]
    ];

    $pager = parent::getPager($criteria, $page, $limit, $sort);
    /** @var QueryBuilder $query */
    $query = $pager->getQuery()->getQueryBuilder();
    $parameters = $query->getParameters();

    if (isset($criteria['title'])) {
        $query->andWhere('p.title = :title');
        $parameter = new Parameter('title', $criteria['title']);
        $parameters->add($parameter);
    }

    if (isset($criteria['region'])) {
        $query->leftJoin('p.regions', 'r');
        $query->andWhere('r.id = :region');
        $parameter = new Parameter('region', $criteria['region']);
        $parameters->add($parameter);
    }

    /** THIS NEEDED TO HAPPEN IN ORDER TO RE-INITIALISE **/
    $pager->init();

    return $pager;
}
 0
Author: OK sure, 2016-10-20 09:07:37