Приднестровская поддержка XOOPS
Наша следующая задача — построение фактической раскладки календарных дней. Для ее решения потребуется выполнить ряд действий, перечень которых приводится ниже.
1. Создать новый неупорядоченный список.
2. Организовать цикл (со счетчиком итераций, счетчиком календарных дат и текущими значениями даты, месяца и года, хранящимися в переменных), который выполняется до тех пор, пока значение счетчика календарных дат остается меньшим количества дней в месяце.
3. Добавить класс fill в дни недели, предшествующие первому.
4. Добавить класс today, если текущая дата принадлежит тому же месяцу и году, что и генерируемая дата, и совпадает с ней.
5. Создать открывающий и закрывающий дескрипторы элемента списка для каждогодня.
6. Проверить, приходится ли текущая ячейка календаря на текущий месяц, и если это так, то добавить дату.
7. Проверить, является ли текущая ячейка календаря субботой, и если это так, то закрыть список и открыть новый.
8. Собрать воедино отдельные части элемента списка и присоединить их к разметке.
9. По завершении этого цикла запустить другой цикл, добавляющий заполнители дней до конца календарной недели.
10. Закрыть окончательный неупорядоченный список и возвратить разметку.
Начнем с выполнения пп. 1 и 2, добавив в метод buildCalendar() код, выделенный в приведенном ниже листинге полужирным шрифтом.
public function buildCalendar()
{
/*
* Определить месяц календаря и создать массив сокращенных обозначений
* дней недели, которые будут использованы в заголовках столбцов
*/
$cal_month = date('F Y', strtotime($this->_useDate));
$weekdays = array('Sun', 'Mon', 'Tue',
'Wed', 'Thu', 'Fri', 'Sat');
/*
* Добавить заголовок в HTML-разметку календаря
*/
$html = "\n\t<h2>$cal_month</h2>";
for ( $d=0, $labels=NULL; $d<7; ++$d )
{
$labels .= "\n\t\t<li>" . $weekdays[$d] . "</li>";
}
$html .= "\n\t<ul class="weekdays">"
. $labels . "\n\t</ul>";
/*
* Создать HTML-раэметку календаря
*/
$html .= "\n\t<ul>"; // Начать новый неупорядоченный список
for ( $i=1, $c=1, $t=date('j'), $m=date('m'), $y=date('Y');
$c<=$this->_daysInMonth; ++$i )
{
// Сюда будут помещены дополнительные операции
}
/*
* Возвратить HTML-разметку для вывода
*/
return $html;
}
Для выполнения действий, указанных в пп. 3-5, добавьте следующий код, выделенный полужирным шрифтом.
public function buildCalendar()
{
/*
* Определить месяц календаря и создать массив сокращенных
* обозначений дней недели, которые будут использованы
* в заголовках столбцов
*/
$cal_month = date('F Y', strtotime($this->_useDate));
$weekdays = array('Sun', 'Mon', 'Tue',
'Wed', 'Thu', 'Fri', 'Sat');
/*
* Добавить заголовок в HTML-разметку календаря
*/
$html = "\n\t<h2>$cal_month</h2>";
for ( $d=0, $labels=NULL; $d<7; ++$d )
{
$labels .= "\n\t\t<li>" . $weekdays[$d] . "</li>";
}
$html .= "\n\t<ul class="weekdays">"
. $labels . "\n\t</ul>";
/*
* Создать HTML-разметку календаря
*/
$html .= "\n\t<ul>"; // Start a new unordered list
for ( $i=1, $c=1, $t=date('j'), $m=date('m'), $y=date('Y');
$c<=$this->_daysInMonth; ++$i )
{
/*
* Применить класс "fill" к ячейкам календаря,
* располагающимся перед первым днем данного месяца
*/
$class = $i<=$this->_startDay ? "fill" : NULL;
/*
* Добавить класс "today"
* если дата совпадает с текущей
*/
if ( $c==$t && $m==$this->_m && $y==$this->_y )
{
$class = "today";
}
/*
* Создать открывающий и закрывающий дескрипторы элемента списка
*/
$ls = sprintf("\n\t\t<li class="%s">", $class);
$le = "\n\t\t</li>";
// Сюда будут помещены дополнительные операции
}
/*
* Возвратить HTML-разметку для вывода
*/
return $html;
}
Наконец, для выполнения действий, указанных в пп. 6-10, введите еще один дополнительный фрагмент кода, как показано ниже.
public function buildCalendar()
{
/*
* Определить месяц календаря и создать массив сокращенных
* обозначений дней недели, которые будут использованы
* в заголовках столбцов
*/
$cal_month = date('F Y', strtotime($this->_useDate));
$weekdays = array('Sun', 'Mon', 'Tue',
'Wed', 'Thu', 'Fri', 'Sat');
/*
* Добавить заголовок в HTML-разметку календаря
*/
$html = "\n\t<h2>$cal_month</h2>";
for ( $d=0, $labels=NULL; $d<7; ++$d )
{
$labels .= "\n\t\t<li>" . $weekdays[$d] . "</li>";
}
$html .= "\n\t<ul class="weekdays">"
. $labels . "\n\t</ul>";
/*
* Создать HTML-разметку календаря
*/
$html .= "\n\t<ul>"; // Start a new unordered list
for ( $i=1, $c=1, $t=date('j'), $m=date('m'), $y=date('Y');
$c<=$this->_daysInMonth; ++$i )
{
/*
* Применить класс "fill" к ячейкам календаря,
* располагающимся перед первым днем данного месяца
*/
$class = $i<=$this->_startDay ? "fill" : NULL;
/*
* Добавить класс "today"
* если дата совпадает с текущей
*/
if ( $c+1==$t && $m==$this->_m && $y==$this->_y )
{
$class = "today";
}
/*
* Создать открывающий и закрывающий дескрипторы
* элемента списка
*/
$ls = sprintf("\n\t\t<li class="%s">", $class);
$le = "\n\t\t</li>";
/*
* Добавить день месяца, идентифицирующий ячейку календаря
*/
if ( $this->_startDay<$i && $this->_daysInMonth>=$c)
{
$date = sprintf("\n\t\t\t<strong>%02d</strong>",$c++);
}
else { $date=" "; }
/*
* Если текущий день суббота, перейти в следующий ряд
*/
$wrap = $i!=0 && $i%7==0 ? "\n\t</ul>\n\t<ul>" : NULL;
/*
* Собрать разрозненные части воедино
*/
$html .= $ls . $date . $le . $wrap;
}
/*
* Добавить заполнители для завершения последней недели
*/
while ( $i%7!=1 )
{
$html .= "\n\t\t<li class="fill"> </li>";
++$i;
}
/*
* Закрыть окончательный неупорядоченный список
*/
$html .= "\n\t</ul>\n\n";
/*
* Возвратить HTML-разметку для вывода
*/
return $html;
}
Протестировав текущую версию этой функции, вы должны увидеть в браузере неупорядоченный список (рис. 4.5)
Рис. 4.5. Разметка, сгенерированная функцией buildCalendar()
Отправитель | Нити |
---|
29 пользователь(ей) активно (6 пользователь(ей) просматривают Инструкции)
Участников: 0 Гостей: 29 далее... |