2010-10-30 10 views
0

J'ai essayé d'implémenter des données de filtrage (base de liste sur la catégorie sélectionnée) en utilisant une liste déroulante avec pagination observfield et ajax. J'utilise la session pour mémoriser la catégorie sélectionnée afin de garder la pagination.Filtrage des données à l'aide du champ d'observation ajax

Voici mon code (CakePHP 1.2)

Vu:

echo $form->select('Category.id', $categories, null, array('id' => 'categories'),'Filter by Categories') 
echo $ajax->observeField('categories' ,array('url' =>'update_category','update' => 'collectionDiv')); 

Contrôleur:

if(!empty($this->data['Category']['id'])) 
{ 
    $cat_id=$this->data['Category']['id']; 
    $filters=array('Collection.category_id' => $cat_id); 
    $this->set('collections', $this->paginate('Collection', $filters)); 
    $this->Session->write($this->name.'.$cat_id', $category_id); 
} 
else 
{ 
    $cat_id=$this->Session->read($this->name.'.cat_id'); 
    $filters=array('Collection.category_id' => $cat_id); 
    $this->set('collections', $this->paginate('Collection')); 
} 

Le travail de filtre comme je le voulais, mais le problème est lorsque je sélectionne vide value ('Filtrer par catégorie') il se souvient toujours de la dernière session de la catégorie, donc je ne peux pas revenir à la liste par défaut (Toutes les listes d'enregistrements sans filtre).

J'ai essayé de faire certaines conditions mais toujours pas de succès. Y a-t-il un autre moyen? S'il vous plaît, j'apprécie votre aide. merci

Hermawan

Répondre

0

Peut-être que je ne comprends pas la question, mais il me semble que cela pourrait être la peine de changer:

else 
{ 
    $cat_id=$this->Session->read($this->name.'.cat_id'); 
    $filters=array('Collection.category_id' => $cat_id); 
    $this->set('collections', $this->paginate('Collection')); 
} 

à:

else 
{ 
    $this->set('collections', $this->paginate('Collection',array())); 
} 

En effet votre le code semble le faire de toute façon. Vérifiez ce que l'URL est en haut de la fenêtre du navigateur après son retour. Est-ce qu'il contient toujours des directives de pagination de la requête précédente?

Vous voudrez peut-être passer en revue http://book.cakephp.org/view/167/AJAX-Pagination et assurez-vous que vous avez «coché toutes les cases».

+0

merci pour la réponse. J'ai essayé votre conseil mais ne fonctionne toujours pas. Disons que je prends la «catégorie de peinture», puis le DIV changer le contenu que je veux, mais si vous cliquez sur le numéro de page le DIV va contenter des données entières non seulement «Catégorie de peinture». – hermawan

+0

Il me semble que la pagination ajax n'est pas configurée correctement, bien que je commence à penser que cela pourrait être une limitation de la pagination. Je me souviens d'avoir eu un problème similaire lorsque j'ai modifié la requête d'origine comme ceci - cela ne se poursuit pas sur les pages suivantes. Je l'ai résolu en écrivant une méthode de pagination personnalisée sur le modèle approprié. La pagination est bonne pour prendre une requête, paginer et trier les résultats. Au-delà, il a besoin d'aide. – Leo

+0

Remerciez Leo, La pagination est réglée correctement. Le problème est, nous devrions différer où la demande de est? Quand ajax observefield il va vérifier la catégorie "id", mais si la pagination Ajax il devrait se souvenir de la catégorie. J'observe quand ajax vient de la pagination, $ this-> passedArgs retournera le numéro de la page, mais vide quand il est déclenché par Ajax. J'explique ma solution. Merci pour le partage – hermawan

0

Je l'ai eu, ça marche comme j'espère maintenant. Je m'explique moi-même la condition et la solution. Lorsque je sélectionne la catégorie de ComboBox, il rend la page le code est:

If ($this->data['Category']['id']) { 
    $cat_id=$this->data['Category']['id']; 
    $this->Session->write($this->name.'.category_id', $category_id); 
    // I will use this session next when I click page number 
    $filters=array('Collection.art_type_id' => $category_id); 
    $this->set('collections', $this->paginate('Collection', $filters)); 

}else{ 
//if clik page number, next or whatever, $this->data['Category']['id'] will empty so 
// use session to remember the category so the page will display next page or prev 
// page with the proper category, But the problem is, when I set category fillter to 
// "All Category" it will dislpay last category taked from the session. To prevent it 
// I used $this->passedArgs['page']. When I clik the page paginator it will return 
// current number page, but it will be empty if we click dropdown. 

    if (!empty($this->passedArgs['page']) { 
     $cat_id=$this->Session->read($this->name.'.category_id'); 
     $filters=array('Collection.category_id' => $cat_id); 
     $this->set('collections', $this->paginate('Collection',$filters)); 
    }else{ 
     $this->set('collections', $this->paginate('Collection')); 
    } 
} 

De ce cas, je pense que observeField n'envoyer passedArg que nous recevons de url tels de lien ajax ou html-> lien . J'espère que cela sera utile à tout le monde