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.
Discussions par date d’activité
4 discussions
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...
Répondre à ce message
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...
Répondre à ce message
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
par
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.
Répondre à ce 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.
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 :
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 : |