- Home
- Categorie
- Coding e Sistemistica
- PHP
- [Tutorial] Creare un Calendario Dinamico in PHP
-
hai ragione.....
$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;
preciso:
è un modo sicuro x sapere i giorni del mese ed esula dalla pilloa in se
-
@riky78 said:
hai ragione.....
$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;
preciso:
è un modo sicuro x sapere i giorni del mese ed esula dalla pilloa in seottimo, lo testerò appena possibile
-
ciao bell script lo usato ma non so il motivo mi mancano 2 giorni dell mese
se vi interessa la modifica x unirlo ad un db e segnalare vari appuntamenti vi posto il codice.
-
Ciao darkrunik e benvenuto nel Forum GT ;),
ho tolto io il link che avevi postato,se vuoi segnalare il tuo sito puoi farlo nell'apposita area del forum "Segnala il tuo sito",questa è una sezione più tecnica
Se vuoi postare la tua modifica,ben venga,saresti d'aiuto a tutti gli utenti interessati
Ciao!
-
Ho visto che lo script è vecchiotto...cmq volevo segnalare un metodo alternativo per fare un calendario... che sembra più semplice..
Ho dovuto estrapolarlo dal suo contesto e metterlo in una pagina per farvelo vedere, è spiegato sommariamente durante il codice...
[PHP]<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Mese:
<select name="mese">
<?php
$mese = array(1 => 'Gen','Feb','Mar','Apr','Mag','Giu','Lug','Ago','Set','Ott','Nov','Dic');for($a=1; $a<=12; $a++) { echo "<option value='$a'>$mese[$a]</option>\n"; } ?> </select> <br/> <input type="text" size="4" maxlength="4" name="anno"><br> <input type="submit" value="Vai"/>
</form>
<?php
$month = $_POST['mese'];
$year = $_POST['anno'];
echo $mese[$month] . "/" . $year;$first = mktime(0,0,0,$month ,1,$year);// time stamp del primo giorno del mese
$total_days = date("t", $first);// giorni totali del mese
$first_day_week = date("w",$first);// numero del giorno della settimana (0=domenica,1=lunedì ecc)
if($first_day_week == 0) $first_day_week = 7;// domenica è 0 quindi lo trasformo in 7
?>
<table style="font:inherit; font-size:10px; color: #666666" width="210" cellspacing="0">
<tr style="font-weight:bold; text-align:center; color:#000000">
<td style="background:#FFF3C4">Lu</td>
<td style="background:#FFEC9F">Ma</td>
<td style="background:#FFE784">Me</td>
<td style="background:#FFE16A">Gi</td>
<td style="background:#FFCC00">Ve</td>
<td style="background:#FF9900">Sa</td>
<td style="background:#FF6600">Do</td>
</tr>
<tr>
<?php
$a = 1;// quando $a sarà divisibile per 7 chiude la riga di tabella e va a capo$b = 1;// per cambiare lo sfondo alla cella del giorno della settimana ( ci si può sbizzarrire)
$day = 1;
while($day <= $total_days)
{
echo "\t\t<td style="text-align:center;";
if($b == 1)
{
echo "background:#FFF3C4">";
}
elseif($b == 2)
{
echo "background:#FFEC9F">";
}
elseif($b == 3)
{
echo "background:#FFE784">";
}
elseif($b == 4)
{
echo "background:#FFE16A">";
}
elseif($b == 5)
{
echo "background:#FFCC00">";
}
elseif($b == 6)
{
echo "background:#FF9900">";
}
elseif($b == 7)
{
echo "background:#FF6600">";
$b = 0;
}$b++; if($a < $first_day_week) { echo " "; } else { if($em->day[$day] === true) {
// Questa è una classe per scrivere un link se l'evento esiste (preso dal db)
}
else
{
echo $day;
}
$day++;
}
echo "</td>\n";if(is_integer($a / 7)) echo "\t</tr><tr>\n"; $a++;
}
?>
</tr>
</table>[/PHP]Lo script è pubblicato, quindi non copiate, è reato. Grazie
Ho messo un esempio su
http://directory.zenia.it/misc/calendar.phpmoderatore sii clemente per il link, non c'è nient'altro che il calendario nella pagina...
C'è un form per scegliere mese e anno!
Buon divertimento
-
Grazie Francesco Zeno per aver postato la tua soluzione
Per il link,figurati,hai fatto bene a postare una demo
L'importante è che non spammi il tuo sito,poi tutto è permesso@francesco zeno said:
Lo script è pubblicato, quindi non copiate, è reato. Grazie
Se non è protetto da copyright non è illegale copiarlo.
Comunque,un consiglio...potresti proteggerlo gratuitamente con una licenza creative commons oppure far inserire un link al tuo sito all'interno dello script...
in questo modo aumenteresti le visite al tuo sito e alzeresti il tuo pagerank
-
Hai ragione, provvedo subito...
Comunque legalmente è mia semplicemente perché l'ho scritta io....rivendicarne la paternità ovviamente è un po' difficile senza riservare i diritti....
Ho visto che è un po' complesso ottenere una lincenza creative commons, perchè in italia siamo sempre indietro
-
se posti un codice vuol dire che lo rendi publlico.
visto che è una pillola(per aiutare la community) se dai il tuo contributo il tuo codice puo essere utilizzato.
il mio parere...
-
@Skyline said:
se posti un codice vuol dire che lo rendi publlico.
visto che è una pillola(per aiutare la community) se dai il tuo contributo il tuo codice puo essere utilizzato.
il mio parere...
Hai perfettamente ragione!!!Mi sono espresso male, intendevo che non si può vendere, modificare ed appropriarsi della paternità...
Si può copiare e ripubblicare...
Ciao!!
-
tornando al calendario di Pater.....
non si può cambiare mese? cioè come implemento delle freccette per andare aventi e/o indietro nei mesi?
-
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.