PHP: calendario a partire dalla data corrente
03/06/2013Sfruttando le funzioni di php sulla gestione delle date risulta facile costruire un piccolo calendario utile sia come widget sia come elemento di base attaverso cui poter sviluppare un piccolo motore di ricerca interno al sito che permetta la selezione di eventi o post sulla base della data.
Lo script originale è stato prodotto da Jason Marchalonis, io sono intervenuto per renderlo compatibile con il formato italiano delle date.
Definita la funzione, come vedremo dopo, possiamo chiamare la funzione stessa per avere l'output del mese corrente o, con una chiamata leggermente più articolata, l'output del calendario di tutto l'anno in corso.
La parte CSS di formattazione, a titolo puramente indicativo è questa:
.calendar {
border: 1px solid black;
color: #666;
font-size: 12px;
margin: 30px auto;
}
td,th {
color: #777;
font-family: Trebuchet MS, Arial, sans-serif;
font-size: 14px;
background:#FFC;
padding: 6px;
}
.header {
color: #900;
}
.day_on {
color: green;
background-color: #CCC;
}
Lo script (comprensivo dei commenti esplicativi originali dell'autore) è il seguente:
function build_calendar($month,$year,$dateArray) {
$today_date = date("d");
$today_date = ltrim($today_date, '0');
// Create array containing abbreviations of days of week (in italiano)
$daysOfWeek = array('L','M','M','G','V','S','D');
// What is the first day of the month in question?
$firstDayOfMonth = mktime(0,0,0,$month,1,$year);
// How many days does this month contain?
$numberDays = date('t',$firstDayOfMonth);
// Retrieve some information about the first day of the
// month in question.
$dateComponents = getdate($firstDayOfMonth);
// What is the name of the month in question?
$monthName = $dateComponents['month'];
// Nomi dei mesi in italiano
$sost = array("Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre");
$cerc = array("January","February","March","April","May","June","July","August","September","October","November","December");
$monthName = str_replace($cerc, $sost, $monthName);
// What is the index value (0-6) of the first day of the
// month in question.
$dayOfWeek = $dateComponents['wday'];
// variazione per far partire la settimana da lunedì
$dayOfWeek = ($dayOfWeek + 6) % 7;
// Create the table tag opener and day headers
$calendar = "<table class='calendar'>";
$calendar .= "<caption>$monthName $year</caption>";
$calendar .= "<tr>";
// Create the calendar headers
foreach($daysOfWeek as $day) {
$calendar .= "<th class='header'>$day</th>";
}
// Create the rest of the calendar
// Initiate the day counter, starting with the 1st.
$currentDay = 1;
$calendar .= "</tr><tr>";
// The variable $dayOfWeek is used to
// ensure that the calendar
// display consists of exactly 7 columns.
if ($dayOfWeek > 0) {
$calendar .= "<td colspan='$dayOfWeek'> </td>";
}
$month = str_pad($month, 2, "0", STR_PAD_LEFT);
while ($currentDay <= $numberDays) {
// Seventh column (Saturday) reached. Start a new row.
if ($dayOfWeek == 7) {
$dayOfWeek = 0;
$calendar .= "</tr><tr>";
}
$currentDayRel = str_pad($currentDay, 2, "0", STR_PAD_LEFT);
$date = "$year-$month-$currentDayRel";
if($currentDayRel == $today_date && date("m") == $month){ $calendar .= "<td class='day_on' id='today_date' rel='$date'>$currentDay</td>"; }
else { $calendar .= "<td class='day' rel='$date'>$currentDay</td>"; }
// Increment counters
$currentDay++;
$dayOfWeek++;
}
// Complete the row of the last week in month, if necessary
if ($dayOfWeek != 7) {
$remainingDays = 7 - $dayOfWeek;
$calendar .= "<td colspan='$remainingDays'> </td>";
}
$calendar .= "</tr>";
$calendar .= "</table>";
return $calendar;
}
$dateComponents = getdate();
$month = $dateComponents['mon'];
$year = $dateComponents['year'];
*********************
Per avere l'output del mese corrente:
echo build_calendar($month, $year, $dateArray);
Per avere l'output dell'intero anno corrente:
$year = "2013";
$i = 1;
$month = 1; //Numeric Value
while($i <= 12) {
echo build_calendar($month, $year, $dateArray);
$month = $month+1;
$i++; }