PHP. Генератор календаря з підсвічуванням подій. - WiseREPORT

В одному з моїх проектів, знадобилося створити календар подій (зокрема днів народження).
Ідея дуже проста: намалювати календарик і підсвітити осередок, якщо цей день є днем ​​народження одного або декількох осіб.

Постановка задачі:
1. Згенерувати матрицю для календаря. Розробити механізм підсвічування осередків.
2. Передати числа днів народження масивом в якості першого параметра;
місяць в якості другого і рік в якості третьої.
3. Другий і третій параметр не обов'язкові. Якщо вони не передані, вважати місяць і рік поточними.
4. Передбачити можливість підсвічування «сьогодні» (наприклад, рамочка), якщо календар будується на поточний місяць.

Такі умови розроблені спеціально для універсальності. Хотілося створити щось на зразок бібліотеки, яку можна було б використовувати і в інших проектах. Наприклад якщо буде потрібно створити календар не днів народження, а будь-яких подій.

Наскільки вийшло вирішити поставлене завдання, судити вам.

код:

function calendar ($ days, $ month = 0, $ year = 0) {$ nowdate = getdate (); $ Arraytorender = array (); if ($ month> = 1 && $ month <= 12) $ nowdate [ 'mon'] = $ month; if ($ year> 0) $ nowdate [ 'year'] = $ year; $ M_start = mktime (0,0,0, $ nowdate [ 'mon'], 1, $ nowdate [ 'year']); $ First_day = getdate ($ m_start); $ Previousvalue = 0; foreach ($ days as $ row) {if ($ row - $ previousvalue> 1) {for ($ i = $ previousvalue; $ i <$ row-1; $ i ++) $ arraytorender [$ i] = 'ffffff'; } $ Arraytorender [$ row-1] = '00ff00'; $ Previousvalue = $ row; } / * Count of the days in current month * / $ sumofday = date ( 't', $ m_start); $ Countofarray = count ($ arraytorender); if ($ countofarray <$ sumofday) {for ($ i = $ countofarray; $ i <$ sumofday; $ i ++) $ arraytorender [] = 'ffffff'; } / * For change american style to european * / if ($ first_day [ 'wday'] == 0) $ first_day [ 'wday'] = 7; if ($ month == 0 && $ year == 0) $ arraytorender [$ nowdate [ 'mday'] - 1] = implode ( "", substr_replace (str_split ($ arraytorender [$ nowdate [ 'mday'] - 1] , 2), "", - 1)); / * ---------------- LETS CREATE CALENDAR ----------------- * / $ dayofweek = 0; // Global for fill first week of the month 0-th $ numberofweek = 0; // Global for fill last week of the month trailing 0-th / * Filling first week with 0, if first day is not monday * / for ($ i = 0; $ i <$ first_day [ 'wday'] - 1; $ i ++) {$ calendar [0] [$ i] = 0; $ Dayofweek ++; } / * Filling current month with colors * / foreach ($ arraytorender AS $ value) {if ($ dayofweek> 6) {$ numberofweek ++; $ Dayofweek = 0; } $ Calendar [$ numberofweek] [$ dayofweek] = $ value; $ Dayofweek ++; } / * Filling last week of the month trailing 0-th * / for ($ i = $ dayofweek; $ i <7; $ i ++) $ calendar [$ numberofweek] [$ i] = 0; / * -------------------- END OF CREATE CALENDAR ---------------------- * / return $ calendar; }

Використовуємо наступним чином:

$ Daysofbday = array (10, 15, 16, 22); $ Bcalendar = calendar ($ daysofbday);

У змінній $ bcalendar отримуємо масив.

print_r ($ bcalendar); Array ([0] => Array ([0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => ffffff [5] => ffffff [6] => ffffff) [1] => Array ([0] => ffffff [1] => ffffff [2] => ffffff [3] => ffffff [4] => ffffff [5] => ffffff [6] => 00ff00) [2] => Array ([0] => ffffff [1] => ffffff [2] => ffffff [3] => ffffff [4] => 00ff00 [5] => 00ff00 [6] => ffffff) [3] => Array ([0] => ffffff [1] => ffffff [2] => ffffff [3] => ffffff [4] => 00ff00 [5] => ffffff [6] => ffffff) [4] => Array ([0] => ffffff [1] => ffffff [2] => fff [3] => ffffff [4] => 0 [5] => 0 [6] => 0))

Неважко здогадатися, що зовнішній масив являє собою тижні, тоді як внутрішній - дні.
Значення 0 означає порожні дні тижня. Свого роду маячки, за якими малювати порожні клітинки.
Інші елементи містять колір осередки. Якщо існує хоч одна подія (день народження),
присвоюється зелений колір.

Зверніть увагу на колір з 3-х символів! Це поточний день, простіше кажучи «сьогодні». При виведенні на екран можна легко визначити його за допомогою простого умови strlen і додати відповідний стиль. Наприклад, рамочку або виділити число жирним шрифтом.

Тепер коли розібралися з тим, що повертає функція, можна накидати простенький сценарій безпосереднього виведення. На істину не претендує, просто як приклад:

<Table border = "1"> <th> сб. </ Th> <th> пн. </ Th> <th> пор. </ Th> <th> чт. </ Th> <th> пунктів. < / th> <th style = "color: # ff0000;"> зб. </ th> <th style = "color: # ff0000;"> нд. &lt;/ th> <? php $ i = 1; foreach ($ bcalendar as $ weeks) {echo "<tr>"; foreach ($ weeks as $ key => $ day) {if ($ day) // Якщо значення не 0. {echo "<td style = \" background: # $ day; width: 20px; height: 20px; text-align: center; "; if (strlen ($ day) == 3) // Малюємо червону рамочку для" сьогодні "echo" border: 2px solid RED; \ ">"; else echo "\"> "; if ($ key == 5 || $ key == 6) // підсвічувати вихідні червоним шрифтом. echo" <span style = \ "color: RED; \"> $ i </ span > "; else echo" <span> $ i </ span> "; echo" </ td> "; $ i ++; // Лічильник чисел.} else echo" <td> </ td> ";} echo" < / tr> ";}?> </ table>

результат:

FAQ
Q: Чому відразу не отрисовать календар в функції, і повертати готовий HTML?
A: Щоб функцію можна було використовувати з шаблонизатор.

root4root aka admin

Lt;/ th> <?
Else echo" <td> </ td> ";} echo" < / tr> ";}?

Дополнительная информация

rss
Карта