Toutes les brèves d’une année sur une page

All contributions published for previous SPIP versions

Présenter toutes les brèves d’une même année sur une page, c’est possible avec une seule boucle dans Spip 1.6 . Néanmoins si vous êtes dans une version antérieure (et que vous voulez y rester), c’est aussi possible avec un peu de PHP.

Objectif

Présenter toutes les brèves d’un site sur une même page en ne mettant que les brèves d’une même année sur la page.

Sous-objectifs


-  Par défaut, présenter les brèves de l’année en cours ;
-  Permettre la navigation d’une année à l’autre ;
-  Ne pas avoir à modifier le squelette à chaque début d’année ;
-  Récupérer les anciennes brèves (quand le site était en HTML statique avant que le webmestre ne découvre ce merveilleux outil qu’est SPIP).

Principe

On créé un fichier de squelette spécifique qu’on appelle news.php3 (on créé aussi son homologue news.html).

Pour déterminer l’année à afficher, on se base sur une variable transmise par l’URL qu’on appelle var_nav_year(le “var_” est là pour optimiser le cache de SPIP)
L’appel de la page “news” doit se faire de la forme
news.php3?var_nav_year=AAAA où AAAA est l’année désirée.

Haut dans le squelette, on vérifie au préalable que var_nav_year est positionnée. Si non, on la force sur l’année en cours.
On en profite pour ramener systématiquement toute année demandée antérieure à la première année dispo sur cette première année (ici 2000. Si l’URL a 1998 dans var_nav_year, on remet 2000).

De même, si on demande une année postérieure à l’année en cours, on ramène var_nav_year à l’année en cours.
On conserve l’année à retenir dans une variable PHP $id_annee

<?php
if(isset($GLOBALS['var_nav_year'])) {
     $id_annee=intval($GLOBALS['var_nav_year']);
     if ($id_annee<=2000) { 
        $id_annee = 2000; }
     if ($id_annee>intval(date('Y', time()))) {
        $id_annee = intval(date('Y', time())); }
}
else {
 $id_annee = intval(date('Y', time()));
}
?>

Une fois que id_annee est renseignée, on va afficher les news correspondant à cette année.

L’utilisation des variables étant difficile au sein des boucles SPIP, on construit une boucle BREVES qui affiche toutes les news du site.
A l’intérieur de cette boucle, on introduit un bout de PHP qui fait la sélection des brèves en comparant l’année de la brève avec id_annee.

<BOUCLE_principale(BREVES){tout}{par date}{inverse}>
 <?php  $annee_breve='[(#DATE|annee)]';
     if ($annee_breve==$id_annee ) {     ?>
          [(#TITRE)]  <br>
          [(#TEXTE)]
 <?php } ?>
 </BOUCLE_principale>

En dehors de la boucle, si on est sur la plus ancienne année, on fait un include de la “vieille” page statique des news :

<?php
 if ($id_annee<=2000) {
   include "news2000.html";
 };
 ?>

( Normalement, la boucle n’a rien ramené !)

Reste le problème de la navigation.
Pour interroger les brèves d’une année antérieure, on vérifie qu’on est pas
sur la dernière année dispo :

<?php     if ($id_annee > 2000) {
       echo "<a href='news.php3?var_nav_year=".($id_annee - 1)."'>";
       echo "Voir les news de l'année ".($id_annee-1)."</a>";
      }
  ?>

Pour interroger les brèves d’une année postérieure, on vérifie qu’on est pas sur l’année courante :

<?php    if ($id_annee < intval(date('Y', time()))) {
       echo "<a href='news.php3?var_nav_year=".($id_annee + 1)."'>";
       echo "Voir les news de l'année ".($id_annee+1)."</a>";
      }
   ?>

Pour la présentation, on peut écrire en haut de page :

Toutes les news pour l'année <?php echo $id_annee; ?>

Un exemple ?

Un exemple ici http://www.dreamnev.org/fr/news.php3
(désolé, je suis nul en présentation)

Limites du projet


-  Que se passe-t-il si le 1er janvier d’une nouvelle année, il n’y a pas encore de news pour cette année ?
-  D’une manière générale, l’absence de news pour une année donnée n’est pas gérée.

Contact

Je suis à votre disposition :
Raphaël BESSON

Avril 2003

Bon courage !

Note des admin : Si vous êtes à jour dans les versions de SPIP, il est possible a partir de la version 1.6 faire cela en SPIP pur à l’intérieur d’un squelette.

Voici la boucle :
<BOUCLE_principale(BREVES){par date}{annee_relatif=0}>

Et il suffit que cette boucle possède la date dans le contexte ou dans l’url ( ... par exemple nomDuFichier.php3?date=2003 )

Voir la documentation sur la gestion des dates

updated on 6 December 2006

Discussion

2 discussions

  • 2
    silicium

    une erreur s’est glissée dans le code !

    Dans le paragraphe Pour interroger les brèves d’une année postérieure, on vérifie qu’on est pas sur l’année courante :

    Il faut enlever la parenthèse fermante de :

    echo "<a href='news.php3?var_nav_year=".($id_annee + 1)."'>");

    en echo "<a href='news.php3?var_nav_year=".($id_annee + 1)."'>";

    Je déconseille de coder en dur le nom du script. si on le change il faut retourner dans le script modifier le code à la main. A la place, utilisez $PHP_SELF

    Exemple : echo "<a href=\"$PHP_SELF?var_nav_year=" . ($id_annee - 1)."\">";

    • Raphael BESSON

      Deux remarques judicieuses non bloquantes mais à prendre en compte.
      Merci Silicium

    • la “)” c’est corrigé, pour le nom du script vous ferez la manip tout seuls les amis ;-)

    Reply to this message

  • 1
    Groelk

    Et comment faire pour afficher sur une même page brèves ET articles classés ENSEMBLE par année de publication ?

    • Raphael BESSON

      Salut,

      Pour avoir les news et les articles, il suffit de faire deux boucles sur le même principe l’une en dessous de l’autre : la première sur les brèves, la seconde sur les articles.

      A+

    Reply to this message

Ajouter un commentaire

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