![]() |
![]() |
|
| Condividi questo contenuto nei Social Network: |
|
Tweet |
|
|
|
Ti stiamo aspettando: Registrati subito e gratis. Entra a far parte di una delle comunità più attive in Italia. Se hai dimenticato i tuoi dati li puoi recuperare subito. |
||||
|
|||||||||
|
|
LinkBack | Strumenti di discussione |
|
|
#1 (permalink) |
|
User Attivo
|
[Tutorial] Creare un Calendario Dinamico in PHP
Questa breve pillola è dedicata a tutti quelli che, come me, avevano la necessità di creare un calendario dinamico completo, magari per una gestione di news più professionale ( il mio caso ) o puramente a scopo informativo come servizio agli utenti.
Partiamo dal presupposto che la dinamicità la comprenderete solo durante la creazione dello script. Il mio scopo era quello di seguire uno schema così: Codice:
---------------------------------- | LU | MA | ME | GI | VE | SA | DO | ---------------------------------- | Giorni | ---------------------------------- TEORIA Cominciamo ad elencare le caratteristiche che un calendario deve avere: 1) Riconoscimento automatico giorno ( numerico ) 2) Riconoscimento automatico giorno ( della settimana, numerico ) 3) Riconoscimento automatico mese ( numerico ) 4) Riconoscimento automatico mese ( testuale ) 5) Riconoscimento automatico anno. Tutte queste le possiamo trovare grazie alla funzione date() che il nostro fantastico PHP ci mette a disposizione. Ora però ci dobbiamo servire anche di altre informazioni quali: 1) Giorno della settimana del primo giorno del mese ( Per capire quando dovrebbe cominciare il conto dei giorni ) 2) Numero dei giorni del mese 3) Numero delle settimane del mese corrente In più, se è febbraio, doivremo riuscire a calcolare di quanti giorni è, visto che date() non ha questa funzione. La mia idea consiste nel far scorrere i giorni tramite due cicli, uno dentro l'altro: Il primo penserà alle settimane, l'altro ai giorni delle settimane. Naturalmente i giorni non possono essere disposti a caso, bensì il primo giorno di ogni mese deve corrispondere al suo posto nella settimana. Per esempio: Se il primo giorno del mese è Martedì, il calcolo dei giorni non deve iniziare Lunedì, come verrebbe + semplice, bensì Martedì. Per risolvere questo problemino, ho calcolato il primo giorno del mese ( nella settimana ) e ho impostato il secondo ciclo ( quello dei giorni della settimana ) in modo che non parta prima che il giorno del ciclo corrisponda a quello prima calcolato. Naturalmente ciò non aveva senso se non accumulavo i valori in una variabile in modo tale che in seguito li possa togliere a quelli del ciclo al momento della visualizzazione ( Evitando di avere valori negativi ). A questo punto sicuramente vi troverete ancora più confusi di prima, ma non preoccupatevi: anche io mi trovavo così quando scoprì come fare |
|
__________________
Sitozzo esperimentalozzo - Beta Testing |
|
|
|
|
|
|
|
|
#2 (permalink) |
|
User Attivo
|
PRATICA
Scommetto che questa è la parte che vi piace di più Ecco qui cosa il mio genio malefico è riuscito a confabulare ( Naturalmente tutto commentato per spiegarvi il funzionamento ): Codice:
//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 Spero vi sia utile! ![]() |
|
__________________
Sitozzo esperimentalozzo - Beta Testing |
|
|
|
|
|
|
#4 (permalink) | |
|
User Attivo
|
Quote:
| |
|
__________________
Sitozzo esperimentalozzo - Beta Testing |
||
|
|
|
|
|
#5 (permalink) |
|
User Attivo
|
|
|
__________________
Sitozzo esperimentalozzo - Beta Testing |
|
|
|
|
|
|
#8 (permalink) | |
|
User Attivo
|
Quote:
| |
|
__________________
Sitozzo esperimentalozzo - Beta Testing |
||
|
|
|
|
|
#9 (permalink) | |
|
User Attivo
|
Quote:
| |
|
__________________
Sitozzo esperimentalozzo - Beta Testing |
||
|
|
|
|
|
#10 (permalink) |
|
Pater, davvero un ottimo lavoro, grande
![]() Quando clicco su una data da un 404 cosa vorresti fare in realta? | |
|
__________________
Giorgio Taverniti Blog - Il mio account Twitter! Che aspetti? Diventa MODERATRICE del Forum gt ![]() Importante evento sul Web Marketing: 5 sale, 27 argomenti, 33 esperti presenti, streaming e video registrati...a soli 149€
|
|
|
|
|
|
|
#11 (permalink) | |
|
User Attivo
|
Quote:
| |
|
__________________
Sitozzo esperimentalozzo - Beta Testing |
||
|
|
|
|
|
#12 (permalink) |
|
Esperto
Data di registrazione: May 2005
Messaggi: 466
|
Utilissimo.
Grazie mille |
|
__________________
Il mio nuovo Social Network - Punto chat Perchè uso Maxthon? http://maxthon.135.it |
|
|
|
|
|
|
#13 (permalink) |
|
User
Data di registrazione: Mar 2005
Messaggi: 503
|
non ho fatto in tempo a leggere tutto (spero di non ripetere qualcosa di già detto)
TIPS per sapere il numero dei giorni di un mese in automatico (febbr. e bisest. compresi) - si stabilisce la data del primo giorno del mese successivo - si togli un giorno (così siamo all'ultimo giorno del mese in questione) - si prende la parte numerica del giorno così abbiamo il numero di giorni del mese in questione ![]() |
|
|
|
|
|
#14 (permalink) | |
|
User Attivo
|
Quote:
| |
|
__________________
Sitozzo esperimentalozzo - Beta Testing |
||
|
|
|
|
|
#15 (permalink) |
|
User
Data di registrazione: Mar 2005
Messaggi: 503
|
hai ragione.....
Codice:
$data_inizio="2005-3-5"; //data del mese di cui si vogliono conoscere i giorni
$data_tmp=date("Y-m",strtotime($data_inizio))."-1"; //inizio mese
$data_tmp=strtotime("+1 month",strtotime($data_tmp)); //mese prossimo
$data_fine=date("Y-m-d",strtotime("-1 day",$data_tmp));
$giorni=date("d",strtotime($data_fine));
echo $giorni;
è un modo sicuro x sapere i giorni del mese ed esula dalla pilloa in se |
|
|
|
| Tags: calendario, creare, dinamico, php, pillola |
| Strumenti di discussione | |
|
|