2010-05-28 4 views
4

J'ai créé une petite méthode de recherche et de filtrage dans le controller/index, qui affiche les conditions et les champs à paginer ($ this-> paginate ($ conditions))cakePHP paginer avec des données de poste sans sessions, sérialisation ou publication

Toutefois, cela est bon pour la première page, les pages suivantes les conditions de filer sont perdues. La pagination passArgs supporte bien les variables.

Existe-t-il un moyen non complexe de transmettre les conditions de publication aux autres pages paginées? La méthode que j'ai regardée est de passer les $ conditions en session, ce qui n'est pas sans complexité d'assigner la session et de déconnecter la session en soumettant à nouveau le formulaire (plus de raffinements aux critères de filtrage par l'utilisateur) passer les conditions $ comme chaîne sérialisée url_encode en tant que paramètre get.

Y a-t-il une bonne façon de faire le gâteau, comme les passArgs, les sessions et les encodages d'URL ne ressemblent pas à un style de gâteau.

Merci

Répondre

3

est-il un moyen un complexe pour passer les conditions de poste aux autres pages? paginés

Nope.

est-il un moyen bon gâteau pour ce faire plus comme passArgs, sessions et url encode ne ressemble pas à un style de gâteau.

Il n'y a qu'une seule façon, peu importe, gâteau ou pas gâteau.

  1. La recherche doit être effectuée à l'aide de la méthode GET.

  2. Paramètres transmis via QUERY STRING.

Alors, faites votre formulaire de recherche avec method = « GET » et utilisez http_build_query() pour assembler une chaîne de requête et l'utiliser pour créer des liens vers d'autres pages.

être un peu curieux, vous pouvez voir un exemple ici sur le SO:

http://stackoverflow.com/questions/tagged?tagnames=php&page=5&sort=newest&pagesize=50 
+0

Merci beaucoup, cela semble la bonne façon – openprojdevel

1

Si elle était moi je courrais avec votre idée de sauver les choses dans la session. Ensuite, je voudrais ajouter une dimension de page à la session, pour stocker chaque page, permettant ainsi aux utilisateurs d'aller et venir avec facilité.

$this->Session->write('Search.page.1.params',$params); 
$this->Session->write('Search.page.2.params',$params2); 

Afin de le faire d'une manière gâteau, vous voudrez probablement écrire votre propre aide Pagination ou plug-in. Que vous pouvez ensuite utiliser plus effectivly dans vos contrôleurs comme

$this->MyPages->paginate('MyModel'); 

Je suppose que, cette fonctionnalité serait également vous donner la possibilité de permettre aux utilisateurs « Enregistrer ma recherche » s'ils voulaient, comme vous pouvez vider la session params dans un modèle SavedSearch ou similaire.N'oubliez pas de $this->Session->destroy() avant de commencer une nouvelle recherche!

+0

Juste pour plus d'informations qui pourraient être utiles pour d'autres, à la suite est un extrait de code googlé pour la pagination basée sur la session if (! vide ($ this-> données)) { \t \t \t Sanitize :: clean ($ this-> data); \t \t \t $ searchkey = $ this-> Session-> read ('Search.searchkey'); \t \t \t si (vide (searchkey de $)) { \t \t \t \t $ this-> Session-> write ('Search.searchkey', $ this-> data [ 'Recherche'] [ 'searchkey']); \t \t \t} \t \t \t if ($ this-> data [ 'Recherche'] [ 'searchkey']! = $ This-> Session-> read ('Recherche.clé de recherche ')) { \t \t \t \t $ this-> Session-> delete (' Search.searchkey '); $ This-> Session-> write ('Search.searchkey', $ this-> data ['Recherche'] ['searchkey']); \t \t \t} \t \t} – openprojdevel

1

Vous pouvez également utiliser le modèle Post/Redirect/Get design pattern pour résoudre ce problème, en permettant aux utilisateurs de mettre en signet les URL des recherches (sans les expirer comme une session) et en conservant des URL conviviales. Par exemple:

function index($searchTerms = null) { 
    // post/redirect/get 
    if (isset($this->data['SearchForm'])) { 
     $this->redirect(array($this->data['SearchForm']['search_terms'])); 
    } 
    // your normal code here. 
} 

Les données de formulaire de recherche à /controller/action mais POSTs l'utilisateur est redirigé et GETs au lieu /controller/action/search+terms où les termes sont passés dans l'action en tant que paramètre (c.-à-$searchTerms.).

Si vous changez simplement la méthode de soumission de formulaire GET vous à la place voir quelque chose comme: /controller/action?data[SearchForm][search_terms]=search+terms

1

Merci Deizel pour le POST/redirect/modèle GET.

J'ai implémenté la méthode GET de publication de données. Pagination utilisé cette
$urlparams = $this->params['url'];unset($urlparams['url']); $paginator->options(array('url' => array('?' => http_build_query($urlparams))));

Nous avons eu plusieurs cases à cocher et la convention de dénomination utilisée lorsque:
foreach ($checkboxes as $chbox) {

// used variable variables to generate the data grid table based on selected fields 
${'_field'.$chbox} = (isset($this->params['url']['displayfields'][$chbox])?$this->params['url']['displayfields'][$chbox]:1); 

$options = array('label'=>$chbox,'type'=>'checkbox','value'=> ${'_field'.$chbox}); 
if (${'_field'.$chbox}) $options['checked'] = 'checked'; 

echo $form->input('Filter.displayfields['.$chbox.']',$options); 



Dans la méthode post la convention de nommage pour les checkboxs serait nom Filter.displayfields.checkbox

Cela aide à obtenir un tableau soit dans $ this-> données ou $ this-> params [ 'url']

Il devrait y avoir un plugin pagination persistant/composant pour cakePHP qui rendrait la vie beaucoup plus facile et amusante à développer avec cakePHP.


Merci à tous.

3

Vous pouvez utiliser passedArgs.

dans le contrôleur de la méthode:

if (empty($this->passedArgs['search'])){ 
    $this->passedArgs['search'] = $this->data['YourModel']['search']; 
} 
if (empty($this->data)){ 
    $this->data['YourModel']['search'] = $this->passedArgs['search']; 
} 

à votre avis:

$this->Paginator->options(array('url' => $this->passedArgs)); 
+0

Si quelqu'un est, disons page 2, puis ils cherchent à nouveau j'ai ajouté une ligne supplémentaire pour gérer ce dans le contrôleur de la méthode: si (vide ($ this-> passedArgs [ « page » ])) { \t \t \t \t $ this-> redirect (array ('search' => $ this-> passedArgs ['search'], 'page' => 1)); \t \t \t} – paulmorriss

Questions connexes