2016-10-18 9 views
3

뉴스 영역을 포함하도록 Sonata NewsBundle을 확장했습니다. 이것은 UK 방문자 영국 뉴스, 미국 방문자 미국 뉴스 등등을 보여주는 것입니다.Symfony2 DatagridBundle/SonataNewsBundle 호출기 nbResults가 올바르게 계산되지 않았습니다.

올바른 Pager 개체에서 쿼리를 사용하더라도 nbResults 개수 및 페이지는 쿼리의 영역뿐 아니라 모든 영역에서 뉴스를 집계합니다. 이로 인해 페이지 수가 잘못되었습니다.

pager.getResults()가 올바른 게시물을 가져 오는 중입니다. 다음은 참조를 위해 Pager 객체의 나뭇 가지 덤프입니다.

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> 

가 어떻게이를 얻을 수 있습니다 :이 아카이브에서만이 게시물을 표시하지만 26 세에서 페이지의 수를 가지고있는 영국 뉴스 호출기가 올바른 페이지 정보를 표시합니까?

답변

0

용액은 1 회선으로 판명되었다. 호출기를 확장하여 조건을 추가하는 경우 다시 초기화해야합니다.

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