Newsgroup: it.comp.www.php
Titolo: Calendario

Ciao a tutti, arrivo da asp e sono ai primi esperimenti in php.
Mi interessava inserire un calendario perpetuo in php, senza gestione 
eventi ecc...
Ne avrei anche trovato uno che fa al caso mio, se non per 2 piccoli 
difetti che vorrei sistemare.
Il primo riguarda la lingua dei mesi che ovviamente al momento è in inglese.
Il secondo riguarda l'impostazione della tabella con le date, in quanto 
se un mese utilizza 5 righe bene, ma se aumenta utilizzandone 6 si 
sballa la tabella diventando più alta.
In asp avevo risolto contando le righe generate, se inferiori a 6 la 
sesta veniva riempita con una riga vuota. In php non saprei, faccio 
fatica a orientarmi nel codice del calendario.
Se qualcuno mi sa aiutare, posso indicare anche il codice utilizzato
Ciao e grazie

<?php
//Sat_
function calendario($mese,$anno){
Global $_GET;
if ($_GET['x'] == NULL){
$mese_ = $mese;
$anno_ = $anno;
}
else{
$mese_ = (int)strftime( "%m" ,(int)$_GET['x']);
$anno_ = (int)strftime( "%Y" ,(int)$_GET['x']);
}
$prev = mktime(0, 0, 0, $mese_ -1, 1,  $anno_);
$next = mktime(0, 0, 0, $mese_ +1, 1,  $anno_);
$human_month = array("error", "Gennaio", "Febbraio", "Marzo", "Aprile",
"Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre",
"Dicembre" ); 
$settimana   = array("Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"); 
$colonne     = 7;
$giorni      = date("t",mktime(0, 0, 0, $mese, 1, $anno));  //giorni del
mese in questione
$primo_lunedi= date("w",mktime(0, 0, 0, $mese, 1, $anno));  //Array_parte da
0
if($primo_lunedi==0){
$primo_lunedi = 7;  //siamo mica americani
}
print("<table width=\"210\" colspacing=\"0\" border=\"0\">"); //table
print("\n\t<tr height=\"20\" class=\"txtredB\">\n\t\t<td colspan=\""
$colonne."\" align=\"center\"><a href=\"?x=".$prev."\">&lt;&lt;</a> <span
class=\"txtwhiteB\">".$human_month[(int)$mese]." ".$anno_."</span> <a
href=\"?x=".$next."\">&gt;&gt;</a></td>\n\t</tr>"); //mese/anno
foreach($settimana as $val){
print("\n\t\t<td height=\"20\" class=\"txtwhiteB\">".$val."\t</td>");
}
print("</tr>");
for($i = 1; $i<$giorni+$primo_lunedi; $i++){
if($i%$colonne+1==0){
print("\n\t<tr>");
}
if($i<$primo_lunedi){
print("\n\t\t<td>&nbsp;</td>");
}
else{
$giorno_= $i-($primo_lunedi-1);
$a = strtotime(date($anno_."-".$mese_."-".$giorno_));
$b = strtotime(date("Y-m-d"));
/* uncomment when debugging
print($giorno_."-".$mese_."-".$anno_);
print(" -> ");
print(strftime("%d-%m-%Y",$a));
//print($a);
print(" -> ");
print(strftime("%d-%m-%Y",$b));
//print($b);
print("<br>");
*/
if($a != $b){
print("\n\t\t<td class=\"txtredB\"><a href=\"?x=".$a."\">"
$giorno_."</a></td>");
}
else{
print("\n\t\t<td><a href=\"?x=".$a."\"><span class=\"txtwhiteB\">"
$giorno_."</span></a></td>");
}
}
if($i%$colonne==0){
print("\n\t</tr>");
}
}                                                                                                       
print("\n\t<tr height=\"30\">&nbsp;\n\t</tr>");
print("\n</table>");
}
?>

[sto pasticciando col newsreader]
ciao, io avevo fatto questo ai tempi, vedi un po' se ti funziona
Sat_

 $next = mktime(0, 0, 0, $mese_ +1, 1,  $anno_);
[..]
[quoting php_src/ext/date/php_date.c]
if (yea >= 0 && yea < 70) {
        yea += 2000;
} else if (yea >= 70 && yea <= 110) {
        yea += 1900;
}
[/quoting php_src/ext/date/php_date.c]
se il calendario deve essere perpetuo gia' qui si pone il problema..
mktime non puo' trattare con successo qualunque anno gli passi..
-- 
www.iuz-lab.info

iuz wrote:

giusto
bisognerebbe aggirarlo in qualche modo
-- 
non stare in buco, sono spine

 bisognerebbe aggirarlo in qualche modo
[domanda tipo='retorica']
cosa non si fa quando si ha tempo?!
[/domanda]
incito a criticare il codice..
non testato e sconsigliato da usare se non si capisce come funziona..
(comunque fornisce tutte le funzioni necessarie ad implementare il
calendario perpetuo con poco sforzo)..
error_reporting(E_ALL);
// Restituisce 'true' se il mese indicato e' un mese valido, 'false'
// altrimenti.
function check_month ($m)
{
 return ($m >= 1 || $m <= 12) ? true : false;
}
// Restituisce 'true' se l'anno indicato e' un anno valido, 'false'
// altrimenti.
function check_year ($y)
{
 return ($y != 0) ? true : false;
}
// Restituisce il numero di giorni del mese indicato (prendendo in
// considerazione l'anno) oppure '0' se fallisce.
function month_days ($m, $y)
{
 if (!(check_month($m) && check_year($y))) return 0;
 if (((1 << ($m - 1)) | 05325) == 05325) return 31;
 if (((1 << ($m - 1)) | 02450) == 02450) return 30;
 return 28 + ((($y % 4 == 0 && $y % 100 != 0) || $y % 400 == 0) ? 1 : 0);
}
// Restituisce 'true' se il giorno indicato e' un giorno valido (prendendo
// in considerazione mese ed anno), 'false' altrimenti.
function check_day ($d, $m, $y)
{
 if (!(check_month($m) && check_year($y))) return false;
 return ($d >= 1 || $d <= month_days($m, $y)) ? true : false;
}
// Restituisce il numero rappresentante il giorno della settimana 
// (assumendo '1' = lunedi') oppure '0' se fallisce.
function get_day ($d, $m, $y)
{
 if (!check_day($d, $m, $y)) return 0;
 if ($m == 1) { $m = 13; --$y; }
 if ($m == 2) { $m = 14; --$y; }
 $tmp1 = floor(($tmp0 = $d + ($m * 2) + floor((($m + 1) * 0.6)) +
 $y + floor($y / 4) - floor($y / 100) + floor($y / 400)) / 7);
 return $tmp0 - ($tmp1 * 7) + 1;
}
echo get_day(8, 2, 2007);
-- 
www.iuz-lab.info

iuz wrote:
[..]
errata corrige..
magari ci sono altri bug.. occhio..
error_reporting(E_ALL);
// Restituisce 'true' se il mese indicato e' un mese valido, 'false'
// altrimenti.
function check_month ($m)
{
 return ($m >= 1 && $m <= 12) ? true : false;
}
// Restituisce 'true' se l'anno indicato e' un anno valido, 'false'
// altrimenti.
function check_year ($y)
{
 return ($y != 0) ? true : false;
}
// Restituisce il numero di giorni del mese indicato (prendendo in
// considerazione l'anno) oppure '0' se fallisce.
function month_days ($m, $y)
{
 if (!(check_month($m) && check_year($y))) return 0;
 if (((1 << ($m - 1)) | 05325) == 05325) return 31;
 if (((1 << ($m - 1)) | 02450) == 02450) return 30;
 return 28 + ((($y % 4 == 0 && $y % 100 != 0) || $y % 400 == 0) ? 1 : 0);
}
// Restituisce 'true' se il giorno indicato e' un giorno valido (prendendo
// in considerazione mese ed anno), 'false' altrimenti.
function check_day ($d, $m, $y)
{
 if (!(check_month($m) && check_year($y))) return false;
 return ($d >= 1 && $d <= month_days($m, $y)) ? true : false;


 eventi ecc...
Io mi son trovato molto bene con questo:
http://www.oscarm.org/page/calendarClass/
Sobrio, lineare, ben documentato e se ti serve la gestione eventi te la 
realizzi come vuoi te estendendo la classe
Ciao,
Mauro