Помогни ни да направим Uroci.net по - богат! Добави урок

Създаване на календарче.

PHP » PHP
lyubo   трудност:    видян: 13920

Основната функция в този урок се казва 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):


уроци - calender.gif

Може би забелязахте, че никъде не използвахме променливата $cfg?!
С нейна помощ можете да променяте поведението на календара в зависимост от това, къде е щракнал потребителя или
пък да сменяте стила на визуализация на конкретни дни, но това ви го оставям като упражнение за вкъщи :)

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



Коментари (10)

lyubo на 08.03 2007 в 13:47ч.
Здравейте хора,
Разгледах урока и искам да ви уведомя, че ако ползвате Mozilla Firefox, ще ви е малко трудно да го изчетете. Съветвам ви да го разгледата с IE или Opera. При последните два браузъра се чете нормално.
fix3d на 08.03 2007 в 14:36ч.
Оправих го, това се получава като има много дълги редове без интервали.
lyubo на 08.03 2007 в 15:13ч.
Така е по-добре.
interfan6 на 21.03 2007 в 14:41ч.
Защо при мен написаният код няма дефекти ама няма и ефект ! аз съм със Мозила Фирефокс както и с ИЕ, но нито един от двата не ми зарежда календара :( . Защо така ?
lyubo на 26.03 2007 в 15:49ч.
Ами ти забелиаза ли, че функцията calender_parse не принтира нищо на екрана?

трябва да я повикаш така: print calender_parse(3,2007);
за да разпечаташ резултата.
Освен туй няма никакво значение с какъв браузър си - HTML кода на календарчето се поддържа от всички графични браузъри.

Ако горното не ти помогне, прати ми на пощата кода си, за да видя какъв е проблема.

Поздрави
lyubo на 26.03 2007 в 15:50ч.
пощата ми е lyubo@kibertron.com
penkostr на 28.03 2007 в 10:31ч.
ето резултата от Internet explorer

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$day){ if(calender_isToday($day, $month, $year)) $day = "$day"; if($colID >= 6) $day = "$day"; $str .= "$day"; } $str .= ''; } return "$str "; } //Помощтните ни функции са две и са много прости. //Първата изважда индекса на деня от седмицата, в който е 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
d_badboy на 01.05 2007 в 12:03ч.
На мене защо ми изкарва "Warning: mktime() expects parameter 5 to be long, string given in /var/www/index.php on line 75" 4 пъти отгоре на календара ?
d_badboy на 01.05 2007 в 12:05ч.
[quote="lyubo"]function calender_isToday($day, $month, $year) {
$beg = mktime(0, 0, 0, $month, $day, $year);
>>>> $end = mktime(0, 0, 0, $month, $day 1, $year);
Solano на 12.09 2007 в 18:52ч.
Според мен щеше да е по-добре ако не беше накъсал кода.Не мога да го сглобя как трябва

Регистрирайте се, за да добавите коментар


Калдейта ЕООД - © 2003-2010. Всички права запазени.
Препоръчваме: IT Новини