SPIP - Contrib

[ar] [en] [es] [fr] [it]



Accueil du site > Agendas et Dates > Plugin Agenda

Plugin Agenda

lundi 14 août 2006, par Cedric Morin. Dernier ajout lundi 23 avril 2007


Le plugin agenda permet d’ajouter un objet « événement » aux articles


Introduction

Un évènement est délimité dans le temps par une date de début et une date de fin. Il est décrit par un titre, un lieu et un descriptif. Des mots clefs peuvent lui être associés.

Le principe d’associer les événements aux articles a été retenu plutôt que de leur créer un workflow indépendant.

Il y a principalement deux façons d’utiliser les événements :

  • Pour les types d’évènement nécessitant une présentation éditoriale significative (comme des spectacles par exemple), l’article est utilisé pour rédiger la présentation éditoriale (avec toute la richesse de contenu permise par l’article), et les évènements attachés à l’article pour en préciser les occurrences, les lieux associés, et éventuellement certaines précisions liées à l’occurrence. Dans ce cas, on pourra regrouper les articles dans une rubrique.
  • Pour la gestion d’un agenda évènementiel dans lequel les évènements sont décrits de façon plus succincte (pas de réel contenu éditorial), on pourra regrouper tous les évènements dans un même article, en utilisant simplement le descriptif et le lieu de chaque évènement pour apporter les précisions nécessaires.

Selon le mode d’utilisation retenu, en fonction de votre besoin fonctionnel, les squelettes et boucles utilisés seront différents. Aussi le plugin n’intègre pas de squelettes tout prêts à l’emploi, mais plutôt des exemples et des modèles qu’il convient d’enrichir ou de personnaliser.

Télécharger le plugin

- La version 0.1 pour SPIP 1.9 est disponible en téléchargement sur la zone ici
- Et le plugin Widget Calendrier se télécharge ici
- La version 0.11 pour SPIP 1.9.1 est disponibe ici
- La version 0.13 pour SPIP 1.9.2 est disponibe ici

Installation

Pour fonctionner, ce plugin nécessite le plugin Widget calendar. Il faut donc installer les deux plugins (Widget calendar + Agenda ) dans le répertoire plugins à la racine de votre site. Une fois installés, rendez-vous au menu "Configuration" à "Gestion des plugins" et cochez les cases "Activer le plugin" en regard de Agenda et Widget Calendar.

Définir des groupes de Mots Clés

Pour pouvoir utiliser des mots-clés sur les évènements, vous devez spécifier dans les groupes que ceux ci s’appliquent aux évènements de l’agenda.

Saisir un évènement

Il y a deux modes de visualisation et d’édition des évènements dans l’interface privée : sur les pages articles, et par le gadget agenda.

Dans un article vous diposez d’une nouvelle barre d’outils dépliable nommée Agenda, située entre la zone d’édition des mot-clés et celle de validation de l’article. En la dépliant vous disposez de nouveaux champs pour créer votre évènement :

  • Titre : par défaut reprend le titre de l’article, mais il est possible de le modifier ;
  • Lieu : pour indiquer le lieu de l’évènement ;
  • Horaire : case à cocher pour gérer ou non les horaires de l’évènement (cochée par défaut) ;
  • Dates : permet de saisir les dates (et heures) de début et de fin de l’évènement. Soit à l’aide de deux calendriers graphiques sous forme de tableaux, soit à l’aide de menus déroulants (jour, mois, année, heure, minute) ;
  • Mots clefs : vous pouvez associer des mots cles (dans les groupes définis pour) aux événements. Pour les groupes à choix multiples, selectionnez/deselectionnez les différents mots clefs dans la liste en utilisant la touche ’ctrl’.
  • Répétitions : un calendrier vous permet de cocher les répétitions de l’évènement. Si l’évènement dure plus d’une journée, il est présumé que c’est la date de début qui est indiquée ici pour chaque évènement. Les heures de début et de fin et la durée seront conservées pour chaque occurrence.
    Toutes les occurrences de l’évènement héritent également des mots clés de l’évènement principal
  • Ajouter : bouton pour ajouter l’évènement.

Lorsqu’un évènement est saisi, il apparait dans une liste au dessus du formulaire. Vous pouvez modifier un évènement en cliquant dessus.

(Voir également la vidéo de Ben )

En cliquant sur « Calendrier », vous pouvez basculer vers la vue agenda des évènements de l’interface privée.

Il y a maintenant deux vues agenda : l’une pour les évènements, que nous allons détailler ici, et l’autre pour l’activité éditoriale, qui est celle d’origine, et correspond à la publication des articles.

Lorsque vous arrivez sur la vue agenda depuis un article, celui-ci est dans le contexte, et son titre est rappelé au dessus du calendrier. Vous pouvez alors cliquer sur un créneau horaire pour ajouter un évènement à cet article. Vous retrouvez, à droite de l’écran, un formulaire identique à celui décrit ci-dessus.

Vous pouvez aussi cliquer sur un évènement affiché dans le calendrier pour l’éditer. Si il s’agit d’une répétition, une mention l’indique en bas avec un lien vers l’évènement original pour le modifier.

Si l’évènement que vous éditez est rattaché à un autre article, c’est ce nouvel article qui devient celui du contexte, et auquel seront rattachés les évènements ajoutés. Dans le calendrier, les évènements liés à l’article du contexte apparaissent de manière différente des autres.

Dans les squelettes

L’introduction des événements passe par une nouvelle boucle : la boucle EVENEMENTS

Balises

Elles correspondent aux champs de l’évènement :

  • #TITRE
  • #DATE_DEBUT
  • #DATE_FIN
  • #LIEU
  • #DESCRIPTIF
  • #HORAIRE qui prend la valeur oui/non, et est utile pour savoir si on doit afficher l’heure ou non dans une boucle (cf 2° exemple de boucle)
  • #ID_EVENEMENT_SOURCE : lorsque l’évènement est une répétion, retourne l’id de l’évènement qui est répété, 0 sinon

Les Critères

Vous pouvez évidemment utiliser les champs de l’évènement comme critères : id_evenement, date_debut, date_fin, lieu, descriptif, horaire et id_evenement_source. À noter que le critère date est aussi utilisable, et est dans cette boucle identique à date_debut.

Mais de nombreux autres critères sont également disponibles

  • Critères de date
    Tous les critères habituels age, age_relatif, mois_relatif, jour_relatif sont declinables sur les dates de début et de fin : age_debut, age_relatif_debut, mois_relatif_debut,, jour_relatif_debut, et de même age_fin, age_relatif_fin, mois_relatif_fin, jour_relatif_fin
    Dans ce cas, il est à noter que les comparaison sont faites par rapport à des date_debut et des date_fin.
    Ainsi si vous utilisez {mois_relatif_debut<0} comme critère de votre boucle EVENEMENTS, seront retenus les évènements dont lle mois de la date de debut est supérieur ou égal au mois de date_debut du contexte (soit #ENV{date_debut} #DATE_DEBUT de la boucle englobante)

Pour trier vos évènements par rapport à une date englobante, il convient donc de la passer en paramètre de votre inclure dans date_debut et dans date_fin

  • Critères d’arborescence
    Les évènements étant rattachés à un article, il est possible d’utiliser sur la boucle événements les critères liés à l’arborescence du site : id_article évidemment, mais aussi id_rubrique, id_secteur, branche ..., qui s’interprètent implicitement par rapport à l’article auquel est rattaché l’événement.
  • Critères de mots-clés
    Comme il est possible de rattacher des mots-clés aux évènements, les critère liés aux mots clés (id_mot, type_mot ...) sont utilisables, et s’interprètent vis à vis des mots clés rattachés aux événements. Si vous voulez trier vos évènements en fonction des mots clés rattachés aux articles associés, il vous faut passer par une boucle ARTICLES supplémentaire.
  • Critères agenda
    Le critère agenda de SPIP permettant de sélectionner des occurrences appartenant à un jour, une semaine, un mois, une période ne s’applique pas ici directement compte tenu qu’un évènement à une date de début et une date de fin, et qu’il faut en tenir compte. À défaut, il permet de sélectionner les évènements dont la date de début est dans la période considérée.
    Pour le compléter, le critère agendafull est défini, qui permet de sélectionner tous les évènements à cheval sur la période considérée (dont l’intersection avec la période n’est pas nulle). Exemples :
    {agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}

Les filtres

  • Les filtres Agenda_memo_full, Agenda_memo_evt_full et Agenda_affiche_full
    Ils sont la transposition des filtres natifs SPIP (agenda_memo et agenda_affiche) aux évènements. Ils prennent donc en plus en compte la date de fin. Exemples :
    • [(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE, 'couleur'})] mémorise un événement qui sera affiché avec la class ’couleur’ dans l’agenda, sur le créneau horaire concerné
    • [(#DATE_DEBUT|Agenda_memo_evt_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE, 'couleur'})] memorise un évènement sans notion d’heure (donc a utiliser lorsque #HORAIRE=non) qui sera affiché avec la class ’couleur’, en bas de l’agenda
    • [(#TOTAL_BOUCLE|Agenda_affiche_full{<:aucun_article:>, 'mois'})] affiche l’agenda avec les événements mémorisés par les appels aux deus filtres précédents.
  • le filtre Agenda_affdate_debut_fin affiche sous forme sympathique la date de l’événement en prenant en compte le fait que la date de debut et la date de fin sont ou non le même jour, le même mois, la même année, et en prenant en compte l’affichage de l’heure ou non. Exemple :
    [(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE})]
  • le filtre Agenda_dateplus sert a afficher une date avec ajout de temps :
    [(#DATE_FIN|Agenda_dateplus{3600,'H:i'})] affiche la date de fin augmentée de 1H (3600 secondes) au format ’H:i’ (heures:minutes, voir affdate pour les type de format)

Exemples de boucle

1° exemple

Version stable 1.9 : à noter le statut=publie dans cette boucle. En effet, vu qu’il n’y a pas de contexte d’article, tous les évènements à venir seraient publiés, même ceux attachés à un article non publié.

2° exemple

Squelettes

agenda_xx

Des adaptations à la boucle EVENEMENTS des squelettes agenda_jour, agenda_semaine, agenda_mois et agenda_periode et utilisant les criteres agendafull et les filtres associés sont inclus dans le plugin. Ainsi, lorsque le plugin est activé ?page=agenda affiche l’agenda avec tous les évènements définis au lieu de des articles.

ical-agenda

Il propose les évènements au format ical. On peux choisir de sélectionner ceux d’un article seulement en spécifiant dans l’url

Le Mini-Calendrier

Le plugin inclut un exemple de #CALENDRIER_MINI qui est une adapation à la boucle EVENEMENTS de la version proposée par James. Il est définit dans formulaires/calendrier_mini.html, et vous pouvez le personnaliser en le recopiant dans votre dossier squelettes (dans un sous répertoire formulaires/ comme dans le plugin).

Par défaut, sa syntaxe est :

#CALENDRIER_MINI{#ENV{date},'date',#SELF}

  • le premier argument est la date en cours
  • le second est le nom de la variable date dans l’url
  • le troisième est l’url de base vers laquelle le calendrier doit renvoyer.

Dans la version définie dans le plugin, le calendrier liste les articles liés à un id_article du contexte et éventuellement à un id_mot du contexte (si la balise est appelée dans une boucle MOTS par exemple.

Personnalisation du #CALENDRIER_MINI

Par défaut, la balise collecte l’id_rubrique, l’id_article et l’id_mot du contexte ou elle est appelée. Pour prendre par exemple tous les évènements d’une rubrique sans s’occuper de l’id_article ni de l’id_mot, on modifiera les critères de la BOUCLE_calendrier dans calendrier_mini.html

Un exemple d’appel a la balise est illustré dans le squelette de démo demo_calendrier_mini.html

Un formulaire d’édition des événements

Il est possible de mettre un formulaire en ligne pour permettre aux visiteurs d’éditer ou de proposer des évènements. Comme ceux-ci sont rattachés à des articles, il faut pour cela être dans une boucle article, qui permet de définir à quel article seront rattachés les évènements proposés.

Pour utiliser le formulaire, il suffit d’insérer la balise #FORMULAIRE_EDITION_EVENEMENT, dans une boucle article de votre squelette.

Si un id_evenement est spécifié dans l’url, le formulaire permettra de modifier l’événement selectionné. Sinon, si le paramètre ajout_evenement=oui est précisé dans l’url, il permet d’ajouter un évènement.

Le formulaire collecte tout seul l’id_article et l’id_evenement du contexte.

Pour faire un lien permettant d’ajouter un événement, utilisez la construction de l’url ci-dessous : <a href='[(#SELF|parametre_url{ajout_evenement,oui}|parametre_url{id_evenement,''})]'><:agenda:titre_cadre_ajouter_evenement:></a>

Pour permettre proposer des évènements, mais pas de les éditer, on peut par exemple afficher le formulaire avec un style display:none fonction de la présence de id_evenement ou non :

<div [style='(#ID_EVENEMENT|?{display:none,''})']>
#FORMULAIRE_EVENEMENT
</div>

Répondre à cet article

  • Plugin Agenda et affichage avec et sans horaires

    3 janvier 2007 11:55, par Chris

    Bonjour,

    merci pour cette contribution très pratique.

    Pour la partie publique, si je prends le fichier "agenda_mois.html" qui contient le code suivant :

    <BOUCLE_mois(EVENEMENTS)
            {agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}
    >[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE,
                    calendrier-couleur[(#ID_SECTEUR|
                            modulo{14,1})]})]</BOUCLE_mois>[(#DATE|
            Agenda_affiche_full{<:aucun_article:>, 'mois'}
    )]<//B_mois>

    Les évènements dans l’agenda affichent systématiquement l’horaire, y compris si la case à été décochée au moment de la création.
    Si on remplace "Agenda_memo_full" par "Agenda_memo_evt_full" c’est l’inverse, tous les évènements s’affichent sans horaires y compris ceux pour lequel un horaire a été spécifié.

    Par contre dans l’espace rédacteur l’affichage est correct.

    Répondre à ce message

    • Plugin Agenda et affichage avec et sans horaires 19 janvier 2007 12:37, par Chris

      J’ai trouvé un moyen qui nécessite des modifications d’une fonction.
      Je ne sais pas si il y a plus simple.

      Dans le fichier "inc/agenda_filtres.php" modifier la ligne 7
      function Agenda_memo_full($date_deb=0, $date_fin=0 , $titre='', $descriptif='', $lieu='', $url='', $cal=')
      en ajoutant à la fin , $horaire='', soit :
      function Agenda_memo_full($date_deb=0, $date_fin=0 , $titre='', $descriptif='', $lieu='', $url='', $cal='', $horaire='')

      Ensuite remplacer :

              $idatedeb = date_ical($date_deb);
              $idatefin = date_ical($date_fin);

      par

              if ($horaire=="oui") {
              $idatedeb = date_ical($date_deb);
              $idatefin = date_ical($date_fin);
              }else {
              $idatedeb = date_ical(reset(explode(" ",$date_deb))." 00:00:00");
              $idatefin = date_ical(reset(explode(" ",$date_fin))." 00:00:00");
       }

      Puis il faut modifier les fichiers
      - agenda_mois.html
      - agenda_periode.html
      - agenda_semaine.html
      - agenda_jour.html

      en ajoutant , #HORAIRE à la fin du filtre "Agenda_memo_full"

      Ci-dessous l’exemple du fichier "agenda_mois.html"

      <BOUCLE_mois(EVENEMENTS)
              {agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}
      >[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE,
                      calendrier-couleur[(#ID_SECTEUR|
                              modulo{14,1})],#HORAIRE})]</BOUCLE_mois>[(#DATE|
              Agenda_affiche_full{<:aucun_article:>, 'mois'}
      )]<//B_mois>

      Répondre à ce message

      • Plugin Agenda et affichage avec et sans horaires 18 décembre 2007 15:00, par Chris

        Malgré une mise à jour avec une dernière version sur du spip 1.9.2c, je dois toujours effectuer cette modification pour obtenir un affichage correct quand la case "horaire" est décochée à la création d’un évènement.

        Répondre à ce message

        • Plugin Agenda et affichage avec et sans horaires 18 décembre 2007 18:17, par denisb

          m’enfin (bis)*

          c’est tout expliqué dans l’article. tu utilises une balise conditionnelle dans ta boucle et le tour est joué.

          [(#HORAIRE|=={oui}|?{
          mon affichage à moi si horaire
          ,
          mon affichage à moi aussi si pas horaire
          })]

          et du coup, pas la peine de tirlipoter les fonctions (dans ce cas)

          voir Filtres de test sur spip.net

          Répondre à ce message

          • Plugin Agenda et affichage avec et sans horaires 19 décembre 2007 08:40, par Chris

            Merci, mais je n’ai pas de problème pour afficher ou pas l’horaire sur une boucle EVENEMENTS attaché à un article.

            Le souci se pose quand on affiche la page agenda par mois, semaine ou jour, proposé en standard dans le plugin. Pourquoi cela n’est pas géré par défaut alors ?

            Répondre à ce message

    Retour au début des forums

  • Bonjour à tous

    débutant en spip j’ai deux petites questions bien distinctes :

    quelqun saurait il comment (à partir de la boucle en exemple 2) ne pas afficher les évenements dont la date est passée...

    et deuxièmement, qqun saurait il comment afficher les dates, heure etc ... de l’évènement ....... dans l’article lié à l’évenement. Ca doit être assez simple, mais je ne sais pas du tout comment partir ..

    merci encore

    Répondre à ce message

    • 1ère question :

      m’enfin* c’est quand même assez bien expliqué (avec un exemple) :

      Ainsi si vous utilisez mois_relatif_debut<0 comme critère de votre boucle EVENEMENTS, seront retenus les évènements dont lle mois de la date de debut est supérieur ou égal au mois de date_debut du contexte (soit #ENVdate_debut #DATE_DEBUT de la boucle englobante)

      donc, pour toi :

      - les évènements dont la date de début est supérieure ou égale à la date du jour

       
      <BOUCLE_lesevenements(EVENEMENTS) {date_debut>=#ENV{date}} {par date} {id_article}>
       

      - les évènements dont la date de fin est inférieure ou égale à la date du jour

       
      <BOUCLE_lesevenements(EVENEMENTS) {date_fin<#ENV{date}} {par date} {id_article}>
       

      2ème question :

      m’enfin** c’est quand même assez bien expliqué (avec un exemple) :

      dans la boucle <BOUCLE_lesevenements(EVENEMENTS) {par date} {id_article}> :

      #TITRE affiche le titre de l’évènement, #LIEU affiche le lieu

      - si l’évènement se déroule sur une journée :

      [(#DATE_DEBUT|jour|=={[(#DATE_FIN|jour)]}|?{

      - on affiche le nom du jour et la date :

      le [(#DATE_DEBUT|nom_jour)] [(#DATE_DEBUT|affdate)]

      - si horaire précisé :

      [(#HORAIRE|=={oui}|?{

      - si mêmes jour et heures début et fin :

      [(#DATE_DEBUT|=={#DATE_FIN}|?{

      - on affiche l’heure et ses minutes :

      &agrave [(#DATE_DEBUT|heures)]h[(#DATE_DEBUT|minutes)]

      - sinon si jour ou heures début et fin différents on n’affiche rien :

      ,''})]

      - si jour ou heures début et fin différents :

      [(#DATE_DEBUT|!={#DATE_FIN}|?{

      - on affiche début et fin :

      de [(#DATE_DEBUT|heures)]:[(#DATE_DEBUT|minutes)] &agrave; [(#DATE_FIN|heures)]:[(#DATE_FIN|minutes)]

      - sinon si mêmes jour et heure début et fin on n’affiche rien :

      ,''})]

      - sinon si horaire non précisé on n’affiche rien :

      ,''})]

      - sinon si l’évènement se déroule sur plus d’une journée :

      , du [(#DATE_DEBUT|nom_jour)] [(#DATE_DEBUT|affdate)]

      ... etc etc


      cela dit, si tu débutes de chez débutant, un seul lien : la doc en ligne, et plus particulièrement pour ce qui nous concerne ; les dates.

      bonne lecture, bons tests.

      nota
      * et ** : à prendre à la gaston lagaffe hein ! (pas comme un grognon donneur de leçon...)

      Répondre à ce message

    Retour au début des forums

  • Agenda publique

    7 décembre 2007 15:32, par Léon

    C’est un plugin qui n’est que pour la partie privé, pour avoir un agenda dans la partie publique voici le code :

    <?php
        $calendrier_mois
    =$_GET['calendrier_mois'];
        
    $calendrier_annee=$_GET['calendrier_annee'];
    ?>


    — >
    [(#TITRE|supprimer_numero)]
    <?php
    // récupération de la langue en cours
    $lang #LANG;
    ?>
    <?php
    // START: ##### LANGUE DES MOIS ET JOURS ####
    switch ($lang) {
        case(
    'fr'):
            
    $noevent "Il n'y a aucun &eacute;v&egrave;nement &agrave; venir pour ce mois dans l'agenda";
            
    $months = array('''janvier''f&eacute;vrier''mars''avril''mai''juin''juillet''ao&ucirc;t''septembre''octobre''novembre''d&eacute;cembre');
            
    $days = array('di''lu''ma''me''je''ve''sa');
        break;
        case(
    'es'):
            
    $noevent "No hay eventos próximos para este mes en el calendario";
            
    $months = array('''enero''febrero''marzo''abril''mayo''junio''julio''agosto''septiembre''octubre''noviembre''diciembre');
            
    $days = array('do''lu''ma''mi''ju''vi''sá');
        break;
        case(
    'it'):
            
    $noevent "Non vi sono eventi imminenti per questo mese nel calendario";
            
    $months = array('''enero''febrero''marzo''abril''mayo''junio''julio''agosto''septiembre''octubre''noviembre''diciembre');
            
    $days = array('do''lu''ma''mi''ju''vi''sá');
        break;
        case(
    'de'):
            
    $noevent "Es gibt keine Events für diesen Monat im Kalender";
            
    $months = array('''enero''febrero''marzo''abril''mayo''junio''julio''agosto''septiembre''octubre''noviembre''diciembre');
            
    $days = array('do''lu''ma''mi''ju''vi''sá');
        break;
        default:
            
    $noevent "There are no upcoming events for this month in the calendar";
            
    $months = array('''january''febuary''march''april''may''june''july''august''september''october''november''december');
            
    $days = array('su''mo''tu''we''th''fr''sa');
    }
    // STOP: ##### LANGUE DES MOIS ET JOURS ####

    if ($test_mini_agenda_deja_present!=1) {
    function 
    mkdate($month$day$year)
    {
        return 
    mktime(000$month$day$year);
    }

    function 
    preparation_URL($texte_URL,$mois_URL,$annee_URL)
        {
        
    $position StrPos($texte_URL,"calendrier_mois");
        
    $texte_remplacement "calendrier_mois=".$mois_URL."&calendrier_annee=".$annee_URL;
        if (
    $position!==FALSE
            {        
            
    $texte_URL substr_replace ($texte_URL,$texte_remplacement,$position);}
            else  { 
    $presence StrPos($texte_URL,"?");
                    if (
    $presence==FALSE)
                      {
    $texte_URL $texte_URL."?".$texte_remplacement;}
                    else
                      {
    $texte_URL $texte_URL."&".$texte_remplacement;}
                  }
        return 
    $texte_URL;
        }
    }
    if(isset(
    $GLOBALS['var_nav_month'])) {
        
    $cal_day mkdate($GLOBALS['var_nav_month'], 1$GLOBALS['var_nav_year']);
    } else {
        
    $cal_day time();
    }

    $D intval(date('d'$cal_day));
    if (isset(
    $calendrier_mois)) {
    $M $calendrier_mois;
    } else {
    $M intval(date('m'$cal_day));}
    if (isset(
    $calendrier_annee)) {
    $Y $calendrier_annee;
    } else {
    $Y intval(date('Y'$cal_day));}
    $events = array();
    $test_mini_agenda_deja_present 1;
    ?>

    <?php
        $date 
    ereg_replace("^([0-9]{4})-([0-9]{2})-([0-9]{2}).*$""\\1\\2\\3"'#DATE');
        if (
    $date date("Ymd"mkdate($M$D 31$Y)) && $date date("Ymd"mkdate($M$D 31$Y))) {
            if (!isset(
    $events[$date])) {
                
    $events[$date] = array();
            }
            
    $events[$date] = array('link' => '#URL_ARTICLE''title' => '[(#TITRE|texte_script)]''logo' => "");
        }
        
    $titulo='[(#TITRE|texte_script)]';
        
    ?>

    <?php
        
        
    for($i 1$i 8$i++) {
            echo 
    '<th width="14%" class="calendar_head_mini">'.$days[$i%7].'</th>';
        }    
        
    $TempD 1;
        if(
    date('w'mkdate($M1$Y)) != 1) {
            echo 
    '</tr><tr>';
            
    $tmp '';
            while(
    date('w'mkdate($M$TempD$Y)) != 1) {
                
    $TempD--;
                
    $case '<td width="14%" valign="top" class="calendar_not_this_month">';
                
    $case .= date('j'mkdate($M$TempD$Y));
                
    $date date('Ymd'mkdate($M$TempD$Y));
                
                
    $case .= '</td>';
                
    $tmp $case.$tmp;
            }
            echo 
    $tmp;
        }
        
    $TempD 1;
        while((
    date('m'mkdate($M$TempD$Y)) == $M) || (date('w'mkdate($M$TempD$Y)) != 1)) {
            if(
    date('w'mkdate($M$TempD$Y)) == 1) {
                echo 
    '</tr><tr>';
            }
            echo 
    '<td width="6%" valign="top" class="calendar_'.(date('m'mkdate($M$TempD$Y)) != $M 'not_' '').'this_'.(date('Ymd'mkdate($M$TempD$Y)) == date('Ymd') ? 'day' 'month').'">';
            
    $date date('Ymd'mkdate($M$TempD$Y));
            if (isset(
    $events[$date])) {
                    echo 
    '<a href="'.$events[$date]['link'].'" class="agenda_mini" title="'.$events[$date]['title'].'">'date('j'mkdate($M$TempD$Y)) .'</a>';
            }
            else {
            echo 
    date('j'mkdate($M$TempD$Y));
            }        
            echo 
    '</td>';
            
    $TempD++;
        }
        
    ?>
    <?php
            $mes 
    $months [$M];
            if (
    $M==1){
                
    $calendrier_mois_moins=12;
                
    $calendrier_annee_moins=$Y-1;}
            else {
                
    $calendrier_mois_moins=$M-1;
                
    $calendrier_annee_moins=$Y;}
            if (
    $M==12){
                
    $calendrier_mois_plus=1;
                
    $calendrier_annee_plus=$Y+1;}
            else {
                
    $calendrier_mois_plus=$M+1;
                
    $calendrier_annee_plus=$Y;}
            echo 
    '<a href="'.preparation_URL('#SELF',$calendrier_mois_moins,$calendrier_annee_moins).'" title="Mois pr&eacute;c&eacute;dent">&lt;&lt;
            </a>&nbsp;&nbsp;'
    .$mes.' '.$Y.'&nbsp;&nbsp;<a href="'.preparation_URL('#SELF',$calendrier_mois_plus,$calendrier_annee_plus).'" title="Mois suivant">
            &gt;&gt;</a>'
    ;
            
    ?>
    <?php $test_boucle=0?> <?php 
                $moisE 
    = (int) '[(#DATE|mois)]';
                
    $anneeE = (int) '[(#DATE|annee)]';
                IF ((
    $M==$moisE) AND ($Y==$anneeE)) {
                    echo 
    '<tr>
                        <td align="left" valign="top" nowrap> [(#DATE|jour)/][(#DATE|mois):] </td>
                        <td width="100%" align="left" valign="top"><a href="#URL_ARTICLE">#TITRE</a><br>
                        </td>
                        </tr>'
    ;
                        
    $test_boucle++;}          
              
    ?>
    <?php
              
    IF ($test_boucle==0) {
              echo 
    "<tr>
                    <td width='100%' align='center' valign='top'>" 
    $noevent "</td>
                    </tr>"
    ;
              }
    ?>
    <?php echo $noevent?>
    /B_agenda_global>

    et le fichier CSS :

    /** * AGENDA */

    .cabecera_agenda background-color :#D7B4FF ; padding:2px ; border-bottom:1px solid #cc33cc ; color :#FFF ; font-family:Verdana, Arial, Helvetica, sans-serif ; font-size:12px ; font-weight : bolder ; text-align:center ;

    .agenda_ a font-size : 10px ; font-weight : bold ; text-decoration : none ; color : #fff ; /*color : #000 ; border : 1px solid #999 ; background-color : #eee ; padding : 2px 3px ;*/ .agenda_ a:hover text-decoration : none ; /*color : #000 ; border : 1px solid #666 ; background-color : #ddd ;*/

    .agenda_mini a display : block ; font-size : 13px ; font-weight : bold ; text-decoration : none ; color : #69C ; background-color : #D7B4FF ;

    .agenda_mini a:hover display : block ; text-decoration : none ; background-color : #ccc ;*/ /*color : #000 ; border : 1px solid #666 ; background-color : #ddd ;*/

    .calendar_head background-color :#69C ; /* #F8DFFF */ text-align : center ; font-size : 11px ; color : #630 ; font-family : Verdana, Arial, Helvatica, sans-serif ;

    .calendar_this_day background-color : #69C ; /* #F8DFFF ; */ font-weight : bold ;

    .calendar_this_month background-color : #fefefe ;

    .calendar_not_this_month background : #ececec ; color :#aaa ;

    .formbuscar_ag font-family : Verdana, Arial, Helvetica, sans-serif ; width : 128px ; font-size : 11px ; border : 1px solid #eee ; color :#99CC33 ; padding : 0px ; margin : 0px ; .botonbuscar_ag font-size : 11px ; font-family : Verdana, Arial, Helvetica, Verdana, sans-serif ; border : 1px solid #eee ; background : #fff ; color :#F60 ; margin : 0px ; padding : 0px ;

    .formbuscar_cabecera font-family : Verdana, Arial, Helvetica, Verdana, sans-serif ; width : 128px ; font-size : 9px ; border : 1px solid #CCC ; color :#9C3 ; padding : 0px ; margin : 0px ; font-weight:bold ;

    .botonbuscar_cabecera font-size : 9px ; font-family : Arial, Helvetica, Verdana, sans-serif ; color : #F60 ; margin : 0px ; padding : 0px ; border : 0px ;

    .small font-family : Verdana, Arial, Helvetica, sans-serif ; font-size : 16px ; font-color : #666 ;

    .small_plus font-family : Verdana, Arial, Helvetica, sans-serif ; font-size : 11px ; font-color : #666 ;

    .small_mini font-family : Verdana, Arial, Helvetica, sans-serif ; font-size : 11px ; font-color : #999 ; text-align : center ; font-style : normal ;

    /* ligne jour de semaine */ .calendar_head_mini background-color : #69C ; /* #DFA4DB ; */ text-align : center ; font-size : 10px ; color : #CCD8FF ; font-family : Verdana, Arial, Helvatica, sans-serif ; font-style : normal ;

    .boton_agenda A display : block ; margin : 0px ; padding : 2px ; background-color : #875282 ; color : #FFF ; text-decoration : none ; font-size : 11px ; font-weight : bold ; font-family : Verdana, Arial, Helvetica, sans-serif ;

    .boton_agenda A:hover display : block ; margin : 0px ; padding : 2px ; background-color : #CCC ; color : #000 ; text-decoration : none ; font-size : 11px ; font-weight : bold ; font-family : Verdana, Arial, Helvetica, sans-serif ;

    l’avantage est que cet agenda est multilang, simple (seulement 2 fichiers), et crée un lien sur un jour des qu’il y a un article publié à ce jour.

    Répondre à ce message

    • Agenda publique 17 décembre 2007 02:38, par Raph

      Bonjour,
      Tout dabord excusez mes questions si elles sont naives, mais je débute depuis une semaine en spip ...
      je viens de télécharger les 2 plugins, les ais activé, mais que dois je faire maintenant avec ces codes sources pour afficher un agenda ds ma partie public ? les enregistrer ds quel fichier ? quel nom ? ou le placer etc ...

      merci encore

      ps : en fait j’aimerais réaliser le site d’un théatre et veux insérer un agenda public ... héhé logique quoi ! http://theatreenrond.free.fr/spip/

      Répondre à ce message

    Retour au début des forums

  • je n’arrive pas à trouver le jeu de boucles pour afficher :

    la liste des articles du secteur qui ne contiennent pas d’évènements

    quelqu’un a t’il une idée ?

    merci

    Répondre à ce message

    • ah ça , je sais faire :

       
      <BOUCLE_article_secteur(ARTICLES) {id_secteur=#ENV{id_secteur}}>
       article #ID_ARTICLE du secteur [(#ENV{id_secteur})]<br />
       <BOUCLE_evenement_secteur(EVENEMENTS) {id_article}>
         évènement #ID_EVENEMENT<br />
         lié à l'article #ID_ARTICLE du secteur [(#ENV{id_secteur})]<br />
       </BOUCLE_evenement_secteur>
       article #ID_ARTICLE du secteur [(#ENV{id_secteur})] sans évènement lié<br />
       <//B_evenement_secteur>
      </BOUCLE_article_secteur>
       

      ... et le tour est joué.

      Répondre à ce message

      • merci, mais ce code ne semble pas fonctionner

        je cherche à afficher la liste des articles pour lesquels il n’y a pas d’évènements.

        Répondre à ce message

        • euh...

           
          <BOUCLE_article_secteur(ARTICLES) {id_secteur=#ENV{id_secteur}}>
           
             <BOUCLE_evenement_secteur(EVENEMENTS) {id_article}>
           
           
             </BOUCLE_evenement_secteur>
             article #ID_ARTICLE du secteur [(#ENV{id_secteur})] sans évènement lié<br />
             <//B_evenement_secteur>
          </BOUCLE_article_secteur>

           

          même comme ça ?

          le {id_secteur=#ENV{id_secteur}} n’est là que pour pouvoir tester à partir de l’url (barre d’adresse) en tapant : http://www.le_site/?page=test_boucle&id_secteur=83

          sinon tu peux utiliser {id_secteur=xx} directement dans ton squelette où xx est l’id du secteur où tu vas farfouiller.

          Répondre à ce message

          • ah ! je vois une autre erreur possible :

            n’aurais-tu pas collé à vide la boucle évènements ?

             
            <BOUCLE_evenement_secteur(EVENEMENTS){id_article}></BOUCLE_evenement_secteur>
             

            auquel cas, notre ami ecrire/public/compiler.php (lignes 235 à 242) n’aime pas du tout (on le comprend : fô pas gâcher) et considère la boucle comme inexistante.

            donc, indispensable de laisser un espace entre les deux balises principales de la boucle :

             
            <BOUCLE_evenement_secteur(EVENEMENTS){id_article}> </BOUCLE_evenement_secteur>
                                                              ^
                                                     ici _____|
             

            Répondre à ce message

    Retour au début des forums

  • Plugin Agenda

    6 décembre 2007 17:36, par Pascal-JPM

    Salut à tous,

    Bon, comme je me l’étais promis, je vous fait profiter de mes moments de galères et surtout des résultats positifs (en vous donnant une boucle qui fonctionne sous 1.9.2b)

    L’organisation est la suivante :
    - une rubrique gère tout l’affichage de l’agenda.
    - Dans cette rubrique, il y a des articles correspondants aux spectacles (articles SPIP avec certains champs de remplis)
    - A l’intérieur de chaque spectacle (article pour ceux qui suivent), il y a tous les évènements (ou les dates de spectacles si vous préférez)...
    - A l’intèrieur de chaque évènements (ou dates de spectacles), on attribut un ou plusieurs mots clés pour spécifier où doivent s’afficher tel ou tel spectacle...

    Voilà, pas trop compliqué et le tout est mise en forme sur 3 colonnes... Ah j’allais oublié, le détail de chaque évènement est affiché via la thickbox (en plus, et non via le plugin thickbox)

    <BOUCLE_mots_cle(MOTS){id_groupe=3}>
    <B_agenda_debut><ul id="#DESCRIPTIF">
    <!-- NOUVEAU MOT CLE (ou THEME)--------------------->
            <div class="titrerubrique"><img src="rien.gif" alt="#TITRE"  height="30" />
    <a href="#cadre" title="Revenir en haut de pag" class="haut" ><img src="#CHEMIN{adiam-images/agenda/haut.gif}" alt="Revenir en haut de page" width="22" height="20" /></a><br />
            <a href="spip.php?page=imprimer&id_mot=#ID_MOT&annee=#ENV{annee}&mois=#ENV{mois}" title="Imprimer uniquement cette rubrique" class="print">Imprimer cette rubrique  <img src="rien.gif" alt="imprimer uniquement cette rubrique" width="22" height="17" /></a>
    <BOUCLE_agenda_debut(EVENEMENTS){id_mot=#ID_MOT}{par date}{statut=publie}{agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}>
    </BOUCLE_agenda_debut>
    <B_agenda1><div class="col1"><!-- COLONNE DE GAUCHE --------------->
            <BOUCLE_agenda1(EVENEMENTS){id_mot=#ID_MOT}{par date}{statut=publie}{agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}{1/3}>               
                             <li>
                                     <p class="date">[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,""})]</p>
                                     <p>#LIEU<br />
                                     à [(#DATE_DEBUT|heures)]h[(#DATE_DEBUT|minutes)]<br />
                                     <BOUCLE_info_article1(ARTICLES){id_article}><span class="event">#TITRE<!--(Art. n°#ID_ARTICLE)--></span><br />
                                     [(#SURTITRE)<br />]
                                     [Rens. : (#SOUSTITRE)<br>]
                                     </BOUCLE_info_article1>
                                     [(#REM) gratuit sinon rien]<BOUCLE_tarif1(MOTS){id_evenement}{id_groupe=4}>[ (#TITRE)<br />]</BOUCLE_tarif1>
                                     <a href="TB_inline?height=320&width=300&inlineId=#ID_EVENEMENT" class="thickbox plus">En savoir plus</a>
                                     </p>
                             </li>
                             
                            <li id="#ID_EVENEMENT" class="hidden"><!-- #-#-- Pour l'affichage de la thickbox --#-# -->
                                    <BOUCLE_theme_1(MOTS){id_mot}><div id="#DESCRIPTIF"></BOUCLE_theme_1>
                                            <p class="date">[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,""})]</p>
                                            <p>#LIEU<br />
                                            à [(#DATE_DEBUT|heures)]h[(#DATE_DEBUT|minutes)]<br />
                                            <BOUCLE_info_article1_box(ARTICLES){id_article}><span class="event">#TITRE</span><br />
                                            [(#SURTITRE)<br />]
                                            [(#CHAPO)<br />]
                                            [(#TEXTE)]</p>
                                            <p>[<strong>Renseignements : </strong>(#SOUSTITRE)<br>]<br />
                                            [<span class="event">Tarifs :</span><br />
                                            (#PS)]</p>
                                            </BOUCLE_info_article1_box>
                                    </div>
                            </li>
                             
                    </BOUCLE_agenda1>
            </div></B_agenda1>
            <B_agenda2><div class="col2"><!-- COLONNE CENTRALE ------------->
            <BOUCLE_agenda2(EVENEMENTS){id_mot=#ID_MOT}{par date}{statut=publie}{agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}{2/3}>
                            <li>
                                     <p class="date">[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,""})]</p>
                                     <p>#LIEU<br />
                                     à [(#DATE_DEBUT|heures)]h[(#DATE_DEBUT|minutes)]<br />
                                     <BOUCLE_info_article2(ARTICLES){id_article}><span class="event">#TITRE<!-- (Art. n°#ID_ARTICLE)--></span><br />
                                     [(#SURTITRE)<br />]
                                     [Rens. : (#SOUSTITRE)<br>]
                                     </BOUCLE_info_article2>
                                     [(#REM) gratuit sinon rien]<BOUCLE_tarif2(MOTS){id_evenement}{id_groupe=4}>[ (#TITRE)<br />]</BOUCLE_tarif2>
                                     <a href="TB_inline?height=320&width=300&inlineId=#ID_EVENEMENT" class="thickbox plus">En savoir plus</a>
                                     </p>
                             </li>
                             
                            <li id="#ID_EVENEMENT" class="hidden"><!-- #-#- Pour l'affichage de la thickbox -#-# -->
                                    <BOUCLE_theme_2(MOTS){id_mot}><div id="#DESCRIPTIF"></BOUCLE_theme_2>
                                            <p class="date">[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,""})]</p>
                                            <p>#LIEU<br />
                                            à [(#DATE_DEBUT|heures)]h[(#DATE_DEBUT|minutes)]<br />
                                            <BOUCLE_info_article2_box(ARTICLES){id_article}><span class="event">#TITRE</span><br />
                                            [(#SURTITRE)<br />]
                                            [(#CHAPO)<br />]
                                            [(#TEXTE)]</p>
                                            <p>[<strong>Renseignements : </strong>(#SOUSTITRE)<br>]<br />
                                            [<span class="event">Tarifs :</span><br />
                                            (#PS)]</p>
                                            </BOUCLE_info_article2_box>
                                    </div>
                            </li>
                             
                    </BOUCLE_agenda2>
            </div></B_agenda2>
            <B_agenda3><div class="col3"><!-- COLONNE DE DROITE ------------>
            <BOUCLE_agenda3(EVENEMENTS){id_mot=#ID_MOT}{par date}{statut=publie}{agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}{3/3}>
                            <li>
                                     <p class="date">[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,""})]</p>
                                     <p>#LIEU<br />
                                     à [(#DATE_DEBUT|heures)]h[(#DATE_DEBUT|minutes)]<br />
                                     <BOUCLE_info_article3(ARTICLES){id_article}><span class="event">#TITRE<!-- (Art. n°#ID_ARTICLE)--></span><br />
                                     [(#SURTITRE)<br />]
                                     [Rens. : (#SOUSTITRE)<br>]
                                     </BOUCLE_info_article3>
                                     [(#REM) gratuit sinon rien]<BOUCLE_tarif3(MOTS){id_evenement}{id_groupe=4}>[ (#TITRE)<br />]</BOUCLE_tarif3>
                                     <a href="TB_inline?height=320&width=300&inlineId=#ID_EVENEMENT" class="thickbox plus">En savoir plus</a>
                                     </p>
                             </li>
                             
                            <li id="#ID_EVENEMENT" class="hidden"><!-- #-#- Pour l'affichage de la thickbox -#-# -->
                                    <BOUCLE_theme_3(MOTS){id_mot}><div id="#DESCRIPTIF"></BOUCLE_theme_3>
                                            <p class="date">[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,""})]</p>
                                            <p>#LIEU<br />
                                            à [(#DATE_DEBUT|heures)]h[(#DATE_DEBUT|minutes)]<br />
                                            <BOUCLE_info_article3_box(ARTICLES){id_article}><span class="event">#TITRE</span><br />
                                            [(#SURTITRE)<br />]
                                            [(#CHAPO)<br />]
                                            [(#TEXTE)]</p>
                                            <p>[<strong>Renseignements : </strong>(#SOUSTITRE)<br>]<br />
                                            [<span class="event">Tarifs :</span><br />
                                            (#PS)]</p>
                                            </BOUCLE_info_article3_box>
                                    </div>
                            </li>
                             
                    </BOUCLE_agenda3>
            </div></B_agenda3>
    <BOUCLE_agenda_fin(EVENEMENTS){id_mot=#ID_MOT}{par date}{statut=publie}{agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}>
    </BOUCLE_agenda_fin>
    </ul></B_agenda_fin>
    </BOUCLE_mots_cle>       

    Pour les curieux et ceux qui veulent voir ce que cela donne en ligne c’est ici : www.adiam-creuse.com

    Pendant que j’y suis, et suite à la remontée d’une utilisatrice de cet agenda (partie privée), lorsqu’elle saisissait une nouvelle date d’évènements, il y avait un menu déroulant pour les années allant de 2003 à 2009...