[php] Calendario dinamico [risolto]
Ciao a tutti,
da poco ho creato uno script php per creare un calendario dinamico. Nella realtà collabora con AJAX ma non serve che vi mostri tutto per intero (AJAX compreso).
Purtroppo c'è un bug nell'algoritmo perchè il calendario viene generato perfettamente tranne quando il primo giorno del mese è la domenica.
Faccio un esempio pratico:
Marzo 2012
L | M | M | G | V | S | D |
27|28|29| 1 | 2 | 3 | 4 |
....
e fin quì funziona. Il problema nasce se deve generare Aprile 2012. In teoria dovrebbe stampare questo:
L | M | M | G | V | S | D |
26|27|28| 29|30|31| 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
nella pratica stampa questo:
L | M | M | G | V | S | D |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
Si mangia misteriosamente la prima riga!
Non ho la più pallida idea del perché faccia così. Potete aiutarmi per favore?
[cut by alemoppo: link non più funzionante]
Il codice php che genera il calendario è il seguente:
Codice PHP:
class calendario{
function init(){
$data=date("j", time())."-".date("n", time())."-".date("Y", time());
$this->disegna($data,'oggi');
}
function disegna($data,$come){
if($come=="oggi"){$t=strtotime($data);}
if($come=="p1"){$t=strtotime($data." -1 month");}
if($come=="s1"){$t=strtotime($data." +1 month");}
$this->disegnaCalendario(date("n", $t),date("F", $t),date("j", $t),date("w", $t),date("Y", $t));
}
function disegnaCalendario($mmN,$mmT,$ggN,$ggS,$aa){
$dati = array();
$dati['giorni_mesi'] = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); // Array con i giorni dei mesi
$dati['mese_num'] = $mmN; // Mese corrente ( numerico )
$dati['mese_text'] = $mmT; // Mese Corrente ( testuale )
$dati['oggi'] = $ggN; // Oggi ( numerico senza eventuali zeri )
$dati['anno'] = $aa; // Anno
$dati['giorni_mesi'][1] = ( checkdate(2,29,$dati['anno']) ) ? 29 : 28; // Calcolo dei giorni di febbraio
$dati['giorni_mese'] = $dati['giorni_mesi'][$dati['mese_num']-1]; // Giorni del mese corrente
$str1=$dati['oggi']."-".$dati['mese_num']."-".$dati['anno']." -1month";
$newMonth=date("n",strtotime($str1));
$newYear=date("Y",strtotime($str1));
$dati['giorni_mesi'] = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$dati['giorni_mesi'][1] = ( checkdate(2,29,$newYear) ) ? 29 : 28;
$dati['giorni_meseP'] = $dati['giorni_mesi'][$newMonth-1];
$str1=$dati['oggi']."-".$dati['mese_num']."-".$dati['anno']." +1month";
$newMonth=date("n",strtotime($str1));
$newYear=date("Y",strtotime($str1));
$dati['giorni_mesi'] = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$dati['giorni_mesi'][1] = ( checkdate(2,29,$newYear) ) ? 29 : 28;
$dati['giorni_meseS'] = $dati['giorni_mesi'][$newMonth-1];
$str3="1-".$dati['mese_num']."-".$dati['anno'];
$dati['giorno1Settimana'] = date("w",strtotime($str3));
$c=1;
for($a=1;$a<=6;$a++){
echo "<tr>";
for($b=1;$b<=7;$b++){
$cellID="cell".($a*$b);
$diff=$dati['giorno1Settimana']-$c;
$classe="";
($b==7) ? $classe="bordoR" : $classe="";
$e=($c-$dati['giorno1Settimana']+1);
if($diff>0){
$classe.=" out";
echo "<td id='".$cellID."' class='".$classe."' giorno='".$b."'>".($dati['giorni_meseP']-$diff+1)."</td>";
}
else if($e>$dati['giorni_mese']){
$classe.=" out";
echo "<td id='".$cellID."' class='".$classe."' giorno='".$b."'>".($e-$dati['giorni_mese'])."</td>";
}
else{
if( $e==$dati['oggi'] ){$classe.=" today cellaConFocus";}
echo "<td id='".$cellID."' class='".$classe."' giorno='".$b."'>".$e."</td>";
}
$c++;
}
echo "</tr>";
}
}
}
Informazioni aggiuntive (CSS)
Le caratteristiche grafiche alle celle vengono date dalla $classe specificata. Se è un giorno che non appartiene al mese scelto la classe è OUT, se è una domenica la classe è anche bordoR (serve per metterci il bordo sulla destra come contorto x il calendario), e se il giorno processato è quello richiesto aggiunge le classi today e cellaConFocus.
Informazioni aggiuntive (AJAX)
Potete trovare tutto semplicemente facendo il login e vedendo tramite la console di firebug (spero lo abbiate) come funziona il tutto (è molto difficile spiegarlo ora a parole).
Per altre informazioni chiedete pure. Spero davvero in un vostro aiuto perchè è molto importante e non so davvero come fare.