Afficher les articles par année ou par saison (Archive)

All contributions published for previous SPIP versions

But: fournir un calendrier pour réunir tous les articles sur une période assez grande.

Etant utilisateur depuis quelque temps de l’agenda annuel proposé dans le squelette d’Epona. J’ai voulu profiter du nouveau critère agenda développé dans SPIP 1.8.2 afin d’éliminer le code php présent dans l’ancien squelette et ainsi permettre une mise en cache.

Premier cas


J’ai découpé cette contrib en deux parties l’une qui permet d’afficher tous les articles durant une période reposant sur les critères agenda et periode de la boucle articles.
Exemple : tous les évènements de l’année 2005 sur mon site

Elle est composé des fichiers:

  • agenda.css
  • agenda.html
  • agenda_annee_fonctions.php3
  • agenda_annee.html
  • agenda_longperiode_fonctions.php3
  • agenda_longperiode.html
  • agenda_saison_fonctions.php3
  • agenda_saison.html

agenda.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="#LANG_DIR" lang="#LANG">
<head>
<title><:icone_agenda:> [#NOM_SITE_SPIP]</title>
<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
<link rel="stylesheet" href="ecrire/calendrier.css" type="text/css" />
<script type="text/javascript" src="ecrire/layer.js"></script>
<script type="text/javascript" src="ecrire/presentation.js"></script>
 <link rel="stylesheet" href="#DOSSIER_SQUELETTE/agenda.css"  type="text/css" />
</style>
</head><body>
<INCLURE(page.php3){fond=agenda_#ENV{type,mois}}{type}{delais=900}{annee}{mois}{jour}{echelle}{partie_cal}{theme}{typemot}{annee_fin}{mois_fin}{jour_fin}>
</body></html>

Le fichier agenda_longperiode.html est une légère variante de agenda_periode.html de SPIP en changeant agenda_affiche_annuel par agenda_affiche comme vous le montre la suite :

<div id="agenda" >
<BOUCLE_periode(ARTICLES){par date}
    {agenda date, periode,
  #ENV{annee}, #ENV{mois}, #ENV{jour},
  #ENV{annee_fin}, #ENV{mois_fin}, #ENV{jour_fin}}>[
(#DATE|agenda_memo{#DESCRIPTIF, #TITRE, #URL_ARTICLE, 'calendrier-couleur6'})
]</BOUCLE_periode>[(#TOTAL_BOUCLE|
	agenda_affiche_annuel{<:aucun_article:>, 'periode', 'calendrier-couleur6'}
)]<//B_periode>
</div>

Les fichiers agenda_annee.html, agenda_saison.html sont de légères variantes de agenda_longperiode.html.

Les fichiers agenda_annee_fonctions.php3, agenda_longperiode_fonctions.php3, agenda_saison_fonctions.php3 sont identiques et sont le coeur de cette contrib.
Essentiellement la fonction agenda_affiche_annuel qui permet de restituer les articles mémorisés gràce aux filtres agenda_memo sur forme d’une liste.

<?php

function date_journommoisannee($d)  {
  $annee =substr($d, 0, 4);
  $mois =substr($d, 4, 2);
  $jour =substr($d, 6, 2);
  $la_date = date("Y-m-d H:i:s", mktime(0, 0, 0, $mois, $jour, $annee ) ) ;

  return affdate_base($la_date, 'nom_jour')." ".affdate_base($la_date, 'jour')." ".affdate_base( $la_date, 'nom_mois');
  
}

function date_nommoisannee($d)  {
  $annee =substr($d, 0, 4);
  $mois =substr($d, 4, 2);
  $jour =substr($d, 6, 2);
  $la_date = date("Y-m-d H:i:s", mktime(0, 0, 0, $mois, $jour, $annee ) ) ;

  return  affdate_base( $la_date, 'nom_mois')." ".affdate_base($la_date, 'annee') ;
  
}

function agenda_affiche_annuel($i)
{
  $args = func_get_args();
  $nb = array_shift($args); // nombre d'evenements (on pourrait l'afficher)
  $sinon = array_shift($args);
  if (!$nb) return $sinon;
  $type = array_shift($args);
  $agenda = agenda_memo(0);
  $ligne = ''; 
  foreach ($agenda as $cle=>$valeur)  
    {
      $evt = $valeur ; 
      foreach ($evt as $cle=>$valeur)  
	{
	  $moisan = substr($cle, 0, 6 ) ;
          $annee = substr($cle, 0, 4 ) ; 
          $mois = substr($cle, 4, 2 ) ;     
	  $nommois = date_nommoisannee($cle) ;
	  if ( !( $moisan == $moisold ) & ($moisold!='')  ) $ligne .= "</ul>" ;
	  if ( !( $moisan == $moisold )  ) $ligne .="<br/><h2><a href=\"agenda.php3?annee=$annee&mois=$mois&jour=01&type=mois\" > $nommois</h2></a><ul>" ;
	  $le_jour = date_journommoisannee($cle) ;
	  $evnt = $valeur ;
	  foreach ($evnt as $cle=>$valeur)  
	    {
	      $evnt = $valeur ;
	      $url_art =$evnt['URL'] ;
	      $titre =$evnt['SUMMARY'] ;
	      $ligne .= "<li><strong>$le_jour</strong> : <a href=\"$url_art\" >  $titre </a> </li> \n";
	    }
	  $moisold = $moisan ;
	}
    }
  $ligne .="</ul>" ;
  return $ligne;
}

?>

Ensuite vous pouvez modifier l’aspect visuel en modifiant le fichier agenda.css. Il existe deux archives annee_date.zip et anne_date_redac.zip. Personnellement j’utilise la deuxième archive qui utilise la date de publication antérieure des articles.

Deuxième Partie

Le second a en plus un classement par mot clé présent dans le squelette Epona. On peut sélectionner les évenement dans le groupe de mot clé nommé «type de manifestation».
Exemple : tous les évènements de l’année 2005 sur mon site
Elle est composé des fichiers:

  • agenda.css
  • agenda.html
  • agenda_annee_mot_fonctions.php3
  • agenda_annee_mot.html
  • agenda_longperiode_mot_fonctions.php3
  • agenda_longperiode_mot.html
  • agenda_saison_mot_fonctions.php3
  • agenda_saison_mot.html

agenda.html est le meme dans toutes les archives.

agenda_longperiode_mot.html

<div id="agenda" >
<BOUCLE_periode(ARTICLES){par date_redac}
    {agenda date_redac, periode,
  #ENV{annee}, #ENV{mois}, #ENV{jour},
  #ENV{annee_fin}, #ENV{mois_fin}, #ENV{jour_fin}}><BOUCLE_genre(MOTS){id_article}{type=type de manifestations}>[
(#DATE_REDAC|agenda_memo_annuel_mot{ #ENV{typemot,tout}, #TITRE, #URL_MOT, #_periode:TITRE, #URL_ARTICLE, 'calendrier-couleur6'})
]</BOUCLE_genre></BOUCLE_periode>[(#TOTAL_BOUCLE|
	agenda_affiche_annuel_mot{<:aucun_article:>, 'periode', 'calendrier-couleur6'}
)]<//B_periode>
</div>
<div id="sommaire">
Filtrer par type:
<BOUCLE_genresom(MOTS){type=type de manifestations}{par titre}><li><a href="agenda.php3?annee=[(#ENV{annee})]&mois=[(#ENV{mois})]&jour=[(#ENV{jour})]&annee_fin=[(#ENV{annee_fin})]&mois_fin=[(#ENV{mois_fin})]&jour_fin=[(#ENV{jour_fin})]&type=longperiode_mot&typemot=#TITRE">#TITRE</a></li>
</BOUCLE_genresom>
<li><a href="agenda.php3?annee=[(#ENV{annee})]&mois=[(#ENV{mois})]&jour=[(#ENV{jour})]&annee_fin=[(#ENV{annee_fin})]&mois_fin=[(#ENV{mois_fin})]&jour_fin=[(#ENV{jour_fin})]&type=longperiode_mot">Tout afficher</a></li>
</ul>

agenda_longperiode_mot_fonctions.php3

<?php

function date_journommoisannee($d)  {
  $annee =substr($d, 0, 4);
  $mois =substr($d, 4, 2);
  $jour =substr($d, 6, 2);
  $la_date = date("Y-m-d H:i:s", mktime(0, 0, 0, $mois, $jour, $annee ) ) ;

  return affdate_base($la_date, 'nom_jour')." ".affdate_base($la_date, 'jour')." ".affdate_base( $la_date, 'nom_mois');
  
}

function date_nommoisannee($d)  {
  $annee =substr($d, 0, 4);
  $mois =substr($d, 4, 2);
  $jour =substr($d, 6, 2);
  $la_date = date("Y-m-d H:i:s", mktime(0, 0, 0, $mois, $jour, $annee ) ) ;

  return  affdate_base( $la_date, 'nom_mois')." ".affdate_base($la_date, 'annee') ;
  
}

function agenda_memo_annuel_mot($date=0, $typemot='', $mot='', $url_mot='', $titre='', $url='', $cal='')
{
  static $agenda = array(); 
  if ( ($typemot!= "tout") & ($typemot!="$mot") ) return "" ;
  if (!$date) return $agenda;
  $idate = date_ical($date);
  $cal = trim($cal); // func_get_args (filtre alterner) rajoute \n !!!!
  $agenda[$cal][(date_anneemoisjour($date))][] =  array(
			'CATEGORIES' => $cal,
			'DTSTART' => $idate,
			'DTEND' => $idate,
                        'MOT' => texte_script($mot),
                        'URLMOT' => $url_mot,
                        'TITRE' => texte_script($titre),
                        'URL' => $url);
  // toujours retourner vide pour qu'il ne se passe rien
  return "";
}


function agenda_affiche_annuel_mot($i)
{
  $args = func_get_args();
  $nb = array_shift($args); // nombre d'evenements (on pourrait l'afficher)
  $sinon = array_shift($args);
  if (!$nb) return $sinon;
  $type = array_shift($args);
  $agenda = agenda_memo_annuel_mot(0);
  
  $ligne = ''; 
  foreach ($agenda as $cle=>$valeur)  
    {
      $evt = $valeur ; 
      foreach ($evt as $cle=>$valeur)  
	{
	  $moisan = substr($cle, 0, 6 ) ; 
          $annee = substr($cle, 0, 4 ) ; 
          $mois = substr($cle, 4, 2 ) ; 
    
	  $nommois = date_nommoisannee($cle) ;
	  if ( !( $moisan == $moisold ) & ($moisold!='')  ) $ligne .= "</ul>" ;
	  if ( !( $moisan == $moisold )  ) $ligne .="<br/><h2><a href=\"agenda.php3?annee=$annee&mois=$mois&jour=01&type=mois\" >  $nommois </a></h2><ul>" ;
	  $le_jour = date_journommoisannee($cle) ;
	  $evnt = $valeur ;
	  foreach ($evnt as $cle=>$valeur)  
	    {
	      $evnt = $valeur ;
	      $url_art =$evnt['URL'] ;
	      $titre =$evnt['TITRE'] ;
	      $url_mot =$evnt['URLMOT'] ;
	      $mot =$evnt['MOT'] ;
	      $ligne .= "<li><span style=\"display:block; float:left;\"><strong>$le_jour</strong> : <a href=\"$url_art\" >  $titre </a></span><span style=\"display:block; text-align:right;\">  type <a href=\"$url_mot\" >  $mot </a></span> </li> \n";
	    }
	  $moisold = $moisan ;
	}
    }
$ligne .="</ul>" ;
  return $ligne;
}

?>

De meme que dans la première partie il y a deux versions l’une où l’on utilise la date de publication de l’article l’autre où l’on utilise la date de publication antérieure.

Comment utiliser cette contribution

Cette contribution nécessite SPIP 1.8.2
Téléchargez une des 4 archives, puis décompressez la dans votre dossier squelette.
Vous ferez les appels aux différents agenda en utilisant les urls suivantes.
Pour les archives annee_date et annee_date_redac les urls à utiliser sont:

  • Pour afficher les articles du 4 janvier 2005 au 16 mai 2005
    votresite.com/agenda.php3?annee=2005&mois=01&jour=04&annee_fin=2005&mois_fin=05&jour=16&type=longperiode
  • Pour afficher les articles de la saison 2004-2005(c’est à dire du 1 septembre 2004 au 31 aout 2005)
    votresite.com/agenda.php3?annee=2004&annee_fin=2005&type=saison
  • Pour afficher les articles de l’année 2005
    votresite.com/agenda.php3?annee=2005&type=annee

Pour les archives annee_mot_date et annee_mot_date_redac les urls à utiliser sont:

  • Pour afficher les articles du 4 janvier 2005 au 16 mai 2005
    votresite.com/agenda.php3?annee=2005&mois=01&jour=04&annee_fin=2005&mois_fin=05&jour=16&type=longperiode_mot
  • Pour afficher les articles de la saison 2004-2005(c’est à dire du 1 septembre 2004 au 31 aout 2005)
    votresite.com/agenda.php3?annee=2004&annee_fin=2005&type=saison_mot
  • Pour afficher les articles de l’annee 2005
    votresite.com/agenda.php3?annee=2005&type=annee_mot

Ps: Si vous trouvez que les agendas générés possèdent des couleurs horribles, c’est normal vous avez bon gout, pour en changer modifier agenda.css.

updated on 12 May 2012

Discussion

4 discussions

  • 4

    Désolé, je n’ai pas mis mon message au bon endroit, je recommence

    Bonjour, je n’ai pas d’affichage des évenements si par exemple je ne mets pas d’heure et que l’évenement est sur une journée...

    par exemple,

    2008-05-12 00:00:00 2008-05-12 00:00:00 “bla bla bla”

    ne marche pas

    alors que

    2008-05-12 00:00:00 2008-05-13 00:00:00 “bla bla bla”

    affiche l’evenement sur la journée du 12 mai

    est ce normal ??? merci

    Zil...

    • Bonjour,

      As-tu lus cet article:
      http://www.spip-contrib.net/Extensi...

      C’est la remise a jour de cet article pour spip 1.9 et plus.
      Sinon quelle version de spip utilises-tu?
      As-tu une url a proposer

      A+
      Job

    • merci pour la réponse,
      j’utilise bien agenda191, j’ai meme un agenda192 !!!

      j’ai pas d’url encore, le site n’est pas sortit ...

      et j’ai spip192
      voila,
      merci encore

      Zil...

    • bonjour,

      Je regarderais ca plus en détail ce WE. personnellement je n’utilise pas les heures pour les evenement (cad je décoche la case horaire ) donc ca me surprend. (l’inverse c’est a dire que lorsque l’on donne des heures aux evenements la contrib ne marche plus m’aurais moi surpris )

      Bon courage et a+
      Job

    • bien mais justement moi non plus je n’utilise pas les heures
      mais je ne décoche pas la case car je mets les événements avec Saisie rapide d’une liste
      sinon je ne peux pas faire autrement, j’ai un chevauchement de cadre qui m’empêche d’utiliser le formulaire, autre problème

      dans ma base mysql, il y a “non” pour la colonne heure et elles sont donc notées 00:00:00

      merci en tout cas
      Zil...

    Reply to this message

  • 6

    Bonjour, déjà bravo pour cette contrib^^et ensuite ma question, j’ai lut votre réponse au post précèdent, mais cela ne me convient pas. Comment faire pour que seul l’année en cours s’affiche ? Un exemple, dans mon cas je dois faire un calendrier pour l’académie de Toulouse, il me faut donc configurer l’affichage de septembre à Juillet et cela pour l’année 2005 et 2006, et une fois cette année passé il faut effacé les précèdent et recommencé pour l’année 2006-2007, comment faut-il faire ?

    • Comment faire pour que seul l’année en cours s’affiche ? Un exemple, dans mon cas je dois faire un calendrier pour l’académie de Toulouse, il me faut donc configurer l’affichage de septembre à Juillet et cela pour l’année 2005 et 2006,

      Donc le squelette agenda_saison_mot.html
      est ton ami. Il va sélectionner tous les évenements qui ont lieu du 1er septembre au 31 aout de l’année suivante.
      Il s’utilise comme suit :

      votresite.com/agenda.php3 ?annee=2005&annee_fin=2006&type=saison_mot

      et une fois cette année passé il faut effacé les précèdent et recommencé pour l’année 2006-2007, comment faut-il faire ?

      Vu que c’est qu’une fois dans l’année on peut faire la modif au moment opportun
      J’essayerais de donner une réponse pour résoudre ce problème de maniére plus automatique prochainement (quand j’aurais la solution)

    • Merci pour cette réponse trés rapide^^
      ça marche niquel par contre je dois vraiment être une quiche, j’arrive pas à inverser le sens d’affichage, au lieu de janvier a decembre, afficher de decembre à janvier. J’ai essayer de faire comme indiqué sur le site mais ça ne marche pas. Aprés promis je vous embete plus ^^

    • Non tu n’es pas une quiche. Mais effectivement je n’avais pas penser à cette inversion. Pour l’instant c’est impossible.

    • ok j’aurrais essayé^^ merci en tout cas

    • Bonjour,
      je n’ai pas d’affichage des évenements si par exemple je ne mets pas d’heure et que l’évenement est sur une journée...

      par exemple,

      2008-05-12 00:00:00 2008-05-12 00:00:00 “bla bla bla”

      ne marche pas

      alors que

      2008-05-12 00:00:00 2008-05-13 00:00:00 “bla bla bla”

      affiche l’evenement sur la journée du 12 mai

      est ce normal???
      merci
      Zil...

    • Bonjour,
      je n’ai pas d’affichage des évenements si par exemple je ne mets pas d’heure et que l’évenement est sur une journée...

      par exemple,

      2008-05-12 00:00:00 2008-05-12 00:00:00 “bla bla bla”

      ne marche pas

      alors que

      2008-05-12 00:00:00 2008-05-13 00:00:00 “bla bla bla”

      affiche l’evenement sur la journée du 12 mai

      est ce normal???
      merci
      Zil...

    Reply to this message

  • 2

    Bravo pour cette contrib, elle répond à mes besoins pour un futur site d’office du Tourisme. C’est l’affichage de type=annee que je pense utiliser.

    Une question, cependant, auquel je peux trouver la réponse en me creusant la tête, mais comme je débute, le moindre problème me fait perdre des heures !

    Alors voila : je veux afficher les évènement à partir de la date du jour, et sans limite de fin de période. En effet, une fois que je livre le site au client, il ne faut pas que je revienne dessus chaque année pour rechanger ma programmation de squelette.

    Il faudrait donc quelquechose du genre :
    votresite.com/agenda.php3 ?annee=actuelle&mois=actuel&type=annee

    Mais je ne connais pas la syntaxe à utiliser...

    Merci.

    • Salut,

      Si j’ai bien compris ta demande .Je te proposerais d’utiliser agenda_longueperiode.html tu le copies et tu renommes en agenda_tamodif.html
      penses à recopier aussi agenda_longueperiode_fonctions.php3 en agenda_tamodif_fonctions.php3.
      Ensuite tu modifies

      <BOUCLE_periode(ARTICLES){par date_redac}
          {agenda date_redac, periode,
        #ENV{annee}, #ENV{mois}, #ENV{jour},
        #ENV{annee_fin}, #ENV{mois_fin}, #ENV{jour_fin}}>

      par

      <BOUCLE_periode(ARTICLES){par date_redac}{age_redac<0}
          {agenda date_redac, periode,
        2006, 01, 01,
        2020, 01, 01}>

      ensuite tu appelles tonsite.com/agenda.php3?type=tamodif

      Tu as compris qu’il fallait remplacer tamodif par un nom plus joli et plus explicite. J’ai essayé vite fait en local donc cette solution est à tester( mais pense quelle est juste)
      Cette boucle sert à enregistrer tous les évenements dont la date redac est comprise entre le 1er janvier 2006 et le 1er janvier 2020 dont le date de rédaction (date_redac) n’est n’est pas encore passé (grace au critère age_redac<0)

      A+
      Job

    • Wouhaaaa... ça c’est du service après-vente de contrib cousu main et en un temps record ! Merci mille fois !

      Cordialement.

    Reply to this message

  • Bonne contrib, ressemble beaucoup à ce qu’il y a sur le wiki, plus détaillé, mais pas encore assez :/ ! Je m’explique, soucis de recalcul de la page lors du changement de mois ou de jours. Obligation de recalculer pour que cela s’affiche.

    Sinon rien à dire, ca tourne.

    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