2016-10-18 2 views
3

Ich habe Sonata NewsBundle erweitert, um eine Region für Nachrichten hinzuzufügen. Dies soll UK-Besuchern britische Nachrichten, US-Besucher US-Nachrichten und so weiter zeigen.Symfony2 DatagridBundle/SonataNewsBundle Pager nbResults nicht korrekt berechnet

Obwohl die Abfrage im Pager-Objekt korrekt ist, zählt die nbResults-Zählung und Seite Nachrichten über alle Regionen hinweg - nicht nur die Region in der Abfrage. Dies führt dazu, dass die Anzahl der Seiten falsch ist.

pager.getResults() ruft die richtigen Posts ab. Hier ist der Zweig-Dump des Pager-Objekts als Referenz. Dies ist die britische Nachrichten, die nur zwei Beiträge auf dem Archiv zeigt hat aber eine Anzahl von 26 auf 3 Seiten:

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 [▶] 
} 

Dies ist der Zweig Markup (leicht gekürzte)

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

Wie kann ich die Pager, um die korrekten Seiteninformationen anzuzeigen?

Antwort

0

Die Lösung erwies sich als One-Liner. Wenn der Pager zum Hinzufügen der Kriterien erweitert wurde, musste er erneut initialisiert werden:

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