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

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

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.

Discussion

Aucune discussion

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