喜悦国际村 » 代码共享 » 【原创】一个实用日历类 Calendar v1.0

页: [1]
murder2004-11-22 11:13 AM
【原创】一个实用日历类 Calendar v1.0

[IMG]http://www.phpclan.net/codelib/1/cal.gif[/IMG]
大家给点意见,到目前form提交日期还没有增加验证功能,大家有兴趣可以自己修改。
[URL=http://www.phpclan.net/codelib/1/caltest.php]查看演示[/URL]
[PHP]
<?php

# 实用日历类 Calendar v1.0
# 作者 : Murder.XP
# QQ :7853151
# Email : [email]Murder_XP@126.com[/email]
# Finished : 10/3/2004

###############################################
#                                      使 用 说 明                                    #
###############################################
#                                                                                          #
#      本程序由Murder.XP(murder_xp@126.com)设计编写,保留     #
#        最终解释权,在保留版权条件下提供对个人网站及非赢利性费网站    #
#  的免费使用权,任何对基于本程序进行的修改,删除,增加    #
#  行为都请保留本人版权信息。                                              #
#                                                                                                                                                                                    #
###############################################

/*
实用Calendar v1.0 类 介绍

1.可自定义样式,使用继承方式或直接修改类属性。
2.完全不用考虑用户GET变量,Calendar类自动保存传递用户GET变量。
3.日期范围 1970-2037 年。
4.用户可动态的删除,增加URL变量,提供更大灵活性。
5.提供相关方法返回各种格式日期满足用户对数据库进行操作。
6.支持直接日期跳转。

//相关用户函数
$cal->PrintCalJumper(); //输出跳转窗体
$cal->SetSpliter($spliter); //设定日历GET变量格式所用分隔符 默认为 'x' ex. 2004x10x3。

echo $cal->GetCurDateFormat(); //获取当前日期的查询格式 ex. 2004-10-03。
echo $cal->GetDateFormat($y,$m,$d) //返回指定日期的查询格式 ex. 2004-10-03。
echo $cal->GetCurYear();//返回当前年份。
echo $cal->GetCurMonth();//返回当前月份。
echo $cal->GetCurDay();//返回当前日。

$cal->AddQueryParam($strName,$strVal) //追加一个URL查询参数 ex. $strName 对应 a,$strVal 对应 1,日期更新时自动追加URL参数a=1。
$cal->ClearQueryString(); //清除所有附加查询字符串。
echo $cal->GetQueryString(); //获取附加查询字符串 ex. a=1&b=2。

//简单使用方法
include_once('Calendar.php');

$cal=new Calendar(); //定义Canlendar对象。
$cal->Display(); //显示日历

//推荐使用方法

(1)继承Calendar类
Class  myCal extends Calendar
{
        // 重载以下样式属性 并自定义属性值
        //cal style config
        var $calborder=0;
        var $calbg='#EEEEEE';
        var $calcellspacing=1;
        var $calcellpadding=2;
        var $calwidth=220;

        var $headerbg='#EEEEEE';
        var $headerheight=20;
        var $headerfontcolor='#444444';
        var $headerlinkstyle='linkheader';
       
        var $titlebg='#CCCCCC';
        var $titlefontcolor='#FFFFFF'; //星期‘日’ 默认为 红色,不可以修改
        var $titlelinkstyle='linktitle';  #链接样式(外部css文件)
        var $titleheight=24;
               
        //link style
        var $LinkDefault='linkdefault';  #链接样式(外部css文件)
        var $LinkToday='linktoday';  #链接样式(外部css文件)
        var $LinkSelect='linkselect';  #链接样式(外部css文件)
        var $LinkHeaderBack='linktitle';  #链接样式(外部css文件)

        var $colalign='center';
        var $colbgcolor='#DDDDDD';
        var $colblankcellcolor='#EEEEEE';
        var $collinkstyle='linkdefault';     #链接样式(外部css文件)  
        var $colbgcolortoday='#CC6600';
        var $colbgcolorselect='#FFFFFF';
       
        var $jumpborder=0;
        var $jumpcellbg='';
        var $jumpcellspacing=0;
        var $jumpcellpadding=0;
        var $jumpwidth=220;
        var $jumpheight=30;
        var $jumpbg='';
}

定义css文件 cal.css
这里仅列举一个样式
a.linkdefault
{
        font-size:14px;
        font-weight:light;
        text-decoration:none;
        color:#000000;
}

a.linkdefault:hover
{
        color:#000000;
        font-size:14px;
        font-style:italic;
        font-weight:light;
        text-decoration:underline;
}

include_once('Calendar.php');

$cal=new Calendar();

//$param_name1='a';$param_value1=1;
//$param_name2='b';$param_value2=2;
//$cal->AddQueryParam($param_name1,$param_value1);
//$cal->AddQueryParam($param_name2,$param_value2);

$cal->Display();//显示日历

echo $cal->GetCurDateFormat(); // output: 2004-10-03
$cal->PrintCalJumper();//显示跳转窗体
echo $cal->GetQueryString(); // output: a=1&b=2&
*/

Class Calendar
{
        //cal vars
        var $year;
        var $month;
        var $day;
        var $DayOfMonthStart; //每月开始第一天是星期几 0-6 ,对应header: 日-六
        var $CurDate;
        var $err='';       
        var $spliter='x';
        var $DaysHaveLink=Array();
        var $QueryString='';
        var $WeekTitle=Array('日','一','二','三','四','五','六');
        var $DaysPerMonth;

        //cal style config
        var $calborder=0;
        var $calbg='#EEEEEE';
        var $calcellspacing=1;
        var $calcellpadding=2;
        var $calwidth=220;

        var $headerbg='#EEEEEE';
        var $headerheight=20;
        var $headerfontcolor='#444444';
        var $headerlinkstyle='linkheader';
       
        var $titlebg='#CCCCCC';
        var $titlefontcolor='#FFFFFF'; //星期‘日’ 默认为 红色,不可以修改
        var $titlelinkstyle='linktitle'; //set css tagname from css file
        var $titleheight=24;
               
        //link style
        var $LinkDefault='linkdefault';
        var $LinkToday='linktoday';
        var $LinkSelect='linkselect';
        var $LinkHeaderBack='linktitle';

        var $colalign='center';
        var $colbgcolor='#DDDDDD';
        var $colblankcellcolor='#EEEEEE';
        var $collinkstyle='linkdefault';
        var $colbgcolortoday='#CC6600';
        var $colbgcolorselect='#FFFFFF';
       
        var $jumpborder=0;
        var $jumpcellbg='';
        var $jumpcellspacing=0;
        var $jumpcellpadding=0;
        var $jumpwidth=220;
        var $jumpheight=30;
        var $jumpbg='';

        //functions
        function Calendar()
        {
                $this->CurDate=getdate();//设定当前系统日期
                //设定查询字符串
                if(!empty($_SERVER['QUERY_STRING']))
                {
                        $q=explode("&",$_SERVER['QUERY_STRING']);
                        foreach($q as $qs)
                        {
                                $kv=explode("=",$qs);
                                if($kv[0]!='caldate')
                                {
                                        $this->QueryString.=$qs."&";
                                }
                        }
                }

                if(empty($_GET['caldate']))
                {       
                        $tmpdate=getdate();
                        $this->year=$tmpdate['year'];
                        $this->month=$tmpdate['mon'];
                        $this->day=$tmpdate['mday'];
                        unset($tmpdate);
                }
                else
                {
                        if($this->CheckGetDate($_GET['caldate']))
                        {
                                $tmpdate=explode($this->spliter,$_GET['caldate']);
                                $this->year=$tmpdate[0];
                                $this->month=$tmpdate[1];
                                $this->day=$tmpdate[2];
                                unset($tmpdate);
                        }
                        else
                        {
                                $this->ErrorDisplay();
                        }
                }
                $FirstDay=getdate(mktime(0,0,0,$this->month,1,$this->year));
                $this->DayOfMonthStart=$FirstDay['wday']; //0-6
                $this->DaysPerMonth=date("t",mktime(0,0,0,$this->month,1,$this->year));//设定当月天数
        }
       
        function CheckGetDate($caldate)
        {
                $td=explode($this->spliter,$caldate);
                $y=$td[0];
                $m=$td[1];
                $d=$td[2];
                $isError=false;
                $cyear=intval($y);
                if($cyear>2037||$cyear<1970)
                {
                        $isError=true;
                        $this->err.="年份超过范围,请控制在1970-2037内。<br />";
                }
                if(intval($m)<1||intval($m)>12)
                {
                        $isError=true;
                        $this->err.="月份设置错误!<br />";
                }
                if(intval($d)>31/*$this->DaysPerMonth*/||intval($d)<1)
        {
//                        $this->DaysPerMonth=date("t",mktime(0,0,0,$this->month,1,$this->year));//设定当月天数
            $isError=true;
            $this->err.="日期超出范围!<br />";
        }
        if($isError)
        {
                        return false;
        }
                else
                {
                        return true;
                }
                unset($y,$m,$d,$td,$isError);
    }

        function PrintCalHeader()
        {
                echo "<table border=\"$this->calborder\" cellspacing=\"$this->calcellspacing\" cellpadding=\"$this->calcellpadding\" width=\"$this->calwidth\" bgcolor=\"$this->calbg\">\n";
                //cal header,display current date (year & month)
                echo "<tr>\n";
                echo "<td bgcolor=\"$this->headerbg\" align=\"center\" height=\"$this->headerheight\" colspan=\"7\">";

                $lastyear=$this->year-1;
                $nextyear=$this->year+1;
                $day=$this->day;
                $UrlQueryStringLastYear=$this->QueryString."caldate=".$lastyear.$this->spliter.$this->month.$this->spliter.$this->day;
                $UrlQueryStringNextYear=$this->QueryString."caldate=".$nextyear.$this->spliter.$this->month.$this->spliter.$this->day;

                echo "<a href=\"".$_SERVER['PHP_SELF']."?".$UrlQueryStringLastYear."\" title=\"上一年\" class=\"$this->headerlinkstyle\">&lt;&lt;</a>\n";
                echo "<font color=\"$this->headerfontcolor\">";
                echo $this->year;
                echo "&nbsp;</font>";
                echo "<a href=\"".$_SERVER['PHP_SELF']."?".$UrlQueryStringNextYear."\" title=\"下一年\" class=\"$this->headerlinkstyle\">&gt;&gt;</a>\n";

        echo "&nbsp;";

                $lastmonth = $this->month - 1;
                $nextmonth = $this->month + 1;

        $lastyear=$this->year;
        $nextyear=$this->year;

                if($lastmonth<1)
                {
                        $lastmonth=12;
                        $lastyear=$lastyear-1;
                }
                if($nextmonth>12)
                {
                        $nextmonth=1;
                        $nextyear=$nextyear+1;
                }
               
                $UrlQueryStringLastMonth=$this->QueryString.$this->GetGetFormat($lastyear,$lastmonth,$this->day);
                $UrlQueryStringNextMonth=$this->QueryString.$this->GetGetFormat($nextyear,$nextmonth,$this->day);
                echo "<a href=\"".$_SERVER['PHP_SELF']."?".$UrlQueryStringLastMonth."\" class=\"$this->headerlinkstyle\" title=\"上一月\">&lt;&lt;</a>\n";
                echo "<font color=\"$this->headerfontcolor\">";
                echo $this->month;
                echo "&nbsp;</font>";
                echo "<a href=\"".$_SERVER['PHP_SELF']."?".$UrlQueryStringNextMonth."\" class=\"$this->headerlinkstyle\" title=\"下一月\">&gt;&gt;</a>\n";
                $backlink=$_SERVER['PHP_SELF']."?".$this->QueryString.$this->GetGetFormat($this->GetCurYear(),$this->GetCurMonth(),$this->GetCurDay());
                        echo "<a href=\"".$backlink."\" class=\"$this->LinkHeaderBack\" title=\"定位日历到今天\">今天</a>";
                echo "</td>\n";
                echo "</tr>\n";
        }
       
        //输出头部: 日 - 六
        function PrintCalWeekTitle()
        {
                echo "<tr>\n";
                for($i=0;$i<7;$i++)
                {
                        echo "<td align=\"$this->colalign\" bgcolor=\"$this->titlebg\" height=\"$this->titleheight\">";
                        echo "<font color=\"";
                        if($i==0)
                        {
                                echo "#CC0033";
                        }
                        else
                        {
                                echo $this->titlefontcolor;
                        }
                        echo "\">";
                        echo $this->WeekTitle[$i];
                        echo "</font>";
                        echo "</td>\n";
                }
                echo "</tr>\n";
        }
       
        //打印日历表
        function PrintCalBody()
        {
                //计算本月天数
                $MonthLength=$this->DaysPerMonth;
                //Print start
                echo "<tr>\n";
                //循环打印1号开始前的所有空格
                $line=1;
                $countday=1;
        //打印日期开始前的空(一声)格
                for($i=0;$i<$this->DayOfMonthStart;$i++)
                {
                        echo "<td align=\"$this->colalign\" bgcolor=\"$this->colblankcellcolor\">&nbsp;</td>\n";
                        $line++;
                }
                $add=7-intval($line);
        //打印第一行
                for($j=0;$j<$add;$j++)
                {
                        echo "<td align=\"$this->colalign\" bgcolor=\"";
                        if($this->IsToday($countday,$this->month,$this->year))
                        {
                                echo $this->colbgcolortoday;
                        }
                        else if($this->day==$countday) //如果为选定日
                        {
                                echo $this->colbgcolorselect;
                        }
                        else
                        {
                                echo $this->colbgcolor;
                        }
                        echo "\">";

                        echo "<a href=\"".$_SERVER['PHP_SELF']."?";
                        echo $this->QueryString;
                        echo $this->GetGetFormat($this->year,$this->month,$countday);
                        echo "\"";
                        echo " class=\"";
                        if($this->IsToday($countday,$this->month,$this->year))
                        {
                                echo $this->LinkToday;
                        }
                        else if($this->day==$countday) //如果为选定日
                        {
                                echo $this->LinkSelect;
                        }
                        else
                        {
                                echo $this->LinkDefault;
                        }
                        echo "\" title=\"";
                        echo $this->GetDateFormat($this->year,$this->month,$countday);
                        echo "\">";
                        echo $countday;
                        echo "</a>";
                        echo "</td>\n";
                        if($line%7==0)
                                echo "</tr>\n<tr>\n";
                        $line++;
                        $countday++;
                }

        //打印日历主体
                while($countday<=$MonthLength)
                {
                        echo "<td align=\"$this->colalign\" bgcolor=\"";
                        if($this->IsToday($countday,$this->month,$this->year))
                        {
                                echo $this->colbgcolortoday;
                        }
                        else if($this->day==$countday) //如果为选定日
                        {
                                echo $this->colbgcolorselect;
                        }
                        else
                        {
                                echo $this->colbgcolor;
                        }
                        echo "\">";
                       
                        echo "<a href=\"".$_SERVER['PHP_SELF']."?";
                        echo $this->QueryString;
                        echo $this->GetGetFormat($this->year,$this->month,$countday);
                        echo "\"";
                        echo " class=\"";
                        if($this->IsToday($countday,$this->month,$this->year))
                        {
                                echo $this->LinkToday;
                        }
                        else if($this->day==$countday) //如果为选定日
                        {
                                echo $this->LinkSelect;
                        }
                        else
                        {
                                echo $this->LinkDefault;
                        }
                        echo "\" title=\"";
                        echo $this->GetDateFormat($this->year,$this->month,$countday);
                        echo "\">";
                        echo $countday;
                        echo "</a>";
                        echo "</td>\n";
                        if($line%7==0)
                        {
                                echo "</tr>\n<tr>\n";
                        }
                        $line++;
                        $countday++;
                }
                //打印最后一行剩余空(一声)格
                //计算最后一天是最后一个星期的第几天
                $tmpdate=getdate(mktime(0,0,0,$this->month,$MonthLength,$this->year));
                $DayOfLastWeek=$tmpdate['wday'];
                $lastc=7-$DayOfLastWeek;
                for($n=1;$n<$lastc;$n++)
                {
                        echo "<td bgcolor=\"$this->colblankcellcolor\">&nbsp;</td>\n";
                }
                echo "</tr></table>";
        }

        function PrintCalJumper()
        {
                echo "<table border=\"$this->jumpborder\" cellspacing=\"$this->jumpcellspacing\" cellpadding=\"$this->jumpcellpadding\" width=\"$this->jumpwidth\" bgcolor=\"$this->jumpbg\">\n";
                echo "<tr>\n";
                echo "<td align=\"left\" bgcolor=\"$this->jumpcellbg\" height=\"$this->jumpheight\">";
                echo "<form id=\"CalJumper\" name=\"CalJumper\">";
                echo "<input type=\"text\" name=\"year\" size=\"4\" maxlength=\"4\">";
                echo "-";
                echo "<input type=\"text\" name=\"month\" size=\"2\" maxlength=\"2\">";
                echo "-";
                echo "<input type=\"text\" name=\"day\" size=\"2\" maxlength=\"2\">";
                echo "&nbsp;";
                echo "<input type=\"button\" value=\"跳转到\" onclick=\"javascript:caljump();\">";
                echo "</form>";
                echo "</td></tr>\n";
                echo "</table>\n";

                echo "<script language=\"javascript\">\n";
                echo "<!--\n";
                echo "function caljump()\n";
                echo "{\n";
                echo "        location.href=\"http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?".$this->QueryString."\"";
                echo " + \"caldate=\" + document.CalJumper.year.value + \"".$this->spliter."\" + document.CalJumper.month.value + \"".$this->spliter."\" + document.CalJumper.day.value\n";
                echo "}\n";
                echo "//-->\n";
                echo "</script>\n";
        }

        function Display()
        {
                $this->PrintCalHeader();
                $this->PrintCalWeekTitle();
                $this->PrintCalBody();
        }

        function AddQueryParam($strName,$strVal) //追加一个URL查询参数
        {
                $this->QueryString.=$strName.$this->spliter.$strVal.'&';
        }

        function GetQueryString()
        {
                return $this->QueryString;
        }

        function ClearQueryString()
        {
                $this->QuertyString = Array();
        }

        function ErrorDisplay($errstr='') //Call your error display function here
        {
                //include_once('common.php');
                //ShowErrorMsg($errstr);
                if(empty($errstr))
                {
                        echo $this->err;
                }
                else
                {
                        echo $errstr;
                }
                exit;
        }

/* Optional function
        function IsLeapYear($y)
        {
                if(intval($y)%4==0)
                        return true;
                else
                        return false;
        }
*/       
        function GetCurDateFormat() //返回当前选定日期的查询格式
        {
                $CurYear=$this->year;
                $CurMonth=($this->month > 9) ? $this->month : "0".$this->month;
                $CurDay=($this->day > 9) ? $this->day : "0".$this->day;
                return $CurYear."-".$CurMonth."-".$CurDay;
        }
       
        function GetDateFormat($y,$m,$d) //返回指定日期的查询格式
        {
                $CurYear=$y;
                $CurMonth=($m > 9) ? $m : "0".$m;
                $CurDay=($d > 9) ? $d : "0".$d;
                return $CurYear."-".$CurMonth."-".$CurDay;
        }

        function GetCurYear()
        {
                return $this->CurDate['year'];
        }

        function GetCurMonth()
        {
                return $this->CurDate['mon'];
        }

        function GetCurDay()
        {
                return $this->CurDate['mday'];
        }

        function IsToday($d,$m,$y)
        {
                if($this->GetCurDay()==$d && $this->GetCurMonth()==$m && $this->GetCurYear()==$y)
                {
                        return true;
                }
                else
                {
                        return false;
                }
        }

        function GetGetFormat($y,$m,$d)
        {
                return "caldate=".$y.$this->spliter.$m.$this->spliter.$d;
        }

        function SetSpliter($spliter)
        {
                if(empty($spliter))
                {
                        $this->spliter='x';
                }
                else
                {
                        $this->spliter=$spliter;
                }
        }
}
?>[/PHP]


查看完整版本: 【原创】一个实用日历类 Calendar v1.0


Powered by Discuz! Archiver 6.1.0  © 2001-2006 Comsenz Inc.
Processed in 0.007822 second(s), 2 queries