Comment reprendre le paginator actuel, lui ajouter une condi

Salut tout le monde,

J’ai une question concernant la pagination.

Dans mon appli, j’ai des Galleries. J’ai plusieurs contrôleurs du genre
“latest”, “best”, “favorites”, etc. Dans chaque contrôleur, je crée une
pagination, chaque fois avec des conditions différentes, en fonction de
ce que je sélectionne (les dernières galeries, les galeries les mieux
notées, etc.).

Sur le site, j’ai un formulaire pour filtrer le contenu. Dans ce
formulaire, il y a:

1 choix en 3 boutons radios: "afficher tout" | "uniquement les
voitures" | "uniquement les avions"
1 case à cocher: "uniquement avec vidéos"

Quand le visiteur clique sur le bouton “Filtrer”, je voudrais que la
liste actuellement affichée se recharge avec Ajax. Dans l’ensemble, pas
de souci, Ã part que je dois refaire un @gallerie_pages avec les bonnes
conditions. Alors j’ai commencé à fouiller et j’obtiens diverses valeurs
qui m’aideront à recréer le bon paginator:

<%=
  @gallerie_pages.current.number # le numéro de la page actuelle
  @gallerie_pages.current.paginator.items_per_page # le nombre
d'éléments sur la page actuelle
  request.query_parameters # les paramètres éventuels dans l'URL
  request.request_parameters['controller'] # le contrôleur chargé
  request.request_parameters['action'] # l'action déclenchée
  User.current_user.filter # le filtre enregistré pour le visiteur
(tout, voitures ou avions uniquement)
  User.current_user.movies_only # si le visiteur a coché la case
"vidéos uniquement"
%>

Seulement… Ca me parait très complexe, ce que je fais! Je suis sûr
qu’il y a moyen de faire beaucoup plus simple mais je ne trouve pas
comment.

Donc en bref, ce que je veux faire c’est reprendre le paginator actuel,
changer ses conditions en fonction du filtre et le recharger à la page
actuelle. Après je charge un partial en Ajax qui remplace la liste de
galeries actuelles en retirant ou ajoutant diverses galeries, fonction
du filtrage sélectionné.

Merci d’avance pour votre aide toujours bien utile! Vivement que je
puisse aider tout autant…

Michael

J’espere avoir bien saisi ton probleme, mais pourquoi ne pas faire un
partial pour ta pagination? qui serait alors automatiquement
rechargéelors d’une nouvelle requete (comme s’il n’y avait pas de filtre en
somme) ?

Tu utilise ton controller pour recalculer les pages (ce qui doit déjà
être fait j’imagine).

Julien.

Julien ALEXANDRE a écrit :

J’espere avoir bien saisi ton probleme, mais pourquoi ne pas faire un
partial pour ta pagination? qui serait alors automatiquement rechargée
lors d’une nouvelle requete (comme s’il n’y avait pas de filtre en
somme) ?

Tu utilise ton controller pour recalculer les pages (ce qui doit déjÃ
être fait j’imagine).

Julien.
Je t’explique ci-dessous la situation actuelle…
Pour ma pagination, actuellement j’ai un partial ‘galleries/list’. Mais
avant de l’appeler, je dois sélectionner les bonnes galeries, donc en
général j’ai ceci:

# ------------- controllers/galleries_controller.rb -------------
def bestof
  @selection = 'bestof'
  @gallery_pages, @galleries = paginate(Gallery, { :conditions =>
'ratings.rating > 3', :order => 'ratings.rating DESC', :include =>
:ratings, :per_page => 20 })
end

def paginator
  @selection = params['selection']
  begin
    case @selection
    when 'bestof'
      @gallery_pages, @galleries = paginate(Gallery, { :conditions
=> 'ratings.rating > 3', :order => 'ratings.rating DESC', :include
=> :ratings, :per_page => 20 })
    when 'latest'
      # ... sélection des dernières galeries ...
    # (... et ainsi de suite avec 'favorites', 'user', 'tag', etc 

…)
end
end

# ------------- views/galleries/best.rhtml -------------
<div id="galleries_container">
  <%= render :partial => 'list' %>
</div>

# ------------- views/galleries/_list.rhtml -------------
# (...)
# pour chaque galerie, j'affiche une miniature, etc...
# (...)
<div id="pagination">
  <%= pagination_links_remote(@gallery_pages, {}, { :update =>
'galleries_container', :url => { :action => :paginator, :selection
=> @selection }}
  # j'ai pris la méthode sur
http://wiki.rubyonrails.org/rails/pages/How+to+Paginate+With+Ajax
(en bas de page)
</div>

J’ai déjà l’impression de me compliquer la vie avec cette action
‘paginator’… Il y a plus simple selon moi mais je n’ai pas encore
trouvé. Donc si quelqu’un a une idée pour simplifier tout ça et qui plus
est, simplifier la mise à jour de la liste par filtrage, je suis preneur
:slight_smile:

Michael

Michael :

Dans mon appli, j’ai des Galleries. J’ai plusieurs contrôleurs du
genre “latest”, “best”, “favorites”, etc. Dans chaque contrôleur,
je crée une pagination, chaque fois avec des conditions différentes,
en fonction de ce que je sélectionne (les dernières galeries, les
galeries les mieux notées, etc.).

[snip]

Tu peux avoir une action ‘list’ qui construira les conditions de
pagination
avec params[:categories] (latest, best, favorites), params[:filter]
(all, airplanes, cars) et les préférences de l’utilisateur stockées
dans la session, etc.

params[:categories] peut venir de ta route par exemple /:categories/list

params[:filter] peut venir de ?filter=all

Bon ben bon appétit à tous,

– Jean-François.