Un Evento Unico. 5 Sale. 27 Interventi. SEO, SOCIAL, E-Commerce, Mobile, Turismo.
CLICCA QUI e SCOPRI DI PIù X Chiudi
 
Forum GT: Condividiamo idee e conoscenza Forum GT: Condividiamo idee e conoscenza


Condividi questo contenuto nei Social Network:
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.


Vai indietro   Forum per Webmaster: Condividiamo Idee e Conoscenza > Sviluppo e Gestione siti web > Php - Mysql > Scripting e Risorse utili
Benvenuto! Forum Regole FAQ Lista utenti Calendario Segna come letti


Rispondi
 
LinkBack Strumenti di discussione
Vecchio 06-09-05, 18:09   #1 (permalink)
User Attivo
 
Data di registrazione: Nov 2004
Ubicazione: Catania
Messaggi: 1,142
Invia un messaggio tramite MSN a PaTeR
[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                          |
 ----------------------------------
E ci ho sbattuto la testa per più di una settimana per trovare il metodo logico giusto. Cominciamo ora con la....


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
PaTeR non in linea   Rispondi citando
Vecchio 06-09-05, 18:10   #2 (permalink)
User Attivo
 
Data di registrazione: Nov 2004
Ubicazione: Catania
Messaggi: 1,142
Invia un messaggio tramite MSN a PaTeR
PRATICA

Scommetto che questa è la parte che vi piace di più , 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 ):

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
Beati voi che state leggendo questo script perchè non dovrete sbattere la testa su ogni muro come ho fatto io!

Spero vi sia utile!
PaTeR non in linea   Rispondi citando
Vecchio 06-09-05, 19:48   #3 (permalink)
User Attivo
 
L'avatar di Tuonorosso
 
Data di registrazione: Mar 2005
Ubicazione: Lecco
Messaggi: 1,946
Invia un messaggio tramite MSN a Tuonorosso Invia un messaggio tramite Skype a Tuonorosso
mmm....ci linki la pagina dove l'hai usato?
__________________
Film
Tuonorosso non in linea   Rispondi citando
Vecchio 06-09-05, 19:50   #4 (permalink)
User Attivo
 
Data di registrazione: Nov 2004
Ubicazione: Catania
Messaggi: 1,142
Invia un messaggio tramite MSN a PaTeR
Quote:
Tuonorosso
mmm....ci linki la pagina dove l'hai usato?
Non credi che l'ho fatto io? Aspetta...
PaTeR non in linea   Rispondi citando
Vecchio 06-09-05, 19:58   #5 (permalink)
User Attivo
 
Data di registrazione: Nov 2004
Ubicazione: Catania
Messaggi: 1,142
Invia un messaggio tramite MSN a PaTeR
Quote:
PaTeR
Non credi che l'ho fatto io? Aspetta...
http://ctpaterct.altervista.org/calendario.php
PaTeR non in linea   Rispondi citando
Vecchio 06-09-05, 20:10   #6 (permalink)
User Attivo
 
L'avatar di Tuonorosso
 
Data di registrazione: Mar 2005
Ubicazione: Lecco
Messaggi: 1,946
Invia un messaggio tramite MSN a Tuonorosso Invia un messaggio tramite Skype a Tuonorosso
mahuahuhuah, certo che ci credo!!! Era per vedere come veniva...

PS: ma non puoi linkarci il tuo sito?
__________________
Film
Tuonorosso non in linea   Rispondi citando
Vecchio 06-09-05, 20:15   #7 (permalink)
sms
Non iscritto
 
Data di registrazione: Oct 2004
Messaggi: 767
si potrebbe implementare anche uno stile diverso per la domenica ed altri giorni festivi
sms non in linea   Rispondi citando
Vecchio 06-09-05, 20:15   #8 (permalink)
User Attivo
 
Data di registrazione: Nov 2004
Ubicazione: Catania
Messaggi: 1,142
Invia un messaggio tramite MSN a PaTeR
Quote:
Tuonorosso
mahuahuhuah, certo che ci credo!!! Era per vedere come veniva...

PS: ma non puoi linkarci il tuo sito?
ho postato sopra
PaTeR non in linea   Rispondi citando
Vecchio 06-09-05, 20:16   #9 (permalink)
User Attivo
 
Data di registrazione: Nov 2004
Ubicazione: Catania
Messaggi: 1,142
Invia un messaggio tramite MSN a PaTeR
Quote:
sms
si potrebbe implementare anche uno stile diverso per la domenica ed altri giorni festivi
Sisi, non ho implementato stili per darvi + autonomia, quelli nella pagina li ho messi da esempio
PaTeR non in linea   Rispondi citando
Vecchio 07-09-05, 10:28   #10 (permalink)
 
L'avatar di Giorgiotave
 
Data di registrazione: Oct 2004
Ubicazione: Monasterace
Messaggi: 34,891
Invia un messaggio tramite Skype a Giorgiotave
Pater, davvero un ottimo lavoro, grande

Quando clicco su una data da un 404 cosa vorresti fare in realta?
Giorgiotave ora è in linea   Rispondi citando
Vecchio 07-09-05, 15:59   #11 (permalink)
User Attivo
 
Data di registrazione: Nov 2004
Ubicazione: Catania
Messaggi: 1,142
Invia un messaggio tramite MSN a PaTeR
Quote:
Giorgiotave
Pater, davvero un ottimo lavoro, grande

Quando clicco su una data da un 404 cosa vorresti fare in realta?
Ah scusate, li dovevo levare... praticamente lo utilizzavo per leggere le nius Calcolavo anche il TIMESTAMP e leggevo dal DB... E' una delle tante idee che si posso applicare
PaTeR non in linea   Rispondi citando
Vecchio 08-09-05, 13:53   #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
Bukowski non in linea   Rispondi citando
Vecchio 08-09-05, 14:11   #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


riky78 non in linea   Rispondi citando
Vecchio 08-09-05, 15:57   #14 (permalink)
User Attivo
 
Data di registrazione: Nov 2004
Ubicazione: Catania
Messaggi: 1,142
Invia un messaggio tramite MSN a PaTeR
Quote:
riky78
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


ce lo puoi fare un esempio? non sto capendo molto...
PaTeR non in linea   Rispondi citando
Vecchio 08-09-05, 16:12   #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;
preciso:

è un modo sicuro x sapere i giorni del mese ed esula dalla pilloa in se
riky78 non in linea   Rispondi citando
Rispondi
Tags: , , , ,



Strumenti di discussione

Regole di scrittura
Non puoi postare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi allegare file
Non puoi editare i tuoi post

BB code is Attivo
smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Attivo
Pingbacks are Attivo
Refbacks are Disattivato
Vai al forum



Tutti gli orari sono GMT +3. Attualmente sono le 20:19.




Forum GT - © 2004-2009 GT idea S.r.l P.iva 02418200800 - Privacy/Disclaimer

SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.