Une liste d’article trié par mois

All contributions published for previous SPIP versions

Voici une boucle proposée par homo-numericus pour afficher une liste d’articles mois par mois.

L’article 601 propose un calendrier d’article du même genre, mais voici une boucle abordant un problème similaire d’une façon un peu différente.

Comment ça marche?

1-

Commençons par lister tous les articles qui nous intéressent:

<BOUCLE_article(ARTICLES){par date}{inverse}>
 [(#TITRE|couper{50})]
-
[(#DATE|jour)]/[(#DATE|mois)]

</BOUCLE_article>

Une boucle toute simple, qui liste tous les articles du site, triés par date. On pourrait ajouter n’importe quel critère:
-  pour limiter la boucle à une rubrique {id_rubrique=XX},
-  pour se limiter à des articles d’un certain age {age>XX}
-  etc ...

2-

La prochaine étape est la plus complexe: faire l’affichage par mois.

<BOUCLE_article(ARTICLES){par date}{inverse}>

<BOUCLE_premierdumois(ARTICLES){id_article}{doublons}>

<ul>

<b> [(#DATE|nom_mois|majuscules)] [(#DATE|annee)] </b>
 
  <li>[(#TITRE|couper{50})]
-
[(#DATE|jour)]/[(#DATE|mois)]</li>

</BOUCLE_premierdumois>

<BOUCLE_MOIS(ARTICLES){mois_relatif=0}{doublons}{par
date}{inverse} >
       <li>[(#TITRE|couper{50})]
-
[(#DATE|jour)]/[(#DATE|mois)]</li>
</BOUCLE_MOIS>

</ul>

</BOUCLE_article>

On affiche avant tout le premier article trouvé grâce à la boucle premierdumois. Comme son nom l’indique, cet article est le premier du mois. On affiche donc le nom du mois, puis le titre de l’article et sa date.

Notez le critère {doublons}. Celui ci va nous permettre d’éliminer l’article déjà affiché des prochaines boucles.

La deuxième boucle MOIS va nous permettre d’afficher tous les autres articles du mois. En effet, le critère {mois_relatif=0} sélectionne tous les articles du même mois que l’article en cours [1]. Grâce au critère {doublons} présent ici encore, on évite d’afficher le 1er article du mois qui a déjà été affiché.

Une fois tous les articles du mois affichés, on arrive au bout de la boucle principale. Celle ci va donc passer au prochain article et donc au prochain mois. Et ainsi de suite.

Footnotes

[1celui sélectionné par la boucle article

Discussion

7 discussions

  • 1

    J’ai mis en place cette contrib qui es ttres bien.
    Mais pour une histoire de clartée et de lisibilité, je cherche à “plier” tous les Mois. Lorsque l’utilisateur clique sur un mois, cela le “dépli” et affiche les articles contenus à l’intérieur.

    Estèce que quelqu’un saurait m’aider?
    Il me semble qu’il faut utiliser du javascript...

    Reply to this message

  • 7

    On peut simplifier par : {mois_relatif}

    Par ailleurs pourquoi ne pas gérer “mois_relatif” comme un critère global, c à d, pouvant être associé à la date du jour #DATE même sans article courant (cas de la page d’accueil) ?

    • Par quelle magie le id_article va t’il faire que la boucle premierdumois n’affiche qu’un seul article ? Ne manque-il pas un critère 0,1 ?

    • il n’y a qu’un article avec cet id, donc il n’y aura qu’un article selectionné.

    • Pardon, je me suis mal exprimé et merci de ta patience. Le question est plutôt pourquoi la boucle premierdumois n’est-elle pas invoquée N fois avec un id_article à chaque fois différent ?

      1. la boucle _article selectionne successivement tous les articles,
      2. la boucle _premierdumois va afficher le premier article trouvé pour se mois, que l’on n’a pas encore affiché,
      3. la boucle _MOIS va afficher les articles suivant dans le même mois.

      ça va donner quelque chose comme cela:

      1. _article sélectionne l’article le plus récent,
      2. _premierdumois affiche cet article et se rappelle avec doublons qu’elle l’a déjà affiché,
      3. _MOIS va afficher tous les articles du même moi et se rappeler avec doublons qu’elle les a passés.
      4. _article sélectionne le prochain article le plus récent,
      5. _premierdumois essaie de l’afficher, mais si on l’a déjà affiché avant, on ne l’affiche plus, grâce au critère doublons
      6. pareil pour la boucle _MOIS
      7. et ainsi de suite.

      La boucle _premierdumois affichera donc plusieurs articles, tous les premiers article du mois en fait. Le critère doublons empéchant d’afficher un article que l’on a déjà affiché avant.

    • Oui effectivement mais n’aurais tu pas le même effet sans la boucle_article et avec le critère 0,1 dans la premiere ?

    • non:

      1. on ne peut pas vraiment supprimer la boucle _article puisqu’elle sert aussi dans la boucle _MOIS qui liste seulement les article avec un mois “relatif” de 0 (le même mois) par rapport à la boucle englobante. Mais effectivement, il est peut être possible de passer cette boucle à l’intérieure de la boucle _premierdumois et alors la boucle _article est obsoléthe
      2. dans tous les cas, on ne peut pas utiliser {0,1} dans la boucle _premierdumois, puisque cela limiterai à UN SEUL article. Mais nous on veut qu’elle affiche TOUS LES permiers articles de chaque mois (donc plusieurs). Avec cette approche, c’est donc doublons le mieux.

      Remarque que je ne dis pas que c’est la meilleure méthode (ce ne l’est pas du tout) et c’est pas très optimale en fait. Il y a d’autre solution, comme Calendrier des articles ou le filtre unique, ou même le nouveau critère agenda probablement.

    • Tu as raison, c’est une belle boucle !
      Merci

    Reply to this message

  • 1
    Jérôme C

    Comment faire pour exclure les 10 premiers articles ???

    Reply to this message

  • Jérôme C

    Si vous voulez grouper les articles qui sont publiés le même jour, voici un exemple:

    <BOUCLE_article(ARTICLES){id_rubrique=1}{doublons jour}{par date}{inverse}>
    
      <BOUCLE_premiermois_article(ARTICLES){id_article}{doublons}>
        [(#DATE|nom_mois)]</span> [(#DATE|annee)]<br>
        [(#DATE|jour)]<br>
        #TITRE<br>
    
      <BOUCLE_premierjour_articles(ARTICLES){jour_relatif=0}{doublons}{par date}{inverse}>
       #TITRE<br>
      </BOUCLE_premierjour_articles>
    </BOUCLE_premiermois_article>
    
    <BOUCLE_autres_articles(ARTICLES){doublons}{mois_relatif=0}{par date}{inverse}>
      <B_jour_articles>
        [(#DATE|jour)]<br>
    <BOUCLE_jour_articles(ARTICLES){jour_relatif=0}{id_rubrique=1}{doublons jour}>
         #TITRE<br>
    </BOUCLE_jour_articles>
    </BOUCLE_autres_articles>
    </BOUCLE_article>

    Bon je sait pas si mon code est trop assaini mais dites-moi si ça marche!

    Maintenant je tente de voir si c’est possible de trier par mois le plus récent en premier mais en commençant par le premier article du mois...

    Reply to this message

  • Reply to this message

  • 1- Le menu (repris de cette contrib) qui liste toutes les dates de publication des articles : placé dans sommaire.html par exemple

    <BOUCLE_dates(ARTICLES){par date}{inverse}>
    <BOUCLE_premierdujour(ARTICLES){id_article}{doublons}>
    <a href="date.php3?date=#DATE">[(#DATE|nom_jour)] [(#DATE|jour)] [(#DATE|nom_mois)] [(#DATE|annee)]</a>
    <br>
    </BOUCLE_premierdujour>
    <BOUCLE_JOUR(ARTICLES){mois_relatif=0}{jour_relatif=0}
    {doublons}{par date}{inverse}>
    </BOUCLE_JOUR>
    </BOUCLE_dates>

    2- Un fichier date.html (associé à date.php3)

    Affiche par rubrique les articles publiés à la date passée dans l’url

     <BOUCLE_rub(RUBRIQUES){tout}>
            <h1>[(#TITRE)]</h1><br>
    <INCLURE(liste.php3){date=#ENV{date}}{id_rubrique}>        
      </BOUCLE_rub>

    2bis - Un fichier liste.html (associé à liste.php3)

    <BOUCLE_art_rub (ARTICLES){id_rubrique=#ENV{id_rubrique}}
    {mois_relatif=0}{jour_relatif=0}>
    - #TITRE publié le [(#DATE|nom_jour)] [(#DATE|jour)] [(#DATE|nom_mois)] [(#DATE|affdate{'Y'})] [(#DATE|affdate{'H:i'})]<BR>
    </BOUCLE_art_rub>

    Reply to this message

  • Il me semble que les ul et li ne sont pas placés correctement.

    Sinon la boucle est superbe, et très pratique.
    J’en propose ci après une version avec une boucle supplémentaire qui me permet de limiter à 4 mois la liste des derniers articles.

    Je n’ai pas trouvé d’autre moyen que de rajouter une boucle, mais si quelqu’un a mieux, je suis preneur !

    <BOUCLE_dernierarticle(ARTICLES){par date}{inverse}{0,1}>
    		<ul>
    	<BOUCLE_article(ARTICLES){par date}{inverse}{mois_relatif<4}>
    			<BOUCLE_premierdumois(ARTICLES){id_article}{doublons}>
    			<li><b> [(#DATE|nom_mois|majuscules)] [(#DATE|annee)] </b></li>
    			<ul><li>[(#TITRE|couper{50})]
    			-
    			[(#DATE|jour)]/[(#DATE|mois)]</li>
    			</BOUCLE_premierdumois>
    			<BOUCLE_MOIS(ARTICLES){mois_relatif=0}{doublons}{par
    			date}{inverse} >
    			       <li>[(#TITRE|couper{50})]
    			-
    			[(#DATE|jour)]/[(#DATE|mois)]</li>
    		</BOUCLE_MOIS>
    		</ul>
    		</B_MOIS>
    	</BOUCLE_article>
    </BOUCLE_dernierarticle>
    </ul>

    Reply to this message

Add a comment

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite / PostgreSQL
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparait.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

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