< Ajouter un calendrier dans SPIP >
Une question souvent posée dans le forum de SPIP : comment inclure dans ses pages un petit calendrier du mois courrant dont les jours pointent vers une page qui en fait la liste.
Le mettre en cache
C’est pas super méchant mais le calcul du calendrier, si on veut que seuls les jours contenant un article publié soient actifs, nécessite tout de même requête mySQL et calculs divers. Ce n’est certainement pas un calcul à effectuer à chaque page, aussi nous avons procédé de la façon suivante pour que le calcul de notre calendrier soit inclut dans les pages mises en cache.
La méthode expliquée ici tire entièrement partie du cache de SPIP et ainsi soulage votre serveur d’un calcul intensif susceptible de lui nuire.
Installation
On crée une fonction calendrier() dans mes_fonctions.php3. (Le fichier mes_fonctions.php3 est le fichier placé à la racine de spip qui contient toutes vos fonctions perso. Créez le si le votre n’existe pas).
Ensuite, vous modifiez si besoin est les quelques variables du début de la fonction calendrier(). Elles sont expliquées dans la fonction.
Utilisation
Pour inclure votre calendrier dans une page, c’est très simple. Ecrivez à l’endroit voulu de votre skelette :
[(#URL_SITE_SPIP|calendrier)]
La balise #URL_SITE_SPIP ne sert à rien d’autre que de nous permettre d’appeler la fonction calendrier() par l’intermédiaire d’un appel de filtre (merci Fil pour cette idée brillante ! ! !).
L’avantage (par rapport à un include() php par exemple) est que le résultat de la fonction calendrier() est inclu directement dans la page de cache de votre article / rubrique / etc ...
Un peu de style
Pour habiller votre calendrier aux couleurs de votre site, utilisez les styles suivants :
.calendrier-semaine // les cases L M M J V S D
.today // la case d'aujourd'hui
.weekday // case d'un jour de la semaine
.weekendday // case de week-end
.activeday // case active en semaine
.activeweekendday // case active en week-end
.outday // case des jours des autres mois
Utiliser un INCLUDE façon SPIP
Si vous suivez cette méthode et que votre marqueur [(#URL_SITE_SPIP)] est inclu directement dans le skelette de votre article, on peut avoir le problème suivant : si le délais de votre article est de 24h ou plus, le jour d’aujourd’hui aura souvent du retard dans votre calendrier.
C’est embettant, mais ce n’est certainement pas une raison pour réduire le délais de vos pages article.
Le mieux est de procèder à un INCLUDE :
- dans vos skelettes d’articles / rubriques / etc ... vous écrivez <INCLURE(calendrier.php3)> à la place du calendrier.
- vous créez la page calendrier.php3 suivante, comme vous le feriez avec n’importe quel nouveau skelette de SPIP : $fond = "calendrier";
$delais = 3600;
include ("inc-public.php3"); - vous créez le skelette calendrier.html suivant : [(#URL_SITE_SPIP|calendrier)]
Et voilà, votre calendrier est un fichier unique partagé par toutes les pages de votre site, et quel que soit les délais de vos différentes pages, sont délai à lui est d’une heure.
La page listant tous les articles de la journée spécifiée
Le problème est que spécifier un jour j n’est pas un critère de boucle, on est donc embêté. La solution un peu sale est de sortir tous les articles et de filtrer leur date :
<?
$date_article='#DATE';
$date_article=substr($date_article, 0, 10);
if ($date_article==$cal_date)
{ ?>
<div class="boiteColDroite" style="min-height:86px;">
[<a href="#URL_ARTICLE">(#LOGO_ARTICLE_RUBRIQUE|left)</a>]
<div style="margin-left:90px;">
<strong>#TITRE</strong>
#INTRODUCTION
<a href="#URL_ARTICLE">[lire]</a><br />
[(#DATE|nom_jour)] [(#DATE|jour)] [(#DATE|nom_mois)] [(#DATE|annee)]
</div>
</div>
<? $cont=1; } ?>
</BOUCLE_articles>
<? if (!$cont) {
echo "Aucun résultat pour cette date";
} ?>
Si jamais vous voyez quelque chose de plus propre, le forum vous est ouvert ;-)
Voici mon skelette d’agenda dans son entier.
26 commentaires
ben j’ai passé 3 heures sur la question cet après-midi, le probleme, c que je vois pas où mettre ces calendriers, et ça conflicte pas mal avec le cache ... c’est pourtant bien la suite logique du truc, je suis bien d’accord avec toi.
J’ai créé le calendrier, il fonctionne, mais lorsque je clic sur une des dates, j’arrive sur une erreur : "Impossible de trouver la page Il est possible que la page recherchée ait été supprimée, que son nom ait changé ou qu’elle ne soit pas disponible pour le moment. "
Que faire ?
Le problème a été réglé ! Je n’ai pas renommé le fichier.php3 ! Mais maintenant, un autre soucis : le tableau s’affiche, mais lq je clic sur une des dates marquées, j’obtiens TOUJOURS "Aucun résultat pour cette date" alors que des articles existent bel et bien. Ou est le pb ? ?
Tu pourrais me donner l’adresse de la page ayant le calendrier ?
Parce que comme ça dans le vide, je peux pas voir le problème.
Bonjour et bravo pour cette idée.
Mais comment limiter la sélection des articles à certaines rubriques ? J’ai essayer de modifier la fonction calendrier à ce niveau FROM spip_articles WHERE statut=’publie’ AND `date` like ’".date("Y-m-")."%’" ; par FROM spip_articles WHERE statut=’publie’ AND id_rubrique=’1’ AND `date` like ’".date("Y-m-")."%’" ;
Pas de différence.
Existe t il une solution ?
T’es certain que tu n’avais pas une problème de cache ? Parce qu’à mon avis, tu as ajouté exactement ce qu’il fallait, et je m’étonne que le résultat soit le même.
j’ai tout vidé, éteint l’ordi, relancé et toujours rien. Le site est une version de tests en tous genres, et l’idée serait par exemple de faire une rubrique expositions, et donc d’avoir le calendrier des expos.
Si tu cliques sur le 7 du mois il y a les articles de la rubrique 5 (photos) et 1.
Ca m’embête, car l’idée du calendrier est vraiment super.
SPIP possède son propre système de cache, donc le fait que tu aies eteinds TON ordi ne peut avoir rien fait, si la page n’a pas été recalculée sur le serveur. Tu as un bouton "recalculer cette page" en bas de chaque page si tu as activé le "cookie de connexion" sur la première page de back-office de SPIP.
Si c’est pas ça, alors je vois pas désolé. :-\
Eh bien j’ai trouvé, l’idée de départ est la bonne, le code est correct, et tout les caches sont vides. Il suffit tout simplement de préciser dans le squelette d’affichage du résultat la rubrique à garder, donc 1 pour l’exemple.
Encore merci pour l’aide.
Hello,
j’arrive un peu tard mais j’aimerai savoir si tu as trouvé une solution, je voudrais afficher des pages d’archives mois par mois avec le calendrier du mois en question et je me demande comment faire. Et surtout merci et bravo pour le calendrier.
Je suis en train de passer le site http://www.unregardmoderne.com sous spip
Bonjour, merci pour le script du calendrier que j’adapte en ce moment
J’ai modifier la variable query pour ne pas faire apparaitre les articles post-datés
FROM spip_articles
WHERE statut='publie'
AND `date` like '".date("Y-m-")."%'
AND `date` < now()
";
Bonjour,
Super ce calendrier. Je souhaiterais offrir la possibilité d’accéder aux mois précédents (et revenir au mois actuel). Quelqu’un sait comment s’y prendre ? ? ?
Merci d’avance.
Bonjour, j’ai adpater ce code pour mon site en lui ajoutant la possibilité de naviguer dans les mois . Pour l’instant je le teste. Je décris comment j’ai fait le plus rapidemant possible.
Merci à Stéphane qui a donné l’idée originale.
le calendrier sur la page d’accueil
la page "agenda"
le cache est bien utilisé, tout fonctionne apparement bien mais le code php ralenti pas mal le site ... il faut le savoir.
l’article en question est ici : http://olivier.glagla.net/spip/article.php3 ?id_article=102
désolé si online rame :-(.
Bonjour,
J’ai le même problème que Bob. En fait je n’arrive pas à faire fonctionner les balises et variables SPIP dans le fichier ".php3" où ca doit m’afficher le résultat des articles trouvés pour une date. Et ca me mets donc tjs "Aucun résultat pour cette date" car la page ne reconnait po la balise #DATE. Est ce que quelqu’un saurais resoudre mon probleme ?
En voici une autre pour permettre de sélectionner toutes les rubriques associées à une rubrique principale X
{
$lesfils = array();
$result = spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent IN ($generation)");
while ($row = spip_fetch_array($result))
$lesfils[] = $row['id_rubrique'];
return join(" OR id_rubrique=",$lesfils);} //seul cette partie de la fonction a été modifiée
$rubriques_associe=generation (3); // Ici la rubrique principale est la numéro 3
$query = "SELECT substring(`date`,9,2) as jour
FROM spip_articles
WHERE statut='publie'
AND id_rubrique=".$rubriques_associe."
AND `date` like '".date("Y-m-")."%'";
Exemple :
J’ai une rubrique mère numéro 3 qui à comme sous-rubriques 4,5,6,7 et 11
J’obtiens ainsi une requête
SELECT substring(`date`,9,2) as jour FROM spip_articles WHERE statut='publie' AND id_rubrique=4 OR id_rubrique=5 OR id_rubrique=6 OR id_rubrique=7 OR id_rubrique=11 AND `date` like '2003-05-%'
C’est du bidouillage donc pas très propre mais çà marche bel et bien. C’est une base pour utiliser plusieurs calendriers dans le meme site et selon différentes rubriques.
Any question
Bonjour à vous tous,
Voilà j’ai un petit soucis, j’ai installé le calendrier sur mon site, il marche :-) mais j’aimerai qu’il affiche que les resultats d’une rubrique bien determiné comment faire ?
Pour info : http://www.illegal-party.com/rubrique.php3 ?id_rubrique=9
Donc c’est la rubrique Sud Est et j’aimerai avoir dedans que les infos du Sud Est c’est à dire la rubrique 9
C’est pour ensuite faire la même chose avec : Sud Ouest, Paris, Grand Est et Grand Ouest....
Pour info la rubrique principale agenda est la numéro 2.
Merci à vous si vous pouvez m’aider.
Bonjour ....
Comment faire pour ajouter en plus du calendrier du mois, le calendrier du mois suivant ? ? ?
J’ai copié la fonction calendrier et je l’ai collé endessous et renommé calendrierplus1 ...
L’affichage me montre bien le calendrier normal plus le calendrierplus1 mais sur plus1 il y a pas les liens du bon mois ... comment faire ?
Merci de votre aide
Christophe
En remplaçant id_rubrique par id_secteur on obtient évidemment tous les articles associés à la rubrique des agendas (ou bien id_parent idoine suivant le niveau d’où on veut partit). Je sais, c"est trivial comme ça mais ça m’a pris une heure avant d’y penser donc bon... :-)
Bonjour, moi tout marche nickel, mais j’aimerai que le calendrier fonctionne avec les articles ET les breves, carj’ecrit plus souvent des breves.
Est ce possible ? ca doit pas etre dur :)
mici et bo travail
Bon, j’ai trouvé :
dans mes_fonctions.php3
rajouté apres : // on remplit $jActif[] de 1 pour chaque jour du mois courrant ayant un article publié $query = "SELECT substring(`date`,9,2) as jour FROM spip_articles WHERE statut=’publie’ AND `date` like ’".date("Y-m-")."%’" ; $result = spip_query($query) ; while($row = mysql_fetch_array($result)) $jActif[intval($row[’jour’])] = 1 ;
ca :
$query1 = "SELECT substring(`date_heure`,9,2) as jour FROM spip_breves WHERE statut=’publie’ AND `date_heure` like ’".date("Y-m-")."%’" ; $result1 = spip_query($query1) ; while($row = mysql_fetch_array($result1)) $jActif[intval($row[’jour’])] = 1 ;
Pareil que Bob si vous pouvez m’aider sa serais bien sympat je trouve pas d’ou sa peut venir
bonjour
j’ai installe l’agenda et ça n’a marché qu’1 fois ! il affiche bien les articles du jour donné mais ensuite jai tjrs le message : " Aucun résultat pour cette date " alors que la premeire fois il yavait bien les articles affichés ! jai vidé et revidé le cache tjrs rien une solution ? ? ? merci Larby
Bonjour,
Et pour les gens qui utilisent la date de publication antérieure, sauriez vous quel est le code à taper ? ? Merci gaotoncar@yahoo.com
Bonjour,
J’ai mis le calendrier et il fonctionne. Le calendrier de spip par défaut me semble un compliqué à mon niveau alors que celui-ci est bref et petit. En revanche, si je sais comment afficher les articles et les brèves dans la page prévue à cet effet, je ne sais pas comment mettre en évidence jour contenant des brèves ( par défaut, seul les jours contenants des articles sont en évidence dants le calendrier ).
Si quelqu’un a une idée ?
merci.

(re) effectivement ça marche, je confirme, a ton avis serait il compliqué de rajouté les mois, c’est à dire de passer du mois de novembre au mois de décembre ou au mois de septembre je sais j’abuse, mais ce serait super pratique aussi.
Mais sinon bravo encore, tu permet d’avoir une autre façon de naviguer
@+