2013-07-25 16 views
6

Sto utilizzando Zend \ Paginator per creare un set di risultati impaginato. Funziona bene, tuttavia, dopo aver aggiunto un modulo di ricerca, non riesco a far giocare piacevolmente i due insieme.Come conservare i parametri di query negli URL di impaginazione in ZF2?

L'URL prodotto dal modulo di ricerca sulla pagina è:

user/index/?searchTerm=hello 

Come faccio a modificare la configurazione Paginator Zend modo che mantenga il termine di ricerca negli URL prodotte?

speravo in qualcosa di simile a:

user/index/page/4/?searchTerm=hello 

Che cosa mi manca?


Il percorso del modulo di configurazione è definito come segue:

'user' => array(
    'type' => 'Zend\Mvc\Router\Http\Segment', 
    'options' => array(
     'route' => '/user[/[:action[/]]][[id/:id]][/[page/:page]]', 
     'defaults' => array(
      'controller' => 'Application\Controller\User', 
      'action'  => 'index', 
      'id'   => null, 
     ), 

     // the below was added to try and get the searchTerm query to be retained 
     'may_terminate' => true, 
     'child_routes' => array(
      'searchTerm' => array(
       'type' => 'Query', 
      ), 
     ), 
    ), 
), 

L'impaginazione è costruito utilizzando questo nella visualizzazione:

echo $this->paginationControl(
     $this->users, 'sliding', array('paginator', 'User'), array('route' => 'user', 'action' => 'index') 
    ); 

Impaginazione modello frammento:

<li> 
     <a href="<?php echo $this->url($this->route, array('action' => $this->action, 'page' => $this->next), true); ?>"> 
      Next &raquo; 
     </a> 
    </li> 

(Ero sotto il impressione che passa true come third parameter to url() would retain the query params.)

risposta

2

Ora vedo cosa sta facendo il terzo parametro su url(). Posso semplificare le link di paginazione e togliere la chiave 'azione' come segue:

<a href="<?php echo $this->url($this->route, array('page' => $this->next), true); ?>"> 

azione della pagina è stato abbinato come parte dell'URL (a causa di quel terzo param essere vera) ed è per questo che funziona. Per lo stesso motivo posso cambiare il percorso migliore per raggiungere:

'route' => '/user[/[:action[/]]][[id/:id]][/[page/:page]][/[search/:search]]', 

E poi il search sarà trattenuto nei link di paginazione.

Se si modifica il modulo di ricerca per inviare tramite JavaScript, posso costruire l'URL di ricerca e indirizzare l'utente ad esso.

semplice esempio jQuery per questo approccio:

$(".search-form").submit(function() { 
    var baseUrl = $(this).attr('action'), 
     search = $(this).find('.search').val(); 

    window.location = baseUrl + '/search/' + search; 

    return false; 
}); 

Un'altra opzione sarebbe quella di reindirizzare il percorso current/route/search/term nel controller se riceve una query searchTerm.

Sto postando questo come risposta, ma sono aperto a soluzioni migliori.

Problemi correlati