Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 17-06-2010 16:13:39

Hayk
Nouveau membre
Date d'inscription: 02-06-2010
Messages: 4

[Zend_Search_Lucene][Zend_Paginator][1.10] Recherche et pagination

Bonjour à tous.

Débutant en Zend Framework, je manipule depuis peu les composants Zend_Search_Lucene et Zend_Paginator.

Utiliser les deux indépendamment ne me pose pas de problèmes, mais c'est en combinant les deux que j'ai quelques soucis.

Mon objectif est d'afficher sous forme paginée des résultats de recherche, à partir de critères saisis via un formulaire.

Voici mon contrôleur d'action :

Code:

public function resultatsAction()
{
     $request = $this->getRequest();
     $form = new Application_Form_Recherche();          
     $search = null;    
         
     if ($request->isPost()) 
     {       
          if ($form->isValid($request->getPost())) 
               $search = $form->getValue('nom'); //Récupération des critères de recherche via le formulaire
     }
     else
     {
          $search = $this->_request->getParam('search'); //Récupération des critères de recherche via l'url (lorsque les pages de recherche sont parcourues)
     }
        
     $id_found = null;
     $index = Zend_Search_Lucene::open(APPLICATION_PATH.'/../data/index');
     $hits = $index->find($search); //Recherche dans l'index
        
     foreach ($hits as $hit) 
     {
          $id_found[] = $hit->user_id; //Récupération des id des users

     }
        
     if($id_found == null )
          $this->render('noresults');            
     else
     {
          $query = Doctrine_Query::create()
                         ->from('User u')
                         ->whereIn('u.id', $id_found); //utilisation des id obtenus comme critère de la requête
                
          $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Doctrine($query));
          $paginator->setItemCountPerPage(1)
                         ->setPageRange(5)
                         ->setCurrentPageNumber($this->_getParam('page'));
              
          $this->view->paginator = $paginator;
          $this->view->search = $search;
     }
     $this->view->form = $form;
}

Ma vue resultats.phtml, qui affiche la pagination et transmets les critères de recherche :

Code:

<?php echo $this->paginationControl($this->paginator, 'Sliding','recherche/pagination.phtml', array('search' => $this->search)); ?>

Et le fichier de pagination, qui transmets les critères de recherche via l'url (exemple pour le lien "suivant"):

Code:

<?php if (isset($this->next)): ?>
  <a href="<?php echo $this->url(array('page' => $this->next, 'search' => $this->search)); ?>">
    Next &gt;
  </a>
<?php else: ?>
  <span class="disabled">Next &gt;</span>
<?php endif; ?>

Comme vous pouvez le voir, une fois les données de la recherche envoyées via le formulaire,
une recherche dans l'index est effectuée avec ces critères.

Cette recherche me donne les id des users à afficher en résultat($id_found), et je
m'en sers pour construire la requête en BDD (->whereIn('u.id', $id_found)) qui est fournie à mon composant Zend_Paginator.

Jusque la pas de problème, les résultats s'affichent avec la pagination.

Seulement, lorsque je passe à une autre page de résultat via mes liens de pagination,
le processus dans l'index est à nouveau effectué (grâce aux critères de recherche transmis via l'url),
car je ne dispose plus les id des user dans $id_found.
Or, ils me sont indispensables pour pouvoir fournir au Zend_Paginator la requête en BDD avec les même critères.

Je ne trouve pas du tout optimal de de ré effectuer à chaque page de résultat la recherche dans l'index.

Quel serait un moyen "propre" de récupérer cette liste d'id sans passer par une nouvelle recherche dans l'index ?

Merci d'avance pour vos réponses !

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages