ho trovato una soluzione, posto qua il codice.
Allo stesso tempo ho anche trovato un bug, i mesi che iniziano di domenica non vengono visualizzati, e non riesco a capire il perchè
qualche idea?
Codice PHP:
//Trovo i dati fondamentali:
// Array con i giorni dei mesi
$dati['giorni_mesi'] = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
// Mese corrente ( numerico )
$dati['mese_num'] = date("n", time());
// Mese Corrente ( testuale )
$dati['mese_text'] = date("F", time());
// Oggi ( numerico senza eventuali zeri )
$dati['oggi'] = date("j", time());
// Oggi ( nella settimana, numerico )
$dati['oggi_sett'] = date("w", time());
// Anno
$dati['anno'] = date("Y", time());
// Giorno della settimana del primo giorno dell'anno
$dati['start'] = date("w", mktime(0,0,0, $dati['mese_num'], 1, $dati['anno']));
// Calcolo dei giorni di febbraio
$dati['giorni_mesi'][1] = (($dati['mese_num']%400) == 0) ? 29 : 28;
// Giorni del mese corrente
$dati['giorni_mese'] = $dati['giorni_mesi'][$dati['mese_num']-1];
// Settimane del mese corrente arrotondato per eccesso.
$dati['settimane_mese'] = ceil($dati['giorni_mese']/7);
//
// Vi sarete accorti che:
// 1) Nel calcolo dei giorni del mese corrente c'è un -1: Questo è perchè l'array inizia da 0, non da 1
// 2) Ho arrotondato per eccesso il calcolo delle settimane: Per evitare giorni nascosti nell'ultima settimana
// 3) I giorni della settimana trovati da date() iniziano da 0 ( Domenica ) fino a 6 ( Sabato )
//
// Se il conteggio reale dei giorni può partire
$info['can_start'] = FALSE;
// Giorni da accumulare
$info['to_less'] = 0;
$text = '
<style type="text/css">
table { border:1px solid black; }
td.cal_days { padding-left:35px; border:1px solid grey; }
td { padding:10px; }
td { border:1px solid silver; }
</style>
<div align="center">'.$dati['mese_text'].'</div>
'.
'<table align="center">
<tr>
<td class="cal_days">Lun</td>
<td class="cal_days">Mar</td>
<td class="cal_days">Mer</td>
<td class="cal_days">Gio</td>
<td class="cal_days">Ven</td>
<td class="cal_days">Sab</td>
<td class="cal_days">Dom</td>
</tr>'; // Schema fisso dei giorni della settimana
//
// Ciclo madre: Continua per tutte le settimane del mese
//
for($ciclo = 0; $ciclo <= $dati['settimane_mese']; $ciclo++)
{
// Aggiungo una griglia
$text .= '<tr>';
// Ciclo Figlio ( SubCiclo ): Avanza per tutti i giorni della settimana
for($subciclo = 1; $subciclo <= 7; $subciclo++)
{
// Controllo se il ciclo può partire e se il giorno del ciclo figlio
// corrisponde a quello della settimana del primo giorno del mese
// Se tutti e due sono FALSE:
if($subciclo != $dati['start'] && $info['can_start'] == FALSE)
{
// 1) Aggiungo una casella vuota
$text .= '<td class="cal_day"></td>';
// 2) Aggiungo un giorno da levare
$info['to_less']++;
// 3) Faccio ricominciare il ciclo finchè uno dei due casi si riveli TRUE
continue;
}
else
{
// Muto il valore di can_start in TRUE
$info['can_start'] = TRUE;
}
//
// Naturalmente solo uno dei due casi può rivelarsi TRUE: Solo ' $subciclo != $dati['start'] '
// dato che can_start diverrà TRUE solo quando si avvererà la prima condizione. Così il conto può partire
//
// Ora mi calcolo il giorno corrente, Sommando il valore corrente della variabile di questo ciclo ai giorni
// delle settimane trascorse ( Grazie alla moltiplizacione per 7 di $ciclo ) e levando infine i giorni
// accumulati in precedenza. Vi ricordo che questo di seguito è la variabile contenente il giorno da mostrare,
// non quello di oggi
// Calcolo il giorno da mostrare
$dati['current_day'] = $subciclo+($ciclo*7)-$info['to_less'];
// Controllo ci restano ancora giorni del mese
if($dati['current_day'] <= $dati['giorni_mese'])
{
// Se si...
//
// Vorrete fare capire il giorno di oggi, no? Quindi cambiamo stile
// alla cella in caso questa corrisponda a quella di oggi.
//
// Controllo se il giorno da mostrare è quello di oggi
if($dati['current_day'] == $dati['oggi'])
{
// Cambio stile in 'oggi' se è oggi
$tdclass = 'oggi';
} else {
// Cambio stile in 'Default' se non è oggi
$tdclass = 'default';
}
$empty_space = "";
if (strlen($dati['current_day']) == 1)
{
$empty_space = "";
}
// Poi aggiungo la cella
$text .= '<td class="'.$tdclass.'">'.$empty_space.$dati['current_day'].' <input type="text" size="4" maxlength="4" name='.$dati['current_day'].'-'.$dati['mese_num'].'/></td>';
}
else
{
// Se invece non ci restano più giorni del mese, faccio terminare il ciclo
break;
}
// Finisce qui il SubCiclo, se ci sono ancora settimane da mostrare il ciclo continuerà, se no, si fermerà.
}
// Chiudo la griglia
$text .= '</tr>';
}
// Chiudo la tabella
$text .= '</table>';
echo $text;
?>