Оглавление

Построение календаря

Наша следующая задача — построение фактической раскладки календарных дней. Для ее решения потребуется выполнить ряд действий, перечень которых приводится ниже.
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="&nbsp;"; } 
 
            /* 
             * Если текущий день суббота, перейти в следующий ряд 
             */ 
            $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">&nbsp;</li>"; 
            ++$i; 
        } 
 
        /* 
         * Закрыть окончательный неупорядоченный список 
         */ 
        $html .= "\n\t</ul>\n\n"; 
 
        /* 
         * Возвратить HTML-разметку для вывода
         */ 
        return $html; 
    } 

 

Протестировав текущую версию этой функции, вы должны увидеть в браузере неупорядоченный список (рис. 4.5)

 

firefox календарь

Рис. 4.5. Разметка, сгенерированная функцией buildCalendar()

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити