- Home
- Categorie
- Coding e Sistemistica
- PHP
- [Tutorial] Creare un Calendario Dinamico in PHP
-
up
-
@talkoman said:
tornando al calendario di Pater.....
non si può cambiare mese? cioè come implemento delle freccette per andare aventi e/o indietro nei mesi?nessun aiuto?
-
Ciao talkoman,
immagino tu debba lavorare su questo pezzo di codice:
[php]$dati['mese_num'] = date("n", time()); // Mese corrente ( numerico )
$dati['mese_text'] = date("F", time()); // Mese Corrente ( testuale )
$dati['oggi'] = date("j", time()); // Oggi ( numerico senza eventuali zeri )
$dati['oggi_sett'] = date("w", time()); // Oggi ( nella settimana, numerico )
$dati['anno'] = date("Y", time()); // Anno
[/php]
Ovvero: assegnare alle freccette il valore del mese precedente/successivo e quindi far eseguire il codice di cui sopra modificato, che prenda il valore del mese interessato e quindi da sostituire a time().
Per far decidere allo script quale dei due pezzi di codice eseguire basta fare un if.
-
Salve a tutti. Io ho copiato il codice all'interno di una pagina, ma quando la vado ad eseguire non vine visualizzato nulla. Perché?
-
@PaTeR said:
PRATICA
Scommetto che questa è la parte che vi piace di più :D, ma non scordatevi che PRIMA DELLA PRATICA, ci deve essere una TEORIA PERFETTA ( o quasi ).
Ecco qui cosa il mio genio malefico è riuscito a confabulare ( Naturalmente tutto commentato per spiegarvi il funzionamento
> //Trovo i dati fondamentali: $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'] = date("n", time()); // Mese corrente ( numerico ) $dati['mese_text'] = date("F", time()); // Mese Corrente ( testuale ) $dati['oggi'] = date("j", time()); // Oggi ( numerico senza eventuali zeri ) $dati['oggi_sett'] = date("w", time()); // Oggi ( nella settimana, numerico ) $dati['anno'] = date("Y", time()); // Anno $dati['start'] = date("w", mktime(0,0,0, $dati['mese_num'], 1, $dati['anno'])); // Giorno della settimana del primo giorno dell'anno $dati['giorni_mesi'][1] = (($dati['mese_num']%400) == 0) ? 29 : 28; // Calcolo dei giorni di febbraio $dati['giorni_mese'] = $dati['giorni_mesi'][$dati['mese_num']-1]; // Giorni del mese corrente $dati['settimane_mese'] = ceil($dati['giorni_mese']/7); // Settimane del mese corrente arrotondato per eccesso. // // 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 ) // $info['can_start'] = FALSE; // Se il conteggio reale dei giorni può partire $info['to_less'] = 0; // Giorni da accumulare $text = '<div align="center">**'.$dati['mese_text'].'**</div>'. '<table align="center"> <tr> <td class="cal_days">LU</td> <td class="cal_days">MA</td> <td class="cal_days">ME</td> <td class="cal_days">GI</td> <td class="cal_days">VE</td> <td class="cal_days">SA</td> <td class="cal_days">DO</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++) { $text .= '<tr>'; // Aggiungo una griglia // // 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 // if($subciclo != $dati['start'] && $info['can_start'] == FALSE) { // // Se tutti e due sono FALSE: // $text .= '<td class="cal_day"></td>'; // 1) Aggiungo una casella vuota $info['to_less']++; // 2) Aggiungo un giorno da levare continue; // 3) Faccio ricominciare il ciclo finchè uno dei due casi si riveli TRUE } else { $info['can_start'] = TRUE; // Muto il valore di can_start in 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 $dati['current_day'] = $subciclo+($ciclo*7)-$info['to_less']; // Calcolo il giorno da mostrare // // 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. // if($dati['current_day'] == $dati['oggi']) // Controllo se il giorno da mostrare è quello di oggi { $tdclass = 'oggi'; // Cambio stile in 'oggi' se è oggi } else { $tdclass = 'default'; // Cambio stile in 'Default' se non è oggi } $text .= '<td class="'.$tdclass.'">'.$dati['current_day'].'</td>'; // Poi aggiungo la cella } 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à. // } $text .= '</tr>'; // Chiudo la griglia } $text .= '</table>'; // Chiudo la tabella >```Beati voi che state leggendo questo script perchè non dovrete sbattere la testa su ogni muro come ho fatto io! :D Spero vi sia utile! :D :ciauz: :ciauz: :ciauz: buon codice, utilissimo. Però ho scoperto un bug. I mesi che iniziano di domenica non si vedono (gennaio 2012, maggio 2011, agosto 2010). qualche idea su come risolvere questo bug?
-
Scusate la mia lunga assenza. Purtroppo ora non ho molto tempo, vi prometto che a breve penserò ad aggiornare questo vecchio codice con uno nuovo, magari in Ajax, e penserò a correggere i bug.
Spero di non dovervi fare aspettare tanto, vi prego però di essere pazienti comunque! ( Periodo di esami.. )
-
@blekm said:
buon codice, utilissimo. Però ho scoperto un bug. I mesi che iniziano di domenica non si vedono (gennaio 2012, maggio 2011, agosto 2010).
qualche idea su come risolvere questo bug?
risolvi il bug in questo modo:
prima di iniziare il "ciclo madre" verifica se devi cominciare il mese con una domenica:// se devo cominciare il mese con una domenica
if ($dati['start'] == 0)
$domenica = true;
else
$domenica = false;poi una trentina di righe di codice sotto, prima del comando
continue; // 3) Faccio ricominciare il ciclo finchè uno dei due casi si riveli TRUE
aggiungi un controllo di questo tipo:
// se sono all'ultima cella e devo cominciare il mese con una domenica
if (($subciclo == 6) && ($domenica))
$info['can_start'] = TRUE; // Muto il valore di can_start in TRUEin questo modo visualizzerai anche i mesi che cominciano con la domenica.
Ciao!
-
Forse potrebbe essere utile: c'è una funzione php che effettua una verifica sulla data
checkdate($m,$d,$y);
dove $m=mese, $d=giorno, $y=anno (tutti valori numerici).
Restituisce 1 se la data è giusta.
-
Salve, volevo creare una pagina che mostri una tabella dove nella prima colonna visualizzo la data corrente in formato Giorno della settimana in parola, giorno in numero , mese in numero.
Questo per tutto il mese (quindi visualizzo ogni settimana tutti i giorni)
Una cosa del genere insomma :
[TABLE="class: grid, width: 500, align: center"][TD]Data[/TD]
[TD]Orario [/TD]
[/TR][TD]Lun 06/10[/TD]
[TD]..[/TD]
[/TR][TD]Mar 07/10[/TD]
[TD]...[/TD]
[/TR][TD]Mer 08/10[/TD]
[TD]..[/TD]
[/TR][TD]Gio 09/10[/TD]
[TD]..[/TD]
[/TR][TD]Ven 10/10[/TD]
[TD]..[/TD]
[/TR][TD]Sab 11/10[/TD]
[TD]..[/TD]
[/TR][TD]Dom 12/10[/TD]
[TD]..[/TD]
[/TR][TD]Lun 13/10[/TD]
[TD]..[/TD]
[/TR]
[/TABLE]e cosi via per tutto il mese.
Grazieee
-
Ciao Pater, ho un problema tecnico sul codice presente nel forum, precisamente sul Calendario Dinamico in PHP. Praticamente in questo punto del codice
if($em->day[$day] === true){
//Questa è una classe per scrivere un link se l'evento esiste (preso dal db)
}
else{
echo $day;
}
$day++;devo estrapolare dal database (in base al giorno del mese) la prenotazione in riferimento al giorno, ho scritto questo codice, ma duplica i giorni in base al numero di dati presente nel ciclo while e non effettua correttamnte il ciclo if?
$sql = "SELECT data FROM prenota";
$result = mysql_query($sql);while($fetch = mysql_fetch_array($result)){
$str_data = $fetch['data'];
//$events[$fetch["data"]] = $fetch["data"];if($str_data == $day){
//Questa è una classe per scrivere un link se l'evento esiste (preso dal db)
echo "<a href="">$day</a>";
}
else{
echo $day;
}}
$day++;
Grazie anticipato per l'aiuto.