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.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |