Php Symfony2 DatagridBundle/SonataNewsBundle寻呼机nbResults计算不正确

Php Symfony2 DatagridBundle/SonataNewsBundle寻呼机nbResults计算不正确,php,symfony,pager,sonata,Php,Symfony,Pager,Sonata,我已经扩展了索纳塔新闻包,包括一个新闻区域。这是向英国游客展示英国新闻、美国游客展示美国新闻等 尽管在寻呼机对象中使用的查询是正确的,但nbResults计数和页面计数的是所有区域的新闻,而不仅仅是查询中的区域。这会导致页数不正确 pager.getResults正在获取正确的帖子。下面是寻呼机对象的细枝转储,以供参考。这是英国新闻,在档案中只显示了2篇文章,但在3页中有26篇: Pager {#1493 ▼ #queryBuilder: null #page: 1 #m

我已经扩展了索纳塔新闻包,包括一个新闻区域。这是向英国游客展示英国新闻、美国游客展示美国新闻等

尽管在寻呼机对象中使用的查询是正确的,但nbResults计数和页面计数的是所有区域的新闻,而不仅仅是查询中的区域。这会导致页数不正确

pager.getResults正在获取正确的帖子。下面是寻呼机对象的细枝转储,以供参考。这是英国新闻,在档案中只显示了2篇文章,但在3页中有26篇:

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>

如何让寻呼机显示正确的页面信息?

解决方案原来是一行。如果要扩展寻呼机以添加条件,则需要重新初始化:

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;
}