Afficher les articles par semaine

Voici des filtres et des boucles pour faire un affichage hebdomadaire des articles du site.

Lister les articles sur une période

On commence par faire une boucle qui affiche une liste entre certaines dates :

<BOUCLE_articles(ARTICLES) {date >= #ENV{debut}} {date <= #ENV{fin}}>
<a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_articles>

Cette boucle liste les articles dont la date est comprise entre #ENV{debut} et #ENV{fin}. C’est à dire entre la date passée dans l’url par « debut » et la date passée dans l’url par « fin ».

On pourra donc appeler une page contenant cette boucle avec une url du genre
archive.php3?debut=2004-01-01&fin=2004-12-31 qui affiche les articles de l’année 2004.

Créer des liens hebdomadaires

Maintenant, il faudrait pouvoir générer ce genre de lien pour diriger les visiteurs vers la page qui affiche les articles de la bonne semaine.

On crée donc une boucle qui va lister toutes les semaines disponibles [1] :

<B_semaine>
<ul>
<BOUCLE_semaine(ARTICLES) {par date} {inverse}>
[<li><a href="archive.php3?debut=[(#DATE|debut_semaine)]&fin=[(#DATE|fin_semaine)]">
 semaine (#DATE|semaine|unique{semaine}) [(#DATE|annee|unique{annee})]
</a></li>]
</BOUCLE_semaine>
</ul>
</B_semaine>

Ici, on regarde tous les articles du site [2] et grâce au filtre unique, on affiche un lien pour chaque semaine contenant au moins un article.

Cette boucle dépend des filtres (à placer dans mes_fonctions.php3) suivant :

  • debut_semaine retourne la date du premier jour de la semaine (les semaines commencent le Dimanche),
  • fin_semaine retourne la date du dernier jour de la semaine,
  • semaine retourne le numéros de la semaine dans l’année.
function debut_semaine($date) {
   $ladate = strtotime($date);
   return date('Y-m-d',$ladate - (24*3600*date('w',$ladate)));
}

function fin_semaine($date) {
   $ladate = strtotime($date);
   return date('Y-m-d',$ladate + (24*3600*(6-date('w',$ladate))));
}

function semaine($date) {
 $ts = strtotime($date);
 if (date('w',$ts) == 0) {
   //commencer la semaine le Dimanche pour que ca colle
   //avec les deux autres filtres.
   return (date('W',$ts)-1)%52;
 } else {
   return date('W',$ts);
 }
}

Un démo de cette méthode se trouve dans les archives du bloc-notes du désordre.


Des liens pour un blog

Dans le cas très particulier où l’on utilise SPIP pour faire seulement un blog, et qu’il n’y a pas de page spécifique pour les articles — c’est à dire que les articles ne sont que des entrées sur la page d’une rubrique. Les liens entre articles (à base de artXXX) et ceux générés par la balise #URL_ARTICLE ne doivent pas faire un lien vers la page de l’article mais vers la page de la période contenant l’article — une page rubrique avec la semaine contenant l’article spécifié en paramètre dans l’url.

On peut faire cela en utilisant la fonctionnalité des url personnalisées en ajoutant ce code dans ecrire/mes_options.php3 :

function generer_url_article($id_article) {
  $query = "SELECT id_rubrique, date FROM spip_articles WHERE  id_article=$id_article";
  $result = spip_query($query);
  if (!($row = spip_fetch_array($result))) {
    return ""; # objet inexistant
  }
  $date = $row['date'];
  $id_rubrique = $row['id_rubrique'];
  $url = generer_url_rubrique($id_rubrique);
  $debut = debut_semaine($date); //remplacer ici par votre fonction de calcul de periode
  $fin = fin_semaine($date); //remplacer ici par votre fonction de calcul de periode
  return $url.((!strpos($url,'?'))?'?':'&')."debut=$debut&fin=$fin#$id_article";
}

Ensuite dans le squelette de la rubrique qui affiche les articles de la période mettre une ancre contenant l’id de l’article, par exemple :

<BOUCLE_articles(ARTICLES){id_rubrique}{date >= #ENV{debut}}{date <= #ENV{fin}}{par date}{inverse}>
   <div class="titre">#TITRE<a name="#ID_ARTICLE">&nbsp;</a></div>
		[(#TEXTE)]
	</div>
</BOUCLE_articles>

Si vous avez un mélange de rubriques de blog et de non-blog [3], la même méthode peut-être utilisée en marquant avec un mot clé les rubriques constituant un blog [4], il faut alors modifier le début de la fonction de génération d’URL :

function generer_url_article($id_article) { 
   $query = "SELECT spip_articles.id_secteur, spip_articles.date
       FROM spip_articles, spip_mots_rubriques
       WHERE spip_articles.id_article=$id_article
       AND spip_articles.id_rubrique = spip_mots_rubriques.id_rubrique
       AND id_mot = XXX "; // XXX est l'id de votre mot-clé
   $result = spip_query($query);
   if (!($row = spip_fetch_array($result))) {
       return "article.php3?id_article=$id_article";
   } else {
       $date = $row['date'];
       $id_rubrique = $row['id_rubrique'];
       $url = generer_url_rubrique($id_rubrique);
       $debut = debut_semaine($date); //remplacer ici par votre fonction de calcul de periode
       $fin = fin_semaine($date); //remplacer ici par votre fonction de calcul de periode
       return $url.(strpos($url,'?')===false)?'?':'&')."debut=$debut&fin=$fin#$id_article";
   }
}

Notes

[1pour faire des listes imbriquées selon l’année, voir l’article « Usage du filtre « unique » pour classer des articles ».

[2mais on pourrait ajouter d’autres critères, pour limiter la rubrique par exemple.

[3c’est à dire un ou plusieurs rubriques de blog avec un ou plusieurs rubriques n’étant pas des blogs

[4le même mot-clé pourra servir dans le squelette de rubrique pour permuter entre un affichage normal et un affichage blog

On pourrait utiliser cette méthode pour faire des affichages selon d’autres périodes (année scolaire, etc...) en faisant des filtres qui retournent la date du début et de la fin de la période voulue.

Si vous avez des propositions, n’hésitez pas à les ajouter dans le forum ou sur le wiki.

Discussion

2 discussions

  • Bonjour, ce plugin est très très chouette pour gérer une programmation de cinéma, merci. Mais j’avoue être assez perdu dans la gestion des dates : en effet, je voudrais afficher les file de la semaine en cours - assez facile, pas de souci - mais j’aimerais en plus :

    1. afficher en tête de page « semaine du xx au xx » (ça je sais le faire) avec une flèche à droite pour « semaine suivante » et à gauche pour « semaine précédente ». Là je suis perdu ...
    2. lorsque je clique sur « semaine suivante » (en supposant que le flèche fonctionne), afficher les films de cette semaine, si possible en ajax ... Bref naviguer de semaine en semaine, mais jamais vers la semaine précédant celle en cours. Et, de plus, je programme les films mensuellement, donc jamais plus de cinq semaines.

    Une piste ? Cela me sauverait la vie :-)

    Merci d’avance. Marc

    Répondre à ce message

  • 1
    zerocool

    bonjour
    j’aimerai faire la meme chose mais par mois est ce quelqu’un peux m’aider
    merci

    • voici une petite contribution pour un affichage par mois
      si tu veux afficher plusieurs mois du dois remplacer 31 par le nombre de jours que tu souhaites afficher (ex : 61 pour deux mois)

      function debut_mois($date)
      $ladate = strtotime($date) ;
      return date(’Y-m-d’,$ladate - (24*3600*date(’d’,$ladate))) ;

      function fin_mois($date)
      $ladate = strtotime($date) ;
      return date(’Y-m-d’,$ladate + (24*3600*(31-date(’d’,$ladate)))) ;

    Répondre à ce message

Ajouter un commentaire

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
  • 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 apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom