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;

function __construct($orientation="L", $format="Letter")
{
    parent::__construct($orientation, "mm", $format);
    // 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
Es ist ein Fehler aufgetreten

Es ist ein Fehler aufgetreten

Was ist das Problem?

Bei der Ausführung des Skriptes ist ein Fehler aufgetreten. Irgendetwas funktioniert nicht richtig.

Wie kann ich das Problem lösen?

Öffnen Sie die aktuelle Log-Datei im Ordner var/logs bzw. app/logs und suchen Sie die zugehörige Fehlermeldung (normalerweise die letzte).

Weitere Informationen

Die Skriptausführung wurde gestoppt, weil irgendetwas nicht korrekt funktioniert. Die eigentliche Fehlermeldung wird aus Sicherheitsgründen hinter dieser Meldung verborgen und findet sich in der aktuellen Log-Datei (siehe oben). Wenn Sie die Fehlermeldung nicht verstehen oder nicht wissen, wie das Problem zu beheben ist, durchsuchen Sie die Contao-FAQs oder besuchen Sie die Contao-Supportseite.