Създаване на календарче.
Публикувана от smilev на January 12 2011 10:39:34

Разширена новина
Основната функция в този урок се казва calender_parse() и приема три параметъра: $month, $year, $cfg
Функцията връща приготвения HTML, който може директно да се принтне някъде в страницата или да се вложи в темплейт.

function calender_parse($month, $year, $cfg='')
{
//в началото събираме информация за това колко дни има в месеца и в кой ден от седмицата е 1-во число.
$total_days = cal_days_in_month(CAL_GREGORIAN, $month, $year);
$first_day = calender_firstDayOfMonth($month, $year);

// попълваме масив от 5 реда и 7 колони с 
for ($i=1; $i<=5; $i++){
for ($j=1; $j<=7; $j++){
$pa[$i][$j] = ' ';
}
}
//сега започвайки от клетка $first_day-1 на 1-ви ред, започваме да пишем номерата на дните докато стигнем $total_days
$crr_day = 1;
for ($i=$first_day - 1; $i<$first_day+$total_days-1; $i++){
if($i >= 35) $cellID = $i-35; //ако прехвърлим последната клетка на последния ред, започваме от 1-ва клетка на 1-ви ред.
else $cellID = $i;

//понеже въртим цикъла линейно е нужно да изнамерим номера на реда и колоната.
$rowID = floor($cellID/7)+1;
$colID = $cellID - ($rowID-1)*7 + 1;

//попълваме клетката.
$pa[$rowID][$colID] = $crr_day;

$crr_day++;
}

//тук поставяме заглавките на седмичните дни.
$str = "<tr><td><b>П</b></td><td><b>В</b></td> <td><b>С</b></td><td><b>Ч</b></td><td><b>П</b></td> <td><span style="color: #FF0000"><b>С</b></span></td> <td><span style="color: #FF0000"><b>Н</b></span></td></tr>";

//а тук приготвяме HTML кода.
foreach($pa as $rwID => $rwData){
$str .= '<tr>';
foreach($rwData as $colID=>$day){
if(calender_isToday($day, $month, $year)) $day = "<b>$day</b>";
if($colID >= 6) $day = "<span style="color: #FF0000">$day</span>";
$str .= "<td align="right">$day</td>";
}
$str .= '</tr>';
}
return "<table bgcolor=FFFFFF align=center style="border: solid 1px;">$str</table>";
}

//Помощтните ни функции са две и са много прости.
//Първата изважда индекса на деня от седмицата, в който е 1-во число на месеца. Съответно: 1 - Понеделник, 2 - Вторник, ... , 7 - Неделя

function calender_firstDayOfMonth($month, $year)
{
$ret = JDDayOfWeek(unixtojd(mktime(0, 0, 0, $month, 1, $year)));
if($ret == 0) $ret=7;

return $ret;
}

//И следващата функция просто проверява дали посочените $day, $month, $year оговарят на днешния ден.
//Тук да споменем, че $day е число от 1 до 31;

function calender_isToday($day, $month, $year)
{
$beg = mktime(0, 0, 0, $month, $day, $year);
$end = mktime(0, 0, 0, $month, $day+1, $year);
$now = time();

return ($beg <= $now && $now < $end);
}
?>

Ето и резултата, ако повикаме функцията така: calender_parse(3,2007):
[img]http://uroci.net/images/stories/uroci_17/calender.gif [/img]
Може би забелязахте, че никъде не използвахме променливата $cfg?!
С нейна помощ можете да променяте поведението на календара в зависимост от това, къде е щракнал потребителя или
пък да сменяте стила на визуализация на конкретни дни, но това ви го оставям като упражнение за вкъщи :)

Съответно - можете да си поиграете и с разни цъкалки за смяна на месеца годината и прочее, но вярвам, че основната идея е станала ясна.