[spip-dev] Calendrier...spip ou...

j'ai tracé le problème... coton.

Pour que http_calendrier_init fonctionne correctement avec les
évènements à cheval plusieurs jours, il faut que dans le tableau $evt,
l'évènement en question soit répété chaque jour où il s'applique.
C'est ce qui se passe en tout cas pour les messages dans l'espace privé.

Ceci oblige dans le cas général à un traitement que je n'ai pas réussi à
maîtriser...
Il faut garder en mémoire les évènements répétitifs et les intercaler,
mais en tenant compte des dates de fin de période demandée.. Si qqun a
une idée je prends.

MJ

Dans ton filtre Xagenda_memo, il faut que tu fasse une boucle pour $i allant de date_debut a date_fin pour faire $agenda[$cal][(date_anneemoisjour($i))][] = array(...)

C'est fait et ca donne le code ci-dessous (un peu plus compliqué à cause
des additions et conversions de date)
MAIS
si un petit malin met une date de fin très très postérieure à la date de
début, il y a un risque non ?
D'autre part, étant donné la complexité du filtre (X)agenda_memo, et la
difficulté d'écrire la doc, peut-on trouver une solution en coupant en
deux avec
- COLLECT_AGENDA_MEMO (partie récupération)
- AGENDA_MEMO (partie sortie)

avec l'array $agenda en GLOBAL plutôt que STATIC, c'est pensable ou
dangereux ? à ce moment là je me sens capable d'écrire la documentation
sur le spikini.

MJ

> j'ai tracé le problème... coton.
>
> Pour que http_calendrier_init fonctionne correctement avec les
> évènements à cheval plusieurs jours, il faut que dans le tableau $evt,
> l'évènement en question soit répété chaque jour où il s'applique.
> C'est ce qui se passe en tout cas pour les messages dans l'espace
> privé.
>
> Ceci oblige dans le cas général à un traitement que je n'ai pas
> réussi à
> maîtriser...
> Il faut garder en mémoire les évènements répétitifs et les
> intercaler,
> mais en tenant compte des dates de fin de période demandée.. Si qqun a
> une idée je prends.

Dans ton filtre Xagenda_memo, il faut que tu fasse une boucle pour $i
allant de date_debut a date_fin pour faire $agenda[$cal]
[(date_anneemoisjour($i))] = array(...)

------ Le Code -----
<?
// A chaque appel de moins 5 arguments,cette fonction memorise un
evenement
// decrit par une date, un descriptif, un titre et une URL.
// A l'appel avec 6 arguments, l'ensemble sera mis en page selon le type
// indique par le 6e argument et la couleur indiquee par le 5e
// (nombre indexant le tableau $contraste de inc_calendrier -- a
CSS-iser)
// Ce 5e argument sert aussi d'index de memorisation
// pour avoir plusieurs calendriers dans une meme page sans
interferences

function Xagenda_memo($date_fin='',$date_deb='', $descriptif='',
$titre='', $url='', $cal='', $type='')
{
  static $agenda = array();
  if (!$type)
    {

    if($date_deb=="") $date_deb=$date_fin;
    
    if($date_fin < $date_deb) {
        $k=$date_deb;
        $date_deb=$date_fin;
        $date_fin=$k;
        }
    
        $date_courante=date_anneemoisjour($date_deb);
        $start=strtotime($date_deb);
        $end=strtotime($date_fin);
        $a = array(
                        'CATEGORIES' => $cal,
                        'DTSTART' => date_ical($date_deb),
                        'DTEND' => date_ical($date_fin),
                        'DESCRIPTION' => texte_script($descriptif),
                        'SUMMARY' => texte_script($titre),
                        'URL' => $url);
        
        for($i=$start;$i<=$end;$i+=3600*24)
                $agenda[$cal][date("Ymd",$i)]= $a;
                        
    // signifier qu'il y a qqch
    return " ";
  } else {
  
    if ($type != 'periode')
      $evt = array('', $agenda[$cal]);
    else
      {
        $d = array_keys($agenda[$cal]);
        $mindate = min($d);
        $min = substr($mindate,6,2);
        $max = $min + ((strtotime(max($d)) - strtotime($mindate)) /
(3600 * 24));
        if ($max < 31) $max = 0;
        $evt = array('', $agenda[$cal], $min, $max);
        $type = 'mois';
      }
   # print_r($evt);die();
    include('ecrire/inc_calendrier.php');
    return http_calendrier_init('', $type, '', '', '', $evt);
    }

}

C'est fait et ca donne le code ci-dessous (un peu plus compliqué à cause
des additions et conversions de date)

donc tout marche maintenant ?

MAIS
si un petit malin met une date de fin très très postérieure à la date de
début, il y a un risque non ?

tu peux tester puis ignorer quand la période parait invraisemblable.

D'autre part, étant donné la complexité du filtre (X)agenda_memo, et la
difficulté d'écrire la doc, peut-on trouver une solution en coupant en
deux avec
- COLLECT_AGENDA_MEMO (partie récupération)
- AGENDA_MEMO (partie sortie)

avec l'array $agenda en GLOBAL plutôt que STATIC, c'est pensable ou
dangereux ?

Une globale est toujours dangereuse car au moment de l'inclusion avec une autre extension il y a un risque d'écrasément dont on n'est pas prévénu. En revanche, tu peux remplacer la partie "else" de ta fonction par l'appel d'une autre fonction prenant en argument la variable statique,
et ayant pour corps la partie else de la version actuelle.

à ce moment là je me sens capable d'écrire la documentation
sur le spikini.

Go on !

Déesse A.

>
> C'est fait et ca donne le code ci-dessous (un peu plus compliqué à
> cause
> des additions et conversions de date)

donc tout marche maintenant ?

Reste un cas insoluble....
soit un évènement qui court du jour J au jour J+n;
si je fais une boucle agenda aux environs du jour J+k, (k<n), jamais
l'évènement ne sera retrouvé... je ne vois pas de soluce car ca se passe
dans la boucle. Il faudrait simplement prévoir dans les fichiers de démo
"mois, jour,semaine" des boucles plus complexes je suppose ? Sinon ca
devient carrément de la divination... (pour les messages, dans
ecrire/calendrier.php3, ils font carrément une réinterogation de la base
!)

> MAIS
> si un petit malin met une date de fin très très postérieure à la
> date de
> début, il y a un risque non ?

tu peux tester puis ignorer quand la période parait invraisemblable.

ok,> 1 an ca parait pas mal ? un tableau de 365 c'est pas la mer a
boire.

> D'autre part, étant donné la complexité du filtre (X)agenda_memo,
> et la
> difficulté d'écrire la doc, peut-on trouver une solution en coupant en
> deux avec
> - COLLECT_AGENDA_MEMO (partie récupération)
> - AGENDA_MEMO (partie sortie)
>
> avec l'array $agenda en GLOBAL plutôt que STATIC, c'est pensable ou
> dangereux ?

Une globale est toujours dangereuse car au moment de l'inclusion avec
une autre extension il y a un risque d'écrasément dont on n'est pas
prévénu. En revanche, tu peux remplacer la partie "else" de ta
fonction par l'appel d'une autre fonction prenant en argument la
variable statique,
et ayant pour corps la partie else de la version actuelle.

yes mais ca ca change rien pour le webmaster: il a toujours un seul
filre AGENDA_MEMO atrocement compliqué. Si je déclare deux fois la même
variable static, dans deux fonctions (filtres) séparés ca ne marchera
pas je suppose ?

> à ce moment là je me sens capable d'écrire la documentation
> sur le spikini.
>

bon pas ce soir, mais ca va venir...

Reste un cas insoluble....
soit un évènement qui court du jour J au jour J+n;
si je fais une boucle agenda aux environs du jour J+k, (k<n), jamais
l'évènement ne sera retrouvé...

Le critere agenda ne s'applique que sur un seule date, donc sa sémantique est inévitablement "l'événement COMMENCE-T-IL ce jour-là". Dans ton cas, il serait plus cohérent d'écrire un nouveau critère s'appliquant à 2 champs de dates et testant l'inclusion.

tu peux tester puis ignorer quand la période parait invraisemblable.

ok,> 1 an ca parait pas mal ? un tableau de 365 c'est pas la mer a
boire.

1 an et 1 jour, comme les objets trouvés :slight_smile:

pour le webmaster: il a toujours un seul
filre AGENDA_MEMO atrocement compliqué.

De toutes façons il appelle http_calendrier_init qui dépasse les 1500 lignes, alors couper en 2 cette fonction de meme pas 100 lignes c'est une goutte d'eau.

Si je déclare deux fois la même
variable static, dans deux fonctions (filtres) séparés ca ne marchera
pas je suppose ?

quand ça marche ça s'appelle une variable globale. Si ce que tu veux ce sont 2 fonctions partageant une variable statique, alors là ça s'appelle un objet. Mais je n'ai jamais été convaincu du supplément de clarté que ça amène.

Sinon, à noter que le commentaire sur les CSS est obsolètes: ça utilise bien une CSS à présent.

Déesse A.

Je viens de trouver le problème qui m'empèchait d'afficher les articles dans
l'agenda.
En effet j'utilisaisdans mon dossier squelettes le fichier local.php3
<?php
   $GLOBALS['i18n_spip_fr']['texte_date_publication_anterieure'] = 'DATE DE
L\'EVENEMENT';
   $GLOBALS['i18n_spip_fr'] ['texte_date_publication_anterieure_nonaffichee'] =
'L\'article n \'a pas de date d\'&eacute;v&eacute;nement.';
?>
J'avais trouvé ca dans spip-contrib afin de remplacer dans la partie admin de
spip le texte date_publication_anterieure par date d'évenement qui est un peu
plus parlant dans le cas de mon site pour les rédacteurs

Une fois que j'ai supprimé ces 2 lignes l'agenda refonctionnait

Merci a DEESSE A

Matthieu

Sinon, à noter que le commentaire sur les CSS est obsolètes: ça
utilise bien une CSS à présent.

Déesse A.

En parlant de css ne serait-il pas intéressant que les couleurs de fond des
cases sont modifiables dans le css plutot que d'etre écrit en dur.

Si, bien sûr mais ce n'est pas si évident: ce code est utilisé aussi par l'espace privé qui fixe les couleurs de fond et de tracé dynamiquement (par les cookies authentifiés), ce qui n'est pas possible pour les visiteurs. Il faudrait trouver une implémentation mixte.

Déesse A.

En fait, pour certains fonds c'était facile, c'est fait. Mais il en reste.

> Reste un cas insoluble....
> soit un évènement qui court du jour J au jour J+n;
> si je fais une boucle agenda aux environs du jour J+k, (k<n), jamais
> l'évènement ne sera retrouvé...

Le critere agenda ne s'applique que sur un seule date, donc sa
sémantique est inévitablement "l'événement COMMENCE-T-IL ce jour-là".
Dans ton cas, il serait plus cohérent d'écrire un nouveau critère
s'appliquant à 2 champs de dates et testant l'inclusion.

Fait: critere_Xagenda

>> tu peux tester puis ignorer quand la période parait invraisemblable.
>>
> ok,> 1 an ca parait pas mal ? un tableau de 365 c'est pas la mer a
> boire.

1 an et 1 jour, comme les objets trouvés :slight_smile:

Fait

> pour le webmaster: il a toujours un seul
> filre AGENDA_MEMO atrocement compliqué.

De toutes façons il appelle http_calendrier_init qui dépasse les 1500
lignes, alors couper en 2 cette fonction de meme pas 100 lignes c'est
une goutte d'eau.

je me suis mal fait comprendre.
Pour le PROGRAMMEUR, on se fout un peu de la longueur de la fonction.
Pour le Webmaster (le type qui écrit la boucle spip) le fait d'appeler
deux fois le meme filtre, une fois pour stocker les évènements, une fois
pour les restituer, c'est incompréhensible. D'où ma demande de créer
deux filtres
1) un filtre qui stocke les évènements (STOCKE_AGENDA_MEMO) que l'on
appelle dans la boucle
2) un filtre qui restitue le calendrier (AGENDA_MEMO)

Mais bien sur il faut une globale.

Sinon, à noter que le commentaire sur les CSS est obsolètes: ça
utilise bien une CSS à présent.

??? je savais !

Déesse A.

Comment faire maintenant pour intégrer le code ? il faut que je le
"commit" qq part, ou alors que je l'envoie ?
Merci

et alors, SuperMerci pour le debugger, ca fait gagner un temps de
développement monstrueux.
MJ

Pour le Webmaster (le type qui écrit la boucle spip) le fait d'appeler
deux fois le meme filtre, une fois pour stocker les évènements, une fois
pour les restituer, c'est incompréhensible. D'où ma demande de créer
deux filtres
1) un filtre qui stocke les évènements (STOCKE_AGENDA_MEMO) que l'on
appelle dans la boucle
2) un filtre qui restitue le calendrier (AGENDA_MEMO)

Mais bien sur il faut une globale.

Je préfère une difficulté de compréhension à un danger.

Sinon, à noter que le commentaire sur les CSS est obsolètes: ça
utilise bien une CSS à présent.

??? je savais !

Alors pourquoi tu le laisses dans ton code ?

Comment faire maintenant pour intégrer le code ? il faut que je le
"commit" qq part, ou alors que je l'envoie ?

On en fait un contrib sur spip-contrib pour le moment. Et ce serait bien de trouver des noms plus évocateurs.

Déesse A.

Bon voila, tous les fonds du calendrier public devraient etre paramétrables depuis la css, MAIS:

- ceux du calendrier privé restent gouvernés par les cookies;
- et encore pas tous, donc si on change la CSS commune il y aura parfois des interférences;
- si on est authentifié, les cookies primeront sur la CSS meme pour le calendrier public.

Donc ce n'est pas encore satisfaisant: il faut en fait dynamiser calendrier.css pour avoir un comportement homogène dans les 2 situations et du coup proposer aussi le chgt de couleur dans le calendrier public. En attendant, le plus raisonnable est de dupliquer la css et faire des tests hors authentification.

Déesse A.

Auriez-vous un exemple de mise en oeuvre du filtre agenda_memo dans une
boucle ?

bah oui, dans les squelette jour mois et semaine.

Selon "Déesse A." <esj@rezo.net>:

> Auriez-vous un exemple de mise en oeuvre du filtre agenda_memo dans
> une
> boucle ?

bah oui, dans les squelette jour mois et semaine.

et aussi sur http://spip.blog.ouvaton.org/ (l'agenda en haut à gauche)

Très pratique, mais j'ai eu un peu de mal à utiliser les #ENV mais bon... :wink:

Squelettes et filtre supplémentaire dispo en test sur la zone :

Amicalement,

Donc on garde le filtre agenda_memo avec son "double appel" et j'ai
rajouté dans http://www.spip-contrib.net/spikini/FiltreAgendaMemo
un essai de documenation plus "pas-à-pas".
MJ

Tu trouveras ca dans ton spip 1-8-2, dist/jour.html, dist/mois.html,
distsemaine.html.
J'ai essayé de rédiger un petit "tutorial" à la fin de ca:
http://www.spip-contrib.net/spikini/FiltreAgendaMemo

dis-moi si ca aide.
de toute façon tout cela ne marche que pour des événements qui ont un
début, mais sans s'occuper de la fin.
J'ai une contrib en cours pour faire la même chose avec des "vrais
évènements" cad qui ont une date/heure de début et une date/heure de
fin.
MJ

Super. J'y ai rajouté qq infos manquantes.

Déesse A.

J'ai essayé de rédiger un petit "tutorial" à la fin de ca:
http://www.spip-contrib.net/spikini/FiltreAgendaMemo

Je ne me suis pas encore penché sur le code, mais à la vue de ce tutoriel, je me dis qu'il serait plus intuitif de diviser agenda_memo() en agenda_empile() et agenda_dessine(), non ?

-Nicolas