Calendar

Add-On Calendar

Informations

Author:BKW
License: FPDF

Description

This class will print a USA calendar that is easy to extend for other countries.

Source

<?php
require_once("fpdf.php");

class PDF_USA_Calendar extends FPDF
{
protected $date;
protected $squareHeight;
protected $squareWidth;
protected $longestMonth;
protected $tinySquareSize;
protected $headerFontSize;

function __construct($orientation="L", $size="Letter")
{
    parent::__construct($orientation, "mm", $size);
    // compute longest month name
    $this->longestMonth = "";
    for ($month = 1; $month <= 12; ++$month)
        {
        $monthYear = gmdate("F Y", jdtounix($this->MDYtoJD($month, 1, 2009)));
        if (strlen($monthYear) > strlen($this->longestMonth))
            {
            $this->longestMonth = $monthYear;
            }
        }
    // compute font size
    $this->tinySquareSize = 4;
    $this->headerFontSize = 70;
    $this->SetFont("Times", "B", $this->headerFontSize);
    $width = $this->w - $this->lMargin - $this->rMargin;
    while ($this->GetStringWidth($this->longestMonth) > $width - $this->tinySquareSize * 22)
        {
        --$this->headerFontSize;
        $this->SetFont("Times", "B", $this->headerFontSize);
        }
}

// useful date manipulation routines

function JDtoYMD($date, &$year, &$month, &$day)
{
    $string = JDToGregorian($date);
    $month = strtok($string, " -/");
    $day = strtok(" -/");
    $year = strtok(" -/");
}

function MDYtoJD($month, $day, $year)
{
    if (! $month || ! $day || ! $year)
        return 0;
    $a = floor((14-$month)/12);
    $y = floor($year+4800-$a);
    $m = floor($month+12*$a-3);
    $jd = $day+floor((153*$m+2)/5)+$y*365;
    $jd += floor($y/4)-floor($y/100)+floor($y/400)-32045;
    return $jd;
}

function lastMonth($date)
{
    $this->JDtoYMD($date, $year, $month, $day);
    if (--$month == 0)
        {
        $month = 12;
        $year--;
        }
    return GregorianToJD($month, $day, $year);
}

function nextMonth($date)
{
    $this->JDtoYMD($date, $year, $month, $day);
    if (++$month > 12)
        {
        $month = 1;
        ++$year;
        }
    return GregorianToJD($month, $day, $year);
}

function isHoliday($date)
{
    $this->JDtoYMD($date, $year, $month, $day);
    if ($month == 7 && $day == 4)
        return "Independence Day";
    if ($month == 1 && $day == 1)
        return "New Year's Day";
    if ($month == 12 && $day == 25)
        return "Christmas";
    if ($month == 11)
        {
        $dow = gmdate("w", jdtounix($date));
        if ($day == 11 && $dow > 0 && $dow < 6) // does the eleventh fall on a weekday?
            return "Veteran's Day";
        if ($dow == 1 && ($day == 12 || $day == 13))
            return "Veteran's Day";
        }
    if ($this->isWeekHoliday($date, 4, 4, 11)) // thursday of the fourth week of November
        return "Thanksgiving";
    if ($this->isWeekHoliday($date, 1, 3, 1))
        return "MLK, Jr. Day";
    if ($this->isWeekHoliday($date, 1, 3, 2))
        return "President's Day";
    if ($this->isWeekHoliday($date, 2, 1, 11))
        return "Election Day";
    if ($this->isWeekHoliday($date, 1, 1, 9))
        return "Labor Day";
    if ($this->isWeekHoliday($date, 1, 2, 10))
        return "Columbus Day";
    if ($this->isWeekHoliday($date, 1, 99, 5))
        return "Memorial Day";
    if ($this->isWeekHoliday($date, 0, 2, 5))
        return "Mother's Day";
    if ($this->isWeekHoliday($date, 0, 3, 6))
        return "Father's Day";
    return "";
}

function isWeekHoliday($date, $dayOfWeek, $weekOfMonth, $monthOfDate)
{
    $this->JDtoYMD($date, $year, $month, $day);
    if ($monthOfDate != $month)
        return 0;
    $jd = jdtounix($date);
    $dow = gmdate("w", $jd);
    if ($dow != $dayOfWeek)
    return 0;
    $daysInMonth = gmdate("t", $jd);
    if ($weekOfMonth > 5 && $day + 6 > $daysInMonth)
        return 1;
     if ($day > ($weekOfMonth - 1) * 7 && $day <= ($weekOfMonth * 7))
        return 1;
    return 0;
}

function tinyCalendar($date, $square)
{
    $this->JDtoYMD($date, $year, $month, $day);
    // print numbers in boxes
    $wd=gmdate("w", jdtounix($date));
    $cur = $date - $wd;
    $this->SetFont("Helvetica", "B", 10);
    $monthStr = gmdate ("F", jdtounix($date))." $year";
    $this->JDtoYMD($date, $year, $month, $day);
    // save local copy of coordinates for future reference
    $x = $this->x;
    $y = $this->y;
    $this->Cell(7*$square, $square, $monthStr, 0, 0, "C");
    $y+=$square;
    $this->SetXY($x, $y);
    $this->SetFontSize(8);
    for ($i = 1; $i <= 7; ++$i)
        {
        $day = strtoupper(gmdate("l", jdtounix($this->MDYtoJD(2, $i, 2009))));
        $this->Cell($square, $square, $day[0], 0, 0, "C");
        }
    $y+=$square;
    $this->SetXY($x, $y);
    for ($k=0;$k<6;$k++)
        {
        for ($i=0;$i<7;$i++ )
            {
            $this->JDtoYMD($cur++, $curYear, $curMonth, $curDay);
            if ($curMonth != $month)
                $curDay = " ";
            $this->Cell($square, $square, $curDay, 0, 0, "R");
            }
        $y+=$square;
        $this->SetXY($x, $y);
        }
}

function printDay($date)
{
// nothing to do, can be overriden
}

function printHoliday($date)
{
    $x = $this->x;
    $y = $this->y;
    $height = 5.5;
    if ($this->squareHeight < 50)
        $height = 4;
    $widthPercent = .92;
    $fontSize = 11;
    $holiday = $this->isHoliday($date);
    if (strlen($holiday))
        {
        $wd = gmdate("w", jdtounix($date));
        if ($wd != 0 && $wd != 6)
            $this->Cell($this->squareWidth, $this->squareHeight, "", 0, 0, "", true);
        $this->SetXY($x + $this->squareWidth * (1-$widthPercent)/2, $y + $this->squareHeight * 0.83);
        $this->SetFont("Helvetica", "B", $fontSize);
        $this->Cell($this->squareWidth * $widthPercent, $height, $holiday, 0, 0, "C");
        }
}

function printMonth($date)
{
    $this->date = $date;
    $this->JDtoYMD($date, $year, $month, $day);
    $this->AddPage();
    // compute size base on current settings
    $width = $this->w - $this->lMargin - $this->rMargin;
    $height = $this->h - $this->tMargin - $this->bMargin;
    // print prev and next calendars
    $this->setXY($this->lMargin, $this->tMargin);
    $this->tinyCalendar($this->lastMonth($date), $this->tinySquareSize);
    $this->setXY($this->lMargin+$width - $this->tinySquareSize * 7, $this->tMargin);
    $this->tinyCalendar($this->nextMonth($date), $this->tinySquareSize);
    // print header
    $firstLine = $this->tinySquareSize * 8 + $this->tMargin;
    $monthStr = strtoupper(gmdate ("F Y", jdtounix($date)));
    $this->SetXY($this->lMargin, $this->tMargin);
    $this->SetFont("Times", "B", $this->headerFontSize);
    $this->Cell($width, $firstLine, $monthStr, 0, 0, "C");
    // compute number of weeks in month.
    $wd=gmdate("w", jdtounix($date));
    $start = $date - $wd;
    $numDays = $this->nextMonth($date) - $start;
    $numWeeks = 0;
    while ($numDays > 0)
        {
        $numDays -= 7;
        ++$numWeeks;
        }
    // compute horizontal lines
    $this->squareHeight = ($height - 6 - $firstLine) / $numWeeks;
    $horizontalLines = array($firstLine, 6);
    for ($i = 0; $i < $numWeeks; ++$i)
        {
        $horizontalLines[$i + 2] = $this->squareHeight;
        }
    // compute vertical lines
    $this->squareWidth = $width / 7;
    $verticalLines = array($this->lMargin, $this->squareWidth, $this->squareWidth, $this->squareWidth, $this->squareWidth, $this->squareWidth, $this->squareWidth, $this->squareWidth);
    
    // print days of week
    $x = 0;
    $this->SetFont("Times", "B", 12);
    for ($i = 1; $i <= 7; ++$i)
        {
        $x += $verticalLines[$i-1];
        $this->SetXY($x, $firstLine);
        $day = gmdate("l", jdtounix($this->MDYtoJD(2, $i, 2009)));
        $this->Cell($verticalLines[$i], 6, $day, 0, 0, "C");
        }
    
    // print numbers in boxes
    $wd=gmdate("w", jdtounix($date));
    $cur = $date - $wd;
    $this->SetFont("Times", "B", 20);
    $x = 0;
    $y = $horizontalLines[0];
    for ($k=0;$k<$numWeeks;$k++)
        {
        $y += $horizontalLines[$k+1];
        for ($i=0;$i<7;$i++ )
            {
            $this->JDtoYMD($cur, $curYear, $curMonth, $curDay);
            $x += $verticalLines[$i];
            $this->squareWidth = $verticalLines[$i+1];
            if ($curMonth == $month)
                {
                $this->setXY($x, $y);
                $this->printHoliday($cur);
                $this->setXY($x, $y);
                $this->printDay($cur);
                $this->SetFont("Times", "B", 20);
                $this->SetXY($x, $y+1);
                $this->Cell(5, 5, $curDay);
                }
            ++$cur;
            }
        $x = 0;
        }
    
    // print horizontal lines
    $ly = 0;
    $ry = 0;
    foreach ($horizontalLines as $key => $value)
        {
        $ly += $value;
        $ry += $value;
        $this->Line($this->lMargin, $ly, $this->lMargin+$width, $ry);
        }
    // print vertical lines
    $lx = 0;
    $rx = 0;
    foreach ($verticalLines as $key => $value)
        {
        $lx += $value;
        $rx += $value;
        $this->Line($lx, $firstLine, $rx, $firstLine + 6 + $this->squareHeight * $numWeeks);
        }
}

} // PDF_USA_Calendar class definition
?>

Example

<?php
require("pdfUSACalendar.php");

class MyCalendar extends PDF_USA_Calendar
{

function printDay($date)
{
    // add logic here to customize a day
    $this->JDtoYMD($date, $year, $month, $day);
    if ($month == 1 && $day == 10)
        {
        $this->SetXY($this->x, $this->y + $this->squareHeight / 2);
        $this->SetFont("Arial", "B", 10);
        $this->Cell($this->squareWidth, 5, "Happy Birthday!", 0, 0, "C");
        }
}

function isHoliday($date)
{
    // insert your favorite holidays here
    $this->JDtoYMD($date, $year, $month, $day);
    if ($date == easter_days($year) + $this->MDYtoJD(3, 21, $year))
        {
        $noSchool = false;
        return "Easter";
        }
    if ($date == easter_days($year) + $this->MDYtoJD(3, 21, $year) - 2)
        {
        $noSchool = false;
        return "Good Friday";
        }
    $jewishDate = explode("/", jdtojewish(gregoriantojd($month, $day, $year)));
    $month = $jewishDate[0];
    $day = $jewishDate[1];
    if ($month == 1 && $day == 1)
        return "Rosh Hashanah";
    if ($month == 1 && $day == 2)
        return "Rosh Hashanah";
    if ($month == 1 && $day == 10)
        return "Yom Kippur";
    if ($month == 3 && $day == 25)
        return "Chanukkah";
    if ($month == 8 && $day == 15)
        return "Passover";
    // call the base class for USA holidays
    return parent::isHoliday($date);
}

} // class MyCalendar extends PDF_USA_Calendar

// MyCalendar shows how to customize your calendar with Easter, some select Jewish holidays and a birthday
// Supports any size paper FPDF does
$pdf = new MyCalendar("L", "Letter");
// you can set margins and line width here. PDF_USA_Calendar uses the current settings.
$pdf->SetMargins(7, 7);
$pdf->SetAutoPageBreak(false, 0);
// set fill color for non-weekend holidays
$greyValue = 190;
$pdf->SetFillColor($greyValue, $greyValue, $greyValue);
// print the calendar for a whole year
$year = gmdate("Y");
for ($month = 1; $month <= 12; ++$month)
    {
    $date = $pdf->MDYtoJD($month, 1, $year);
    $pdf->printMonth($date);
    }
$pdf->Output();
?>
View the result here.

Download

ZIP | TGZ
An Error Occurred:Internal Server Error

Oops! An Error Occurred

The server returned a "500Internal Server Error".

Something is broken. Please let us know what you were doing when this error occurred. We will fix it as soon as possible. Sorry for any inconvenience caused.