Location: PHPKode > scripts > Calendar Form > calendar-form/calendar.php
<?php

class CalendarForm {

        // &#1043;&#1086;&#1076;
        private $year;
        // &#1052;&#1077;&#1089;&#1103;&#1094;
        private $month;
        // &#1044;&#1077;&#1085;&#1100;
        private $day;
        // &#1055;&#1088;&#1080;&#1079;&#1085;&#1072;&#1082; &#1074;&#1099;&#1093;&#1086;&#1076;&#1085;&#1086;&#1075;&#1086; &#1076;&#1085;&#1103;
        private $weekend;

        // &#1060;&#1083;&#1072;&#1078;&#1086;&#1082; &#1090;&#1077;&#1082;&#1091;&#1097;&#1077;&#1081; &#1076;&#1072;&#1090;&#1099; &#1074; &#1082;&#1072;&#1083;&#1077;&#1085;&#1076;&#1072;&#1088;&#1077;
        private $currentdate;

        // &#1063;&#1080;&#1089;&#1083;&#1086; &#1076;&#1085;&#1077;&#1081; &#1074; &#1084;&#1077;&#1089;&#1103;&#1094;&#1077;
        private $dayofmonth;

        // &#1057;&#1095;&#1105;&#1090;&#1095;&#1080;&#1082; &#1076;&#1083;&#1103; &#1076;&#1085;&#1077;&#1081; &#1084;&#1077;&#1089;&#1103;&#1094;&#1072;
        // &#1042; &#1082;&#1086;&#1085;&#1089;&#1090;&#1088;&#1091;&#1082;&#1090;&#1086;&#1088;&#1077; - 1-&#1077; &#1095;&#1080;&#1089;&#1083;&#1086;(!)
        private $day_count;

        // &#1053;&#1077;&#1076;&#1077;&#1083;&#1103;
        private $num;

        // &#1052;&#1072;&#1089;&#1089;&#1080;&#1074; &#1085;&#1077;&#1076;&#1077;&#1083;&#1100;
        private $week = array();

        // &#1057;&#1090;&#1088;&#1086;&#1082;&#1072; &#1089; &#1074;&#1099;&#1074;&#1086;&#1076;&#1080;&#1084;&#1099;&#1084; &#1082;&#1086;&#1076;&#1086;&#1084; html
        private $retunrhtml="";

        // &#1050;&#1086;&#1085;&#1089;&#1090;&#1088;&#1091;&#1082;&#1090;&#1086;&#1088;
        function __construct($year, $month) {
                $this->makeWeeks($year, $month);
        }

        // &#1059;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1080;&#1090;&#1100; &#1075;&#1086;&#1076; &#1080; &#1084;&#1077;&#1089;&#1103;&#1094;
        public function setYearMonth($year, $month) {
                $this->year = $year;
                $this->month = $month;
        }

        // &#1057;&#1073;&#1088;&#1086;&#1089;&#1080;&#1090;&#1100; &#1089;&#1095;&#1077;&#1090;&#1095;&#1080;&#1082; &#1082;-&#1074;&#1072; &#1076;&#1085;&#1077;&#1081;
        private function resetDayCount() {
                $this->day_count = 1;
        }

        // &#1057;&#1073;&#1088;&#1086;&#1089;&#1080;&#1090;&#1100; &#1089;&#1095;&#1077;&#1090;&#1095;&#1080;&#1082; &#1085;&#1077;&#1076;&#1077;&#1083;&#1100;
        private function setFirstWeek() {
                $this->num = 0;
        }

        // &#1054;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1080;&#1090;&#1100; &#1082;-&#1074;&#1086; &#1076;&#1085;&#1077;&#1081; &#1074; &#1084;&#1077;&#1089;&#1103;&#1094;&#1077;
        public function getDayOfMonth($year, $month) {
                $this->resetDayCount();
                return date('t', mktime(0, 0, 0, $month, $this->day_count, $year ));
        }

        // &#1059;&#1089;&#1090;&#1072;&#1085;&#1086;&#1074;&#1080;&#1090;&#1100; &#1082;-&#1074;&#1086; &#1076;&#1085;&#1077;&#1081; &#1074; &#1084;&#1077;&#1089;&#1103;&#1094;&#1077;
        private function setDayOfMonth($year, $month) {
                $this->dayofmonth = $this->getDayOfMonth($year, $month);
        }

        // &#1042;&#1099;&#1095;&#1080;&#1089;&#1083;&#1103;&#1077;&#1084; &#1085;&#1086;&#1084;&#1077;&#1088; &#1076;&#1085;&#1103; &#1085;&#1077;&#1076;&#1077;&#1083;&#1080; &#1076;&#1083;&#1103; &#1095;&#1080;&#1089;&#1083;&#1072;
        private function getDayOfWeek() {
                return date('w', mktime(0, 0, 0, $this->month, $this->day_count, $this->year ));
        }

        // &#1042;&#1099;&#1095;&#1080;&#1089;&#1083;&#1103;&#1077;&#1090; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1081; &#1084;&#1077;&#1089;&#1103;&#1094; &#1086;&#1090; &#1090;&#1077;&#1082;&#1091;&#1097;&#1077;&#1075;&#1086; &#1082;&#1072;&#1083;&#1077;&#1085;&#1076;&#1072;&#1088;&#1085;&#1086;&#1075;&#1086;
        public function getNextMonth() {
                return date('m', mktime(0, 0, 0, $this->month, 28, $this->year )+432000);
        }

        // &#1042;&#1099;&#1095;&#1080;&#1089;&#1083;&#1103;&#1077;&#1090; &#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1081; &#1075;&#1086;&#1076; &#1086;&#1090; &#1090;&#1077;&#1082;&#1091;&#1097;&#1077;&#1075;&#1086; &#1082;&#1072;&#1083;&#1077;&#1085;&#1076;&#1072;&#1088;&#1085;&#1086;&#1075;&#1086;
        public function getNextYear() {
                return date('Y', mktime(0, 0, 0, $this->month, 28, $this->year )+432000);
        }

        // &#1042;&#1099;&#1095;&#1080;&#1089;&#1083;&#1103;&#1077;&#1090; &#1087;&#1088;&#1077;&#1076;&#1099;&#1076;&#1091;&#1097;&#1080;&#1081; &#1084;&#1077;&#1089;&#1103;&#1094; &#1086;&#1090; &#1090;&#1077;&#1082;&#1091;&#1097;&#1077;&#1075;&#1086; &#1082;&#1072;&#1083;&#1077;&#1085;&#1076;&#1072;&#1088;&#1085;&#1086;&#1075;&#1086;
        public function getPrevMonth() {
                return date('m', mktime(0, 0, 0, $this->month, 1, $this->year )-432000);
        }

        // &#1042;&#1099;&#1095;&#1080;&#1089;&#1083;&#1103;&#1077;&#1090; &#1087;&#1088;&#1077;&#1076;&#1099;&#1076;&#1091;&#1097;&#1080;&#1081; &#1075;&#1086;&#1076; &#1086;&#1090; &#1090;&#1077;&#1082;&#1091;&#1097;&#1077;&#1075;&#1086; &#1082;&#1072;&#1083;&#1077;&#1085;&#1076;&#1072;&#1088;&#1085;&#1086;&#1075;&#1086;
        public function getPrevYear() {
                return date('Y', mktime(0, 0, 0, $this->month, 1, $this->year )-432000);
        }

        // &#1060;&#1086;&#1088;&#1084;&#1080;&#1088;&#1091;&#1077;&#1084; &#1084;&#1072;&#1089;&#1089;&#1080;&#1074; &#1085;&#1077;&#1076;&#1077;&#1083;&#1100;
        private function makeWeeks($year, $month) {

                $this->setYearMonth($year, $month);
                $this->setDayOfMonth($this->year, $this->month);
                $this->setFirstWeek();

                // 1. &#1055;&#1077;&#1088;&#1074;&#1072;&#1103; &#1085;&#1077;&#1076;&#1077;&#1083;&#1103;
                $this->num = 0;
                for($i = 0; $i < 7; $i++) {
                        // &#1042;&#1099;&#1095;&#1080;&#1089;&#1083;&#1103;&#1077;&#1084; &#1085;&#1086;&#1084;&#1077;&#1088; &#1076;&#1085;&#1103; &#1085;&#1077;&#1076;&#1077;&#1083;&#1080; &#1076;&#1083;&#1103; &#1095;&#1080;&#1089;&#1083;&#1072;
                        $dayofweek = $this->getDayOfWeek();
                        // &#1055;&#1088;&#1080;&#1074;&#1086;&#1076;&#1080;&#1084; &#1082; &#1095;&#1080;&#1089;&#1083;&#1072; &#1082; &#1092;&#1086;&#1088;&#1084;&#1072;&#1090;&#1091; 1 - &#1087;&#1086;&#1085;&#1077;&#1076;&#1077;&#1083;&#1100;&#1085;&#1080;&#1082;, ..., 6 - &#1089;&#1091;&#1073;&#1073;&#1086;&#1090;&#1072;
                        $dayofweek = $dayofweek - 1;
                        if($dayofweek == -1) $dayofweek = 6;
                        if($dayofweek == $i) {
                                // &#1045;&#1089;&#1083;&#1080; &#1076;&#1085;&#1080; &#1085;&#1077;&#1076;&#1077;&#1083;&#1080; &#1089;&#1086;&#1074;&#1087;&#1072;&#1076;&#1072;&#1102;&#1090;,
                                // &#1079;&#1072;&#1087;&#1086;&#1083;&#1085;&#1103;&#1077;&#1084; &#1084;&#1072;&#1089;&#1089;&#1080;&#1074; $this->week
                                // &#1095;&#1080;&#1089;&#1083;&#1072;&#1084;&#1080; &#1084;&#1077;&#1089;&#1103;&#1094;&#1072;
                                $this->week[$this->num][$i] = $this->day_count;
                                $this->day_count++;
                        } else {
                                $this->week[$this->num][$i] = "";
                        }
                }
                // 2. &#1055;&#1086;&#1089;&#1083;&#1077;&#1076;&#1091;&#1102;&#1097;&#1080;&#1077; &#1085;&#1077;&#1076;&#1077;&#1083;&#1080; &#1084;&#1077;&#1089;&#1103;&#1094;&#1072;
                while(true) {
                        $this->num++;
                        for($i = 0; $i < 7; $i++) {
                                $this->week[$this->num][$i] = $this->day_count;
                                $this->day_count++;
                                // &#1045;&#1089;&#1083;&#1080; &#1076;&#1086;&#1089;&#1090;&#1080;&#1075;&#1083;&#1080; &#1082;&#1086;&#1085;&#1094;&#1072; &#1084;&#1077;&#1089;&#1103;&#1094;&#1072; - &#1074;&#1099;&#1093;&#1086;&#1076;&#1080;&#1084;
                                // &#1080;&#1079; &#1094;&#1080;&#1082;&#1083;&#1072;
                                if($this->day_count > $this->dayofmonth) break;
                        }
                        // &#1045;&#1089;&#1083;&#1080; &#1076;&#1086;&#1089;&#1090;&#1080;&#1075;&#1083;&#1080; &#1082;&#1086;&#1085;&#1094;&#1072; &#1084;&#1077;&#1089;&#1103;&#1094;&#1072; - &#1074;&#1099;&#1093;&#1086;&#1076;&#1080;&#1084;
                        // &#1080;&#1079; &#1094;&#1080;&#1082;&#1083;&#1072;
                        if($this->day_count > $this->dayofmonth) break;
                }

        }

        // &#1047;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1086;&#1082; &#1082;&#1072;&#1083;&#1077;&#1085;&#1076;&#1072;&#1088;&#1103;
        public function getCalendarHeader() {
                $this->retunrhtml =
                                                "<table cellpadding=2 cellspacing=0 border=1 style=\"margin-left: auto; margin-right: 0px;\">".
                                                "<tbody>".
                                                "<tr><th colspan=\"7\">".$this->month."/".$this->year."</th></tr>".
                                                "<tr>".
                                                "<th style=\"text-align: center;\">&#1055;&#1085;</th>".
                                                "<th style=\"text-align: center;\">&#1042;&#1090;</th>".
                                                "<th style=\"text-align: center;\">&#1057;&#1088;</th>".
                                                "<th style=\"text-align: center;\">&#1063;&#1090;</th>".
                                                "<th style=\"text-align: center;\">&#1055;&#1090;</th>".
                                                "<th style=\"text-align: center;\"><span style=\"color: rgb(255, 0, 0);\">&#1057;&#1073;</span></th>".
                                                "<th style=\"text-align: center;\"><span style=\"color: rgb(255, 0, 0);\">&#1042;&#1089;</span></th>".
                                                "</tr>";
        }

        // &#1054;&#1082;&#1086;&#1085;&#1095;&#1072;&#1085;&#1080;&#1077; &#1082;&#1072;&#1083;&#1077;&#1085;&#1076;&#1072;&#1088;&#1103;
        public function getCalendarFooter() {
                $this->retunrhtml.="</tbody></table>";
        }

        // &#1053;&#1072;&#1095;&#1072;&#1083;&#1086; &#1085;&#1086;&#1074;&#1086;&#1081; &#1085;&#1077;&#1076;&#1077;&#1083;&#1080;
        public function getBeginTR() {
                $this->retunrhtml.="<tr>";
        }

        // &#1050;&#1086;&#1085;&#1077;&#1094; &#1085;&#1077;&#1076;&#1077;&#1083;&#1080;
        public function getEndTR() {
                $this->retunrhtml.="</tr>";
        }

        // &#1054;&#1073;&#1088;&#1072;&#1076;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1084;&#1099;&#1081; &#1076;&#1077;&#1085;&#1100;
        protected function getDay() {
                return $this->day;
        }

        // &#1054;&#1073;&#1088;&#1072;&#1076;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1084;&#1099;&#1081; &#1084;&#1077;&#1089;&#1103;&#1094;
        protected function getMonth() {
                return $this->month;
        }

        // &#1054;&#1073;&#1088;&#1072;&#1076;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1084;&#1099;&#1081; &#1075;&#1086;&#1076;
        protected function getYear() {
                return $this->year;
        }

        // &#1054;&#1073;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1084;&#1099;&#1081; &#1076;&#1077;&#1085;&#1100; - &#1074;&#1099;&#1093;&#1086;&#1076;&#1085;&#1086;&#1081;?
        protected function isWeekend() {
                return $this->weekend;
        }

        // &#1054;&#1073;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1084;&#1099;&#1081; &#1076;&#1077;&#1085;&#1100; - &#1090;&#1077;&#1082;&#1091;&#1097;&#1080;&#1081;?
        protected function isCurrent() {
                return $this->currentdate;
        }

        // &#1047;&#1085;&#1072;&#1095;&#1077;&#1085;&#1080;&#1077; &#1103;&#1095;&#1077;&#1081;&#1082;&#1080;
        public function getTDHref() {
                return $this->getDay();
        }

        // &#1071;&#1095;&#1077;&#1081;&#1082;&#1072; &#1073;&#1091;&#1076;&#1085;&#1077;&#1075;&#1086; &#1076;&#1085;&#1103;
        public function getTD() {
                $td="td"; if ($this->isCurrent()) $td="th";
                $this->retunrhtml.="<$td style=\"text-align: right;\">".$this->getTDHref()."</$td>";
        }

        // &#1071;&#1095;&#1077;&#1081;&#1082;&#1072; &#1074;&#1099;&#1093;&#1086;&#1076;&#1085;&#1086;&#1075;&#1086; &#1076;&#1085;&#1103;
        public function getTDWeekend() {
                $td="td"; if ($this->isCurrent()) $td="th";
                $this->retunrhtml.="<$td style=\"text-align: right;\"><font color=red>".$this->getTDHref()."</font></$td>";
        }

        // &#1055;&#1086;&#1083;&#1091;&#1095;&#1080;&#1090;&#1100; &#1082;&#1086;&#1076; &#1090;&#1072;&#1073;&#1083;&#1080;&#1094;&#1099; &#1082;&#1072;&#1083;&#1077;&#1085;&#1076;&#1072;&#1088;&#1103;
        protected function makeCodeMonth($year, $month) {
                $this->makeWeeks($year, $month);
                $this->getCalendarHeader();
                for($i = 0; $i < count($this->week); $i++) {
                        $this->getBeginTR();
                        for($j = 0; $j < 7; $j++) {

                                if(!empty($this->week[$i][$j])) {
                                        // &#1054;&#1073;&#1085;&#1086;&#1074;&#1083;&#1103;&#1077;&#1084; &#1080;&#1085;&#1092;&#1086;&#1088;&#1084;&#1072;&#1094;&#1080;&#1102; &#1087;&#1086; &#1086;&#1073;&#1088;&#1072;&#1073;&#1072;&#1090;&#1099;&#1074;&#1077;&#1084;&#1086;&#1084;&#1091; &#1076;&#1085;&#1102;
                                        $this->day = $this->week[$i][$j];
                                        // &#1045;&#1089;&#1083;&#1080; &#1080;&#1084;&#1077;&#1077;&#1084; &#1076;&#1077;&#1083;&#1086; &#1089; &#1090;&#1077;&#1082;&#1091;&#1097;&#1080;&#1084; &#1076;&#1085;&#1077;&#1084;
                                        $this->currentdate = 0;
                                        if ( $this->year==date('Y') && $this->month==date('m') && $this->day==date('j')) $this->currentdate = 1;
                                        // &#1045;&#1089;&#1083;&#1080; &#1080;&#1084;&#1077;&#1077;&#1084; &#1076;&#1077;&#1083;&#1086; &#1089; &#1089;&#1091;&#1073;&#1073;&#1086;&#1090;&#1086;&#1081; &#1080; &#1074;&#1086;&#1089;&#1082;&#1088;&#1077;&#1089;&#1077;&#1085;&#1100;&#1103; &#1087;&#1086;&#1076;&#1089;&#1074;&#1077;&#1095;&#1080;&#1074;&#1072;&#1077;&#1084; &#1080;&#1093;
                                        if($j == 5 || $j == 6) {
                                                $this->weekend = 1;
                                                $this->getTDWeekend();
                                        } else {
                                                $this->weekend = 0;
                                                $this->getTD();
                                        }

                                } else $this->retunrhtml.="<td>&nbsp;</td>";

                        }
                        $this->getEndTR();
                }
                $this->getCalendarFooter();
        }

        // &#1055;&#1086;&#1083;&#1091;&#1095;&#1080;&#1090;&#1100; html-&#1082;&#1086;&#1076; &#1086;&#1073;&#1088;&#1072;&#1076;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1084;&#1086;&#1075;&#1086; &#1084;&#1077;&#1089;&#1103;&#1094;&#1072;
        public function getCodeMonth() {
                $this->makeCodeMonth($this->year, $this->month);
                return $this->retunrhtml;
        }

        // &#1042;&#1099;&#1074;&#1077;&#1089;&#1090;&#1080; html-&#1082;&#1086;&#1076; &#1086;&#1073;&#1088;&#1072;&#1076;&#1072;&#1090;&#1099;&#1074;&#1072;&#1077;&#1084;&#1086;&#1075;&#1086; &#1084;&#1077;&#1089;&#1103;&#1094;&#1072;
        public function showCodeMonth() {
                echo $this->getCodeMonth();
        }

}

class TechCalendarForm extends CalendarForm {
        public function getTDHref() {
                if ($this->isWeekend()) $font = "<font color=\"#FF3F4F\">"; else $font = "<font color=\"#4A5B6C\">";
                return "<a href=\"".$_SERVER["PHP_SELF"]."?action=showdate&date=".parent::getYear()."-".parent::getMonth()."-".parent::getDay()."\">".$font.parent::getDay()."</font></a>";
        }
}

?>
Return current item: Calendar Form