Ich habe eine kleine Kalenderklasse geschrieben, die ein Kalenderblatt zu einem Monat als HTML-Tabelle erzeugt.
Wochenenden und Termin die man einfügen kann, können hervorgehoben werden, die entsprechenden Zellen haben eigene Id's für CSS-Definitionen.
Ich habe es mir so geschrieben, dass es von den verschiedenen Id's jeweils noch zwei Varianten gibt, einmal mit vorangestelltem "thumb" im Id-Namen, einmal oben.
In der thumb-Variante werden Bemerkungen zu eingetragenen Termin in ein title-Tag der Tabellenzelle für den entsprechenden Tag geschrieben.
In der non-thumb-Variante werden diese Bemerkungen direkt in die Zelle unter den Tag geschrieben.
Ganz glücklich bin ich mit der Sache noch nicht, für konstruktive Kritik, Anregungen, Verbesserungsvorschläge bin ich dankbar. Besonders bei der Methode getCalendar() bin ich mir noch absolut nicht sicher ob das so optimal umgesetzt ist.
Benötigte CSS-Definitionen:
table#Calendar
table#thumbCalendar
td#CalWe
td#thumbCalWe
td#CalEvent
td#thumbCalEvent
div#event (in der non-thumb-Version für die Ausgabe der Termindescriptions)
Methoden:
__construct($month=false,$year=false)
$month und $year sind optional, defaultwerte sind der aktuelle Monat des aktuellen Jahres.
setMonth($month)
getMonth()
setYear($year)
getYear()
setWe($we)
Mögliche Parameter 1 oder 2. Legt fest Ob nur der Sonntag (=1) als Wochenendtag dargestetllt wird, oder Samstag und Sonntag (=2).
getWe()
addDate($timestamp,$descr)
Erwartet den Unixtimestamp für den Tag (aus mktime(0,0,0,$monat,$tag,$jahr)) und eine Beschreibung des Termins.
Mehrere Termine für einen Tag sind möglich.
getCalendar($thumb=true)
Gibt die HTML-Tabelle für das Kalenderblatt zurück. Default wird die thumbversion geliefert, die nonthumbversion gibts mit getCalendar(false).
class.calendar.php :
class calendar {
private $month;
private $year;
private $we = 2;
private $dates = array();
public function __construct($month=false,$year=false) {
if($month===false || !$this->setMonth($month)) {
$this->month = date("m");
}
if($year===false || !$this->setYear($year)) {
$this->year = date("Y");
}
}
public function setMonth($month) {
if($this->checkMonth($month)) {
$this->dates = $this->month==$month ? $this->dates : array();
$this->month = $month<10 ? "0".(int)$month : (int)$month;
return true;
}
else return false;
}
public function getMonth() {
return $this->month;
}
public function setYear($y) {
if($this->checkYear($y)) {
$this->dates = $this->year==$y ? $this->dates : array();
$this->year = $y>=1970 ? $y : (100==$y ? 2000 : ($y<10 ? "200".$y : ($y<=38 ? "20".$y : "19".$y)));
return true;
}
else return false;
}
public function getYear() {
return $this->year;
}
public function setWe($we) {
if(1==$we || 2==$we) {
$this->we = $we;
return true;
}
else return false;
}
public function getWe() {
return $this->we;
}
public function addDate($time,$descr) {
if(date("Y",$time)==$this->year && ""!=trim($descr)) {
$this->dates[$time][] = $descr;
return true;
}
else return false;
}
public function checkMonth($m) {
$m = (int)$m;
return $m>=1 && $m<=12 ? true : false;
}
public function checkYear($y) {
$y = (int)$y;
return ($y>=1970 && $y<=2038) || ($y>=0 && $y<=38) || ($y>=70 && $y<=100) ? true : false;
}
public function getCalendar($thumb=true) {
$class = $thumb ? "thumb" : "";
$time = mktime(0,0,0,$this->month,1,$this->year);
$count = date("t",$time);
$wday = date("w",$time);
$w = 0;
$diff = $wday ? $wday-1 : 6;
if($diff) {
$week[$w] = "<td colspan='{$diff}'></td>\n";
}
for($i=1; $i<=$count; $i++) {
$id = "";
$title = "";
$event = "";
$t = mktime(0,0,0,$this->month,$i,$this->year);
$wd = date("w",$t);
if(array_key_exists($t,$this->dates)) {
$id = " id='{$class}CalEvent'";
$title = " title='".implode(" || ",$this->dates[$t])."'";
$event = $thumb ? "" : "<div id='event'>".implode("<br>",$this->dates[$t])."</div>";
}
elseif(!$wd || (2==$this->we && 6==$wd)) {
$id = " id='{$class}CalWe'";
}
$week[$w].= "<td{$id}{$title}>{$i}{$event}</td>\n";
if(!$wd) {
$w++;
$week[$w] = "";
}
}
if($wd) {
$diff = 7-$wd;
$week[$w].= "<td colspan='{$diff}'></td>\n";
}
$calendar = "<tr>".implode("</tr>\n<tr>\n",$week)."</tr>";
$return = "
<table border='0' cellpadding='0' cellspacing='0' id='{$class}Calendar'>
<tr>
<th>Mo</th><th>Di</th><th>Mi</th><th>Do</th><th>Fr</th><th>Sa</th><th>So</th>
</tr>
{$calendar}
</table>";
return $return;
}
}
Alles anzeigen
beispiel.php :
include("class.calendar.php");
$termin1 = mktime(0,0,0,5,22,2009);
$descr1 = "10:30 Zahnarzt";
$termin2 = mktime(0,0,0,5,27,2009);
$descr2 = "15:30 Friseur";
$c = new calendar();
$c->addDate($time1,$descr1);
$c->addDate($time2,$descr2);
$out = $c->getCalendar();
echo $out;
Alles anzeigen
beispiel.css :
table#thumbCalendar { background-color:#ffffff;margin:2px;border:1px solid #000000; }
table#thumbCalendar th {
padding:3px;
font-weight:bold;font-family:arial;font-size:11px;color:#000000;
border:1px solid #000000;
text-align:center;
}
table#thumbCalendar td {
padding:3px;
font-weight:normal;font-family:arial;font-size:11px;color:#000000;
border:1px solid #000000;
text-align:center;
}
td#thumbCalWe {
background-color:#bcbcbc;
padding:3px;
font-weight:normal;font-family:arial;font-size:11px;color:#000000;
border:1px solid #000000;
text-align:center;
}
td#thumbCalEvent {
background-color:#ffbcac;
padding:3px;
font-weight:normal;font-family:arial;font-size:11px;color:#000000;
border:1px solid #000000;
text-align:center;
}
Alles anzeigen
Wie gesagt, Erweiterungs- und/oder Verbesserungsvorschläge sind gern gesehen.