Tri des articles par rubrique

Quand on veut afficher les articles dans un ordre différent selon les rubriques, par exemple des actualités par date anti-chronologique, un glossaire par ordre alphabétique, et d’autres rubriques par numéro d’article, il faut définir tous ces cas particuliers dans les squelettes.

Ce plugin permet de simplifier tout cela et de définir dans l’espace privé le tri des articles, rubrique par rubrique.

On choisit simplement le tri en modifiant la rubrique :

Pour reproduire le tri des articles dans l’espace public, il suffit alors d’utiliser le critère {tri_rubrique} dans les boucles des squelettes, à la place de tout autre critère de tri :

<BOUCLE_articles(ARTICLES){id_rubrique}{tri_rubrique}>

Un même squelette affichera donc, selon la rubrique en cours, les articles dans l’ordre choisi dans l’espace privé.

Si le plugin Rang est installé et activé sur les articles, il est pris en compte et le tri par rang est proposé.

La configuration du plugin permet aussi d’appliquer un tri global à toutes les rubriques en seule une fois (cela écrase toutes les configurations déjà faites)

NB : ce plugin surcharge un squelette de l’espace privé : /prive/objets/liste/articles.html

updated on 10 January 2020

Discussion

3 discussions

  • 12

    Bonjour,

    j’aurais aimer intégré ça au squelette escal

    Le souci est que le critère tri_rubrique est spécifique au plugin “Tri-des-articles-par-rubrique”; Si je le mets dans Escal est que le plugin n’est pas installé, ça génère une erreur.

    y aurais t’il une astuce pour faire une condition du genre, si plugin installé on applique ça sinon on applique la règle actuel d’escal

    J’ai bien essayé ça mais je n’y suis pas parvenu; Difficile de jouer sur les critères de boucle.

    la boucle en question :
    <BOUCLE_articles_rubs(ARTICLES){id_rubrique}{par num titre}{par date}{inverse}{pagination #GET{nbrpag}}>

    • Alors je reviens la dessus, quelquefois que quelqu’un aurais une idée.

      En fait, l’idée serait de remplacer

      {par num titre}{par date}{inverse}

      par

        {tri_rubrique}

      si le plugin “Tri des articles par rubrique” est activé

    • Voilà une piste à tester :

      #SET{par, date}
      #SET{sens, inverse}
      <BOUCLE_rubrique(RUBRIQUES){id_rubrique}>
         #SET{par, #TRIRUB_ARTICLES}
         #SET{sens, #TRIRUB_ARTICLES_INVERSE}
      </BOUCLE_rubrique>
       
      <ul class="liste-items">
      <BOUCLE_articles(ARTICLES){id_rubrique?}{tri #GET{par}, #GET{sens}}>
         <li class="item"><a href="#URL_ARTICLE">#TITRE</a></li>
      </BOUCLE_articles>
      </ul>
    • Hello
      Désolé mais je ne vois pas en quoi ton code répond au problème posé le but étant d’utiliser le critère {tri_rubrique} en lieu et place de
      {par num titre}{par date}{inverse} si et seulement si le plugin est activé.

    • Je t’ai donné une piste qui permet d’éviter d’utiliser le critère {tri_rubrique}, pour que ça ne plante pas quand le plugin n’est pas installé.
      Je ne t’ai pas donné le code tout cuit à copier/coller, mais bon...
      Il suffit de tester si le plugin tri_par_rubrique est actif dans la première boucle.

    • Mais

      • ta première boucle sera toujours valable donc à quoi servent les premiers #SET ?
      • d’où tu sors ces balises #TRIRUB_ARTICLES et #TRIRUB_ARTICLES_INVERSE ?
      • comment le choix du tri fait dans le plugin sera-t-il pris en compte puisqu’on a jamais le critère {tri_rubrique} ?

      Bref, il y a un truc qui m’échappe (même plusieurs sans doute) !

      Ou alors, c’est que les 2 balises #TRIRUB_ARTICLES et #TRIRUB_ARTICLES_INVERSE sont définies dans le plugin, c’est ça ?

    • Je disais :

      Il suffit de tester si le plugin tri_par_rubrique est actif dans la première boucle.

      <BOUCLE_rubrique(RUBRIQUES){id_rubrique}{si #PLUGIN{tri_par_rubrique}}>
    • Oui, ça je sais faire. Je n’avais juste pas capté que les balises étaient définies dans le plugin.
      Reste que #TRIRUB_ARTICLES_INVERSE renvoie 0 ou 1 et non pas “inverse” ou rien.

    • Bon ça ne fonctionne pas.

      J’ai donc

      #SET{par, date}
      #SET{sens, 1}
      <BOUCLE_rubrique(RUBRIQUES){id_rubrique}{si #PLUGIN{tri_par_rubrique}|oui}>
         #SET{par, #TRIRUB_ARTICLES}
         #SET{sens, #TRIRUB_ARTICLES_INVERSE}
      </BOUCLE_rubrique>

      #GET{par} me renvoie bien “titre” si j’ai coché “par titre” dans le plugin pour le rubrique
      Mais si la boucle

      <BOUCLE_articles_rubs(ARTICLES){id_rubrique?}{tri titre}{pagination #GET{nbrpag}}> 

      me classe bien les articles par titre

      <BOUCLE_articles_rubs(ARTICLES){id_rubrique?}{tri #GET{par}}{pagination #GET{nbrpag}}> 

      me les classe comme si je n’avais pas le critère {tri #GET{par}}

    • Je confirme donc : le critère {par ...} ou {tri ...} n’accepte pas la balise #GET et sans doute pas d’autre balise non plus.
      Ne me reste plus qu’à dupliquer toute ma boucle et son contenu et d’utiliser le critère {si ...}.
      Pas élégant mais ça fonctionne !

    • J’ai testé le code ci dessus, et chez moi ça marche très bien avec {tri #GET{par}}, même si pour être complet il faudrait plutôt utiliser {tri #GET{par}, #GET{sens}}

      Une précision : #TRIRUB_ARTICLES_INVERSE vaut 0 pour un tri normal, et 1 pour un tri inverse, donc pour l’utiliser dans {tri ...} il faut transformer la valeur en 1 ou -1 :

      #SET{sens, #TRIRUB_ARTICLES_INVERSE|?{-1,1}}
    • Oui je n’avais pas mis le #GET{sens} pour simplifier.
      Bon, je me suis replongé dans ce problème et j’ai trouvé ce qui bloquait : l’espace après la virgule dans les #SET

    • Et j’oubliais le principal : merci beaucoup nicod_ !

    Reply to this message

  • 2

    Bravo pour ce plugin qui résout le problème pour plusieurs rubriques.

    Quel fichier dois-je surcharger pour faire apparaître sur la page de config d’autres critères de tri, comme date_redac. Si en plus je pouvais passer age_redac<X dans le calcul, ça serait top :)

    Sur cette même page de config, que faire pour avoir 2 critères de tri : par titre_mot, titre avec pour ces mots clés le groupe id_groupe=Y.

    D’avance merci

    • Pour ajouter un autre critère de tri, il suffit de surcharger la fonction filtre_tri_par_rubrique_criteres_dist() qui est dans tri_par_rubrique_fonctions.php, et qui renvoie juste un tableau des critères (champ Mysql / libellé).

      On peut la surcharger en la copiant et en retirant _dist de son nom, en la plaçant dans son propre fichier _fonctions.php

      Par contre, pour {age_redac<X}, ça c’est un critère de sélection, pas de tri, donc à ajouter dans les boucles, en plus de {tri_rubrique}.

    • Merci
      Je vais tester après les vacances
      Bonne année

    Reply to this message

  • 1

    Bonjour,

    Merci pour cette contribution. Y-a-t’il une incompatibilité avec SPIP 3.1 ou ce plugin n’a juste pas été testé sur d’autres versions que 3.2 (à première vue cela fonctionne normalement avec 3.1.18).

    • Bonjour,
      il n’y avait pas de volonté de bloquer pour SPIP 3.1, ni d’incompatibilité à priori.
      Le plugin a été testé et fonctionne en 3.1, la nouvelle version 1.2.3 le prend donc en compte.
      La mise à jour devrait arriver sous peu.

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom