Newsgroup: it.comp.www.php
Titolo: calendario e 'periodi' evidenziati....help?

ciao, io ho una tabella del tipo
|id|txt|inizio|inizioMM|inizioAA|fine|fineMM|fineAA|
| 1 | prova | 20070108 | 01 | 2007 | 20070115 | 01 | 2007 |
| 2 | secondo | 20070120 | 01 | 2007 | 20070123 | 01 | 2007 |
(i campi MM e AA gli ho aggiunti in un secondo momento per velocizzare
le query a db, il calendario mostra slo 1 mese alla volta)
che sarebbero dei periodi di tempo, inizio e fine espressi in
aaaammgg..
il mio problema è che dovrei visualizzare questi periodi in un
calendario...
ora io pensavo di buttare il tutto in un array
$myArray['inizio'][0]="20070108"; //-->08/01/2007
$myArray['fine'][0]="20070115"; //-->12/01/2007
$myArray['title'][0]="prova";
$myArray['inizio'][1]="20070120"; //-->20/01/2007
$myArray['fine'][1]="20070123"; //-->23/01/2007
$myArray['title'][1]="secondo";
poi quando mi creo il calendario che ho la mia bella variabile
incrementale del giorno controllo se è uguale alla fine o inizio di
uno dei periodi...
in questo modo però riesco a individuare (e visualizzare con sfondo
diverso) solo l'inizio e la fine, ma non il periodo dal al...
poi credo ci sia un metodo migliore di fare un foreach per ogni giorno
del mese...
idee?

 le query a db, il calendario mostra slo 1 mese alla volta)
L'impatto prestazionale sulla query di month(inizio) e year(inizio) vale 
l'aggiunta di 4 campi nel db con eventuali problemi di sincronia dati 
(nel caso modifichi inizio o fine)??
Con un between selezioni tutti gli eventi del mese interessato, poi 
ovviamente dovrai ciclare tra i risultati applicare i vari sfondi etc.
Alcuni programmi utilizzano anche una tabella calendario, contenente 
tutti i giorni dall'anno x all'anno y, e via sql riesci a ottenere quasi 
tutto (questa soluzione non mi piace)
	Francesco

mha io pensavo di fare delle query del tipo
SELECT periodo.inizio, periodo.fine, peridodo.txt FROM periodo WHERE
mese='$miomese' && anno='$mioanno'
così ho una query di selezione ma poi mi filtro solo i periodi di quel
mese, prima mi filtravo tutti i periodi.. intendevo più veloce in
questo senso :D
per il giorno del mese, visto che questi periodi sò per certo che non
si sovvrappongono mai (controllo al momento dell'inserimento) pensavo
di fare una cosa del tipo
//$oggi in formato aaaammdd
if(($oggi == $myInizio) or ($oggi == $myFine) or ($oggi > $myInizio &&
$oggi < $myFine)){
//ok siamo nel periodo
}else{
//non siamo nel periodo
}
e così funziona, solo che io non ho 1 periodo ma x periodi in un
array, il mio problema nasce qui...
sarebbe più facile se per ogni giorno del mese faccio una query al db,
ma non voglio pallare il db con 30 query per visualizzazzione quando
posso risolvere in 1 query e un paio di cicli foreach o while (spero di
riuscirci..help!^^)

riguardo al between..si in effetti avendo inizio e fine in formato
aaaammgg posso semplificare con un between aaaamm00 and aaaamm31 e mi
risparmio quei 4 campi in più

 idee?
Si, occhio alle accentate quando posti da google.

suppaman ha scritto:

capperi questo si che mi aiuta un sacco..non hai proprio un c@@o da
fare, mmh?
comunque credo di aver già risolto con una robetta di questo tipo:
$myArray['inizio'][0]="20070105";
$myArray['fine'][0]="20070115";
$myArray['title'][0]="prova";
$myArray['inizio'][1]="20070120";
$myArray['fine'][1]="20070123";
$myArray['title'][1]="secondo";
$myArray['inizio'][2]="20070127";
$myArray['fine'][2]="20070130";
$myArray['title'][2]="terzo";
function datareformat($data){
	$aa=substr($data, 0, 4);
	$mm=substr($data, 4, 2);
	$gg=substr($data, 6, 8);
	$datareformat="$gg"."/"."$mm"."/"."$aa";
	return $datareformat;
}
$myDay=20070101;
while($myDay!=20070131){
	$dataC=datareformat($myDay);
	$myFrase="$dataC non è in nessun periodo<br>";
	foreach($myArray['title'] as $chiave => $valore){
//		echo "$chiave, $valore<br>";
		$myInizio=$myArray['inizio'][$chiave];
		$myFine=$myArray['fine'][$chiave];
		if(($myDay==$myInizio) or ($myDay==$myFine) or
(($myDay>$myInizio)&&($myDay<$myFine))){
			$myFrase="$dataC è nel periodo $valore !!!!!!!!!!!!!<br>";
		}
	}
	echo $myFrase;
	$myDay++;
}
ovviamente questo è solo un esempio, ma anche se funziona non credo
sia il metodo 'migliore'...
ragazzi qualsiasi miglioria è ben accetta!
(non grammaticale grazie :P)

 
Io cambierei l'uso di $myDay (ovvero come fai a sapere che gennaio 
termina il 31?) Usa cal_days_in_month
Mi sfugge il passaggio dal dabatase all'array, ma è lunedì quindi non mi 
stupisco di niente :-)
	Francesco

hum ok scusa è che sono abbastanza incasinato con questo e altri 2
script e un pò nervosetto...sry
cmq per il passaggio da database ad array faccio una semplice query
SELECT inizio, fine, txt FROM periodi WHERE (inizio BETWEEN
'$inizioMese' and '$fineMese') and (fine BETWEEN '$inizioMese' and
'$fineMese')
poi
$i=0;
while(list($inizio, $fine, $txt)=mysql_fetch_array($query)){
$array['inizio'][$i]=$inizio;
$array['fine'][$i]=$fine;
$array['txt'][$i]=$txt;
$i++;
}
che trasformerò poi in un ciclo for alla fine, fincheè sono in fase
'test' sono più comodo a vederlo in while

 '$fineMese')
Eccomi qui con la mia intromissione, non protesti fare un cosa del
genere (pseudocodice)
$roba=mysq_query()
while(list(inizio,fine,txt)=mysql_fetch_array($roba)){
   giorno_inizio=prendigiorno(inizio);
   giorno_fine=prendigiorno(fine);
   for($i=giornoinizio;$i<giornofine;$i++) {
         $appuntamenti[$i]=txt;
   }
}
cosi alla fine ti trovi un array con tutti i giorni del mese, e a ogni
giorno hai associato txt.
se poi i giorni si sovrapponessero, sostituisci $appuntamenti[$i]=txt;
con
         $appuntamenti[$i].=txt.";";
Iacopo
http://www.iacoponeri.net