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>