Mes besoins étaient clairs : des tas d’évènements entrés en vrac (voir plugin agenda) à afficher automatiquement toutes les semaines du mercredi précédent au suivant. Vu que le lundi débute la semaine suivante dans un calendrier classique, ça commençait à se compliquer...

Voici comment vous permettre l’affichage d’éléments par la périodicité de votre choix. Ici, par exemple pour afficher des événements du mercredi au mercredi, mais cela pourrait être afficher les articles publiés le week end dernier... ou les évènements qui auront lieu dans 15 jours.

Il existe dans SPIP (voir ici) un complexe critère de gestion des périodes, du genre {agenda datetime, periode, AAAA, MM, JJ, AAAA2, MM2, JJ2}

qui se traduit également par des choses du style
<BOUCLE_mememois(ARTICLES) {agenda date, mois, (#DATE|annee), (#DATE|mois)} {par date}>

C’est dur hein ! Et pourtant cela permet de faire des affichages très précis, par exemple, la boucle précédente va prendre les articles de même mois que la boucle englobante et si elle n’existe pas, c’est le mois courant qui passera en critère.

Pas mal, mais insuffisant...même si il est possible de définir une fin de période
Citation :

Dans le cas où l’argument type (le deuxième argument) vaut periode, trois autres arguments peuvent être spécifiés à la fin du critère. Alors :
- YYYY, MM, JJ correspondront à la date de début de la période,
- YYYY2, MM2, JJ2 correspondront à la date de fin de la période.

Car si l’on sort de la semaine qui commence le Lundi ou de la mensualité qui débute le 1er de chaque mois il faut mettre les mains dans le cambouis un tout petit peu !

Pour décider vraiment des intervalles que l’on veut, il va donc falloir utiliser un filtre sur la date du jour.

1/ Petit rappel

Quel jour sommes-nous déjà ?
... au jour d’aujourd’hui...euh

trop facile ! utiliser #DATE

Ne pas mettre #DATE dans une boucle puisque cela renvoie systématiquement la date de l’article, la rubrique, le site... donc comme ce qui nous intéresse est la date du jour #DATE sera placée hors boucles.

#DATE renvoit le format numérique des dates MySQL : “2008-03-26 03:25:02”

2/Afficher quand commence et finit la période

ça se corse, il va falloir filtrer la date d’aujourd’hui !

Pour afficher automatiquemet par exemple chaque mercredi
Du mercredi 26 mars 2008 au mercredi 1er avril 2008 (merci de faire un effort d’imagination en modifiant ces dates en fonction d’aujourd’hui ;) )

Il faudra mettre dans le squelette

évidemment vous pouvez prendre un samedi ou un jeudi Du jeudi [(#DATE|date_debut_semaine_queljour{jeudi})] au jeudi [(#DATE|date_fin_semaine_queljour{jeudi})]

Les filtres adéquats

Voici les 2 fonctions de filtre à placer dans squelettes/mes_fonctions.php

  1. <?php
  2. function date_debut_semaine_queljour($datedonnee, $journee, $demande='') {
  3. #on s'occupe de la date donnée
  4. //2008-02-09
  5. list($annee, $mois, $jour) = explode('-', $datedonnee);
  6. // on transforme la date en timestamp
  7. $datedonnee_time = mktime(0, 0, 0, $mois, $jour, $annee);
  8. //on retourne le n° du jour
  9. $datedonnee_numero = date("w", $datedonnee_time);
  10.  
  11. $jours_en_num = array('dimanche'=>0, 'lundi'=>1, 'mardi'=>2, 'mercredi'=>3, 'jeudi'=>4, 'vendredi'=>5, 'samedi'=>6);
  12. //on retourne le n° de la journée
  13. $journee_numero = $jours_en_num[$journee];
  14. if ($datedonnee_numero <$journee_numero) $datedonnee_numero = 7+$datedonnee_numero;
  15.   $debut = $jour-$datedonnee_numero+$journee_numero;
  16.   $votre_date = getdate(mktime(0,0,0,$mois,$debut,$annee));
  17.    
  18. $an = $votre_date[year];
  19. $mois_numero = $votre_date[mon];
  20. $mois_lettre = array('', 'janv.', 'f&eacute;v.', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao&ucirc;t', 'sept.', 'oct.', 'nov.', 'd&eacute;c.');
  21. $mois = $mois_lettre[$mois_numero];
  22. $jour = $votre_date[mday];
  23.  
  24.  if($demande=="jour"){return "$jour";}
  25.  if($demande=="mois"){return "$mois_numero";}
  26.  if($demande=="an"){return "$an";}
  27.  
  28.  else {return "$jour $mois $an";};
  29. }
  30.  
  31. # Filtre SPIP [(#DATE|date_fin_semaine_queljour{mercredi})]
  32. function date_fin_semaine_queljour($datedonnee, $journee, $demande='') {
  33. #on s'occupe de la date donnée
  34. //2008-02-09
  35. list($annee, $mois, $jour) = explode('-', $datedonnee);
  36. // on transforme la date en timestamp
  37. $datedonnee_time = mktime(0, 0, 0, $mois, $jour, $annee);
  38. //on retourne le n° du jour
  39. $datedonnee_numero = date("w", $datedonnee_time);
  40.  
  41. #on s'occupe de mercredi
  42. $jours_en_num = array('dimanche'=>0, 'lundi'=>1, 'mardi'=>2, 'mercredi'=>3, 'jeudi'=>4, 'vendredi'=>5, 'samedi'=>6);
  43. //on retourne le n° de la journée
  44. $journee_numero = $jours_en_num[$journee];
  45. if ($datedonnee_numero <$journee_numero) $datedonnee_numero = 7+$datedonnee_numero;
  46.   $debut = $jour-$datedonnee_numero+$journee_numero+6;
  47.    $votre_date = getdate(mktime(0,0,0,$mois,$debut,$annee));
  48.    
  49. $an = $votre_date[year];
  50. $mois_numero = $votre_date[mon];
  51. $mois_lettre = array('', 'janv.', 'f&eacute;v.', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao&ucirc;t', 'sept.', 'oct.', 'nov.', 'd&eacute;c.');
  52. $mois = $mois_lettre[$mois_numero];
  53. $jour = $votre_date[mday];
  54.  
  55.  if($demande=="jour"){return "$jour";}
  56.  if($demande=="mois"){return "$mois_numero";}
  57.  if($demande=="an"){return "$an";}
  58.  
  59.  else {return "$jour $mois $an";};
  60. }
  61.  
  62. ?>

Télécharger

Comme ces filtres renvoient également l’année le mois ou le jour du premier (ou dernier) jour de votre choix (mercredi, ne vous en déplaise)

youpi ! on va pouvoir alors s’en servir dans une boucle comme critère

  1. {agenda date_debut, periode,
  2. [(#DATE|date_debut_semaine_queljour{mercredi,an})],
  3. [(#DATE|date_debut_semaine_queljour{mercredi,mois})],
  4. [(#DATE|date_debut_semaine_queljour{mercredi,jour})],
  5. [(#DATE|date_fin_semaine_queljour{mercredi,an})],
  6. [(#DATE|date_fin_semaine_queljour{mercredi,mois})],
  7. [(#DATE|date_fin_semaine_queljour{mercredi,jour})]}

Télécharger

Gloups, si vous avez plus court, n’hésitez pas !

Voila ce que cela donne au final

Vous pouvez admirer le résultat ici http://grainesdimages.com/spip.php?rubrique40

Exemples des possibilités

Pour passer des évènements "Cette semaine mercredi à mercredi" à Prochainement, j’ai crée un jeu de#SET pour modifier jourdebutplus et anfinplus en fonction de la rubrique appelé. Voici le code :

  1. [(#REM) affiche les évènements-films du mercredi au mercredi de cette semaine, sinon du mercredi suivant jusqu'à + 2 ans
  2. cela pour les rubriques cette semaine=40 et prochainement=41
  3. ]
  4.  
  5.         [(#ENV{id_rubrique}|=={41}|?{
  6.         [(#SET{jourdebutplus,7})]
  7.         [(#SET{anfinplus,2})]
  8.         ,
  9.         [(#SET{jourdebutplus,0})]
  10.         [(#SET{anfinplus,0})]
  11.         })]
  12.                
  13. [(#SET{andebut,
  14. [(#DATE|date_debut_semaine_queljour{mercredi,an})]})]
  15.  
  16. [(#SET{moisdebut,
  17. [(#DATE|date_debut_semaine_queljour{mercredi,mois})]})]
  18.  
  19. [(#SET{jourdebut,
  20. [(#EVAL{[(#DATE|date_debut_semaine_queljour{mercredi,jour})]
  21. +[(#GET{jourdebutplus})]})]})]
  22.        
  23. [(#SET{anfin,
  24. [(#EVAL{[(#DATE|date_fin_semaine_queljour{mercredi,an})]
  25. +[(#GET{anfinplus})]})]})]
  26.  
  27. [(#SET{moisfin,
  28. [(#DATE|date_fin_semaine_queljour{mercredi,mois})]})]
  29.  
  30. [(#SET{jourfin,
  31. [(#DATE|date_fin_semaine_queljour{mercredi,jour})]})]
  32.                        
  33.  
  34.  
  35.  
  36. <BOUCLE_evenement(EVENEMENTS){par date_debut}
  37. {agenda date_debut, periode, #GET{andebut}, #GET{moisdebut}, #GET{jourdebut}, #GET{anfin}, #GET{moisfin},
  38. #GET{jourfin}}{id_article}>
  39.  
  40.  #TITRE [(#DATE_DEBUT|nom_jour) ][(#DATE_DEBUT|jour) ][(#DATE_DEBUT|nom_mois) ][(#DATE_DEBUT|heures)H][(#DATE_DEBUT|minutes)]
  41.  
  42. </BOUCLE_evenement>

Télécharger

Pour afficher les évènements qui auront lieu dans 15 jours, il suffira donc de modifier

  1. [(#SET{jourdebutplus,7})]

par

  1. [(#SET{jourdebutplus,15})]
Texte - 3.3 ko

Téléchargez le fichier mes_fonctions.php

Prenez un bon navigateur!