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

Selon Nicolas Hoizey <nicolas@hoizey.com>:

> 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 ?

non.

On s'appuie sur une variable 'static'. Donc, il faut rappeler la même fonction
php.

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 ?

On s'appuie sur une variable 'static'. Donc, il faut rappeler la même fonction
php.

Rien n'empêche d'appeler cette fonction depuis deux "interfaces" qui soient plus simples et intuitives, à priori...

-Nicolas

et pour les évènements sur plusieurs dates, j'ai utilisé un post précédent
qui donnait le code suivant :
et ca semble fonctionner...
reste à donner une couleur différente aux évènements se chevauchant sur une
ou plusieurs dates....

<code>
function Xagenda_memo($date_fin='',$date_deb='', $descriptif='', $titre='',
$url='', $cal='', $type='')
{
  static $agenda = array();
  #echo("-->$type <br/>");
  if (!$type)
    {

    if($date_deb=="") $date_deb=$date_fin;

    if($date_fin < $date_deb) {
        $k=$date_deb;
        $date_deb=$date_fin;
        $date_fin=$k;
        }

       # echo("__$date_fin _ $date_deb _ $type _<br/>");
        $date_courante=date_anneemoisjour($date_deb);
        $start=strtotime($date_deb);
        $end=strtotime($date_fin);

        if($end-$start > 3600*24*500) // trop long, ignore
                {
                $date_fin=$date_deb;
                $end=$start;
                }
        $a = array(
                        'CATEGORIES' => $cal,
                        'DTSTART' => date_ical($date_deb),
                        'DTEND' => date_ical($date_fin),
                        'DESCRIPTION' => texte_script($descriptif),
                        'SUMMARY' => texte_script($titre),
                        'URL' => $url
            );

        #$agenda[$cal][$date_courante][]= $a;
        for($i=$start;$i<=$end;$i+=3600*24)
        $agenda[$cal][date("Ymd",$i)][]= $a;

    // signifier qu'il y a qqch
    return " ";
  } else {

# print_r($agenda); die();
    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);
    }

}

function critere_Xagenda($idb, &$boucles, $crit)
{
        $params = $crit->param;

        if (count($params) < 1)
              erreur_squelette(_T('zbug_info_erreur_squelette'),
                               "{agenda ?} BOUCLE$idb");

        $parent = $boucles[$idb]->id_parent;

        // les valeur $date et $type doivent etre connus a la compilation
        // autrement dit ne pas etre des champs

        $date_deb = array_shift($params);
        $date_deb = $date_deb[0]->texte;

        $date_fin = array_shift($params);
        $date_fin = $date_fin[0]->texte;

        $type = array_shift($params);
        $type = $type[0]->texte;

        $annee = $params ? array_shift($params) : "";
        $annee = "\n" . 'sprintf("%04d", ($x = ' .
                calculer_liste($annee, array(), $boucles, $parent) .
                ') ? $x : date("Y"))';

        $mois = $params ? array_shift($params) : "";
        $mois = "\n" . 'sprintf("%02d", ($x = ' .
                calculer_liste($mois, array(), $boucles, $parent) .
                ') ? $x : date("m"))';

        $jour = $params ? array_shift($params) : "";
        $jour = "\n" . 'sprintf("%02d", ($x = ' .
                calculer_liste($jour, array(), $boucles, $parent) .
                ') ? $x : date("d"))';

        $annee2 = $params ? array_shift($params) : "";
        $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
                calculer_liste($annee2, array(), $boucles, $parent) .
                ') ? $x : date("Y"))';

        $mois2 = $params ? array_shift($params) : "";
        $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
                calculer_liste($mois2, array(), $boucles, $parent) .
                ') ? $x : date("m"))';

        $jour2 = $params ? array_shift($params) : "";
        $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
                calculer_liste($jour2, array(), $boucles, $parent) .
                ') ? $x : date("d"))';

        $boucle = &$boucles[$idb];

/* ON veut obtenir comme critère

        date_deb <= jour and date_fin >= jour

        et

        (periode_deb <= date_deb et periode_fin>= date_deb) OU
        (periode_deb <= date_fin et peioder_fin>= date_fin) OU
        (date_deb <= periode_deb ET date_fin >= periode_fin)

        */

        $date_deb = $boucle->id_table . ".$date_deb";
        $date_fin = $boucle->id_table . ".$date_fin";

        if($type == 'jour')
                {
                $jour = "'\" . $annee . $mois . $jour .\"'";
                $boucle->where[]
="(DATE_FORMAT(IF($date_deb<'1900-01-02',$date_fin,$date_deb), '%Y%m%d')
<= $jour AND DATE_FORMAT($date_fin, '%Y%m%d') >= $jour) ";
                return;
                }

        if ($type == 'mois') {
                $per_deb = "'\" . $annee . $mois .\"01'";
                $per_fin = "'\" . $annee . $mois .\"31'";
                }
        elseif ($type == 'semaine') {
                $per_deb = "'\" .
                date_debut_semaine($annee, $mois, $jour) . \"'";
                $per_fin = "'\" .
                date_fin_semaine($annee, $mois, $jour) . \"'";
                }
        elseif (count($crit->param) > 2)
                {
                $per_deb = "'\" . $annee . $mois . $jour .\"' ";
                $per_fin = "'\" . $annee2 . $mois2 . $jour2 .\"' ";
                }

        $ddeb =
"DATE_FORMAT(IF($date_deb<'1900-01-02',$date_fin,$date_deb),'%Y%m%d')";
        $dfin = "DATE_FORMAT($date_fin,'%Y%m%d')";
        $boucle->where[] =
        "( $per_deb <= $ddeb AND $per_fin >= $ddeb ) OR ".
        "( $per_deb <= $dfin AND $per_deb >= $dfin ) OR".
        "( $ddeb <= $per_deb AND $dfin >= $per_fin )";
}
</code>

a utiliser de la manière sivante (pour un calendrier du mois) :
<code>
<BOUCLE_mois(ARTICLES){agenda date, mois, #ENV{annee}, #ENV{mois}}>
[(#DATE|Xagenda_memo{#DATE_REDAC,#DESCRIPTIF, #TITRE, #URL_ARTICLE,
'calendrier-couleur3'})]
</BOUCLE_mois>
[(#DATE|Xagenda_memo{'','', '', '','calendrier-couleur3', 'mois'})]
</B_mois>
<:aucun_article:>
<//B_mois>
</code>

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 ?

On s'appuie sur une variable 'static'. Donc, il faut rappeler la même

fonction

php.

Rien n'empêche d'appeler cette fonction depuis deux "interfaces" qui
soient plus simples et intuitives, à priori...

-Nicolas

ben a priori, DSA préfère que ce soit moins intuitif et SANS globale que
intuitif et avec Globale. je serait plutôt de ton avis mais... c'est
vrai que les globales sont dangereuses.

Par contre, je crois qu'il faudrait vraiment revoir les
http_calendrier_XXXX parce que les codes générés ne sont pas très très
top en ce qui concerne l'utilisation des css...

Moi il faut que je me penche sur un FORMULAIRE d'écriture des articles,
et c'est coton.
Une fois ca fait, je ferait la contrib, mais je ne suis pas très content
du rendu.

ben a priori, DSA préfère que ce soit moins intuitif et SANS globale que
intuitif et avec Globale. je serait plutôt de ton avis mais... c'est
vrai que les globales sont dangereuses.

Je ne propose pas de mettre des globales, j'ai horreur de ça, mais de créer deux simples fonctions avec des noms significatifs, qui appellent la fonction actuelle en évitant de mettre certains paramètres à ''.

-Nicolas

Oui mais jette un oeil au code: il s'appuie sur UNE variable "static".
Donc il faut appeler la meme fonction pour retrouver ta variable
"static". Si tu veux deux fonctions (deux noms de filtre) il faut faire
comment sans mettre la "static" en "global" ?
MJ

Il reste encore un point à resoudre me semble-t-il sur les événements
à cheval sur le mois précédent qui ne peuvent être ramenés par le
critére agenda.
Dans ce cas il faudrait peut-être faire une boucle article avec un
critere agenda de type periode en prenant quelques jours avant le
début du mois ? (la limite étant en fonction de ce qui se trouve
habituellement dans ton agenda).

pour une autre appli j'ai utilisé cette requete sql :

$SQLQUERY = "
SELECT adpc_calendrier.*,
        date_format(dtdb,'%d-%m-%Y') as dtdb,
        date_format(dtfn,'%d-%m-%Y') as dtfn,
        adpc_type.desig,
        adpc_etat.id as idetat,
        adpc_etat.desig as etat
FROM adpc_calendrier,adpc_type,adpc_etat
WHERE (
(dtdb
BETWEEN '$dtdb' AND '$dtfn') or
(dtfn
BETWEEN '$dtdb' AND '$dtfn')
) AND
adpc_calendrier.type = adpc_type.id AND
adpc_calendrier.etat = adpc_etat.id
ORDER BY adpc_calendrier.dtdb ASC;";

ca ne semble pas poser de pb, tous les évènements s'affichent correctement

Oui mais jette un oeil au code: il s'appuie sur UNE variable "static".
Donc il faut appeler la meme fonction pour retrouver ta variable
"static". Si tu veux deux fonctions (deux noms de filtre) il faut faire
comment sans mettre la "static" en "global" ?

Je reprends l'exemple :

<BOUCLE_jour(ARTICLES)
    {agenda date, jour, #ENV{annee}, #ENV{mois}, #ENV{jour}}>[
(#DATE|agenda_empile{#DESCRIPTIF, #TITRE, #URL_ARTICLE, 'calendrier-couleur1'})
]</BOUCLE_jour>
[(#DATE|agenda_dessine{'calendrier-couleur1', 'jour'})]
</B_jour>
<:aucun_article:>
<//B_jour>

Avec

function agenda_empile(date, descriptif, titre, url, css)
{
   agenda_memo(date, descriptif, titre, url, css);
}

function agenda_dessine(date, css, type)
{
   agenda_memo(date, '', '', '', css, type);
}

Ca masque la tuyauterie pour le créateur de squelettes, sans réduire la possibilité (bienvenue) d'utiliser une variable statique.

-Nicolas

non ca ca devrait marcher avec mon code publié plus tot. Il est
indépendant de la date de début de l'évènement qui "tombe à cheval".
par contre bien sur, si ton évènement commence avant la période
dessinée, tu ne verras pas le DEBUT de l'évènement, seulement les
répétitions.

y'a qqchose qui cloche lad'dans
j'y retourne immédiatement (Boris Vian)
et je corrige.
Mais ca m'étonnerait que DSA veuille commiter tout ca direct: la contrib
devient urgente.
MJ

Bon, voila, c'est sur spip-contrib & sur le spikini:

http://www.spip-contrib.net/ecrire/articles.php3?id_article=1063
http://www.spip-contrib.net/spikini/FiltreAgendaMemo2

Avec le code, les exemples et le tutorial.
Les avis de tout le monde sont bienvenus...

MJ

Oui, et je viens de trouver une manière....

Déesse A.

Le souci est légitime mais ta proposition reste malheureusement insatisfaisante parce qu'en fait meme le premier argument est superflu ce qui n'arrange rien. Mais je viens de trouver qqch qui résoud tous les pbs à la fois. Je dépose sur la CVS et je vais documenter sur spip-net.

Déesse A.

Le pb est qu'une partie des css provient de spip_style.php qui génére dynamiquement les classes.
Ce qu'il faudrait à terme c'est de reprendre le code de changement de couleur de l'espace privé pour l'adpater au calendrier de l'espace public. Mais je ne pourrais pas m'en occuper avant une semaine.

Déesse A.

>
> Je ne propose pas de mettre des globales, j'ai horreur de ça, mais de
> créer deux simples fonctions avec des noms significatifs, qui
> appellent
> la fonction actuelle en évitant de mettre certains paramètres à ''.

Le souci est légitime mais ta proposition reste malheureusement
insatisfaisante parce qu'en fait meme le premier argument est
superflu ce qui n'arrange rien. Mais je viens de trouver qqch qui
résoud tous les pbs à la fois. Je dépose sur la CVS et je vais
documenter sur spip-net.

c'est qui chuila spip-net ? je vois la cvs passer sur la liste cvs (sans
vraiment comprendre ce que ca fait...) et je ne sais pas où aller
chercher la doc... juste pour savoir s'il faut mettre mes manips à jour.

MJ

c'est qui chuila spip-net ? je vois la cvs passer sur la liste cvs (sans
vraiment comprendre ce que ca fait...) et je ne sais pas où aller
chercher la doc...

juste pour savoir s'il faut mettre mes manips à jour.

Ce que tu as fait doit continuer à marcher puisque tu as réécrit tes propres filtres.
En revanche, en matière de lisibilité et de fonctionnalité tu pourrais appliquer le même genre de transformation.

Déesse A.

Super,
j'attend avec impatience cette soluce...

et encore merci pour tout...

Il n'y a rien à attendre, c'est sur la CVS et documenté sur spip-net

super, faut modifier le spikini aussi alors ? j'ai pas tout compris
comment ca marche mais bon...
MJ