Willkommen in der Webstatt Zum Webstatt Blog und Stories
Rebel4s Rebel4s am 16.07.06 15:04

Mir kam heut die Idee einen Termin Kalender zu coden, den ich als Startseite nutze und ich alle Termine somit auf einem Blick habe.

Hier der code, ist durch css etwas aufgepeppt. Bei Fragen oder verbesserungen posten.

<?
//### Termin Kalender ###\\

class kalender {

var $tag_zz; //zur Zeit: Tag im Monat 1-31
var $monat_zz; //zur Zeit: Monat im Jahr 1-12
var $jahr_zz; //zur Zeit: Jahr

var $monat; //Monat im Jahr 1-12
var $jahr; //Jahr >= 2006

var $tage; //Anzahl der Tage im Monat 28-31

var $arr_termine = array(); //Array in dem die Termine gespeichert werden

function termin ($tag) {
$arr_termine[31][12][$this->jahr][] = "Sylvester";

if(is_array($arr_termine[$tag][$this->monat][$this->jahr]))
{
$termine .= "<ul>";
foreach ($arr_termine[$tag][$this->monat][$this->jahr] as $value) {
$termine .= '<li>'.$value.'</li>';
}
$termine .= "</ul>";
}

return $termine;
}


function tageimmonat() {
//Gibt die Anzahl der Tge im Monat
return date("t", mktime(0, 0, 0, $this->monat, 1, $this->jahr));
}

function wochentag ($tag) {
//Gibt den Wochentag zurück
$wochentag = date("w", mktime(0, 0, 0, $this->monat, $tag, $this->jahr));

if($wochentag == 0) return 7;
else return $wochentag;
}

function wochennummer ($tag) {
//Gibt die Wochennummer des Jahres zurück
return date("W", mktime(0, 0, 0, $this->monat, $tag, $this->jahr));
}

function monatsname ($monat) {
switch ($monat) {
case 1: $name = "Januar";
break;
case 2: $name = "Februar";
break;
case 3: $name = "März";
break;
case 4: $name = "April";
break;
case 5: $name = "Mai";
break;
case 6: $name = "Juni";
break;
case 7: $name = "Juli";
break;
case 8: $name = "August";
break;
case 9: $name = "September";
break;
case 10: $name = "Oktober";
break;
case 11: $name = "November";
break;
case 12: $name = "Dezember";
break;
}
return $name;
}

function monatwechseln ($do) {
//kontrolliert den Jahressprung
if($do == "next")
{
if($this->monat != 12)
{
$neuermonat = $this->monat+1;
$neuesjahr = $this->jahr;
}
else
{
$neuermonat = 1;
$neuesjahr = $this->jahr+1;
}
}
elseif($do == "last")
{
if($this->monat != 1)
{
$neuermonat = $this->monat-1;
$neuesjahr = $this->jahr;
}
else
{
$neuermonat = 12;
$neuesjahr = $this->jahr-1;
}
}

return '<a href="kalender.php?monat='.$neuermonat.'&jahr='.$neuesjahr.'">'.$this->monatsname($neuermonat).' '.$neuesjahr.'</a>';

}

function zeilenstart ($tag) {
if($tag == 1) {
// Wieviel freie Tage am Anfang des Monats sind
$count = $this->wochentag(1)-1;

if($this->wochentag(1) != 1)
{
echo '<tr>';
echo '<td align="center" class="wochennummer"><span class="bigfont">'.$this->wochennummer($tag).'</span></td>';
}

for($i = 1; $i <= $count; $i++) {
echo '<td class="freietage">&nbsp;</td>';
}
}

//Beginnt eine neue Zeile
if($this->wochentag($tag) == 1)
{
echo "<tr>";

//Wochennummer
echo '<td align="center" class="wochennummer"><span class="bigfont">'.$this->wochennummer($tag).'</span></td>';
}
}

function zeilenende ($tag) {
//Beendet eine Zeile
if($this->wochentag($tag) == 7) echo "</tr>";

if($tag == $this->tage)
{
//Wieviel freie Tage am Ende des Monats sind
$count = 7-$this->wochentag($this->tage);

for($i = 1; $i <= $count; $i++) {
echo '<td class="freietage">&nbsp;</td>';
}
if($this->wochentag($this->tage) != 7) echo '</tr>';
}
}

function heute ($tag) {
//Heute wird hervorgehoben
if($tag == $this->tag_zz && $this->monat == $this->monat_zz && $this->jahr == $this->jahr_zz) return '<td class="heute"><span class="bigfont">'.$tag.'</span><br><span class="terminfont">'.$this->termin($tag).'</span></td>';
else return '<td class="tage"><span class="smallfont">'.$tag.'</span><br><span class="terminfont">'.$this->termin($tag).'</span></td>';
}

function header () {
echo '<tr>';
echo '<td class="monat" colspan="8" align="center"><span class="bigfont">'.$this->monatsname($this->monat).' '.$this->jahr.'</span></td>';
echo '</tr>';
echo '<tr>';
echo '<td class="lastmonat" colspan="4" align="center">'.$this->monatwechseln("last").'</td>';
echo '<td class="nextmonat" colspan="4" align="center">'.$this->monatwechseln("next").'</td>';
echo '</tr>';
echo '<tr>';
echo '<td align="center" width="12%" class="freietage"><a href="http://www.rebelweb.biz">Rebelweb</a></td>';
echo '<td align="center" width="12%" class="wochentage"><span class="bigfont">Mo</span></td>';
echo '<td align="center" width="12%" class="wochentage"><span class="bigfont">Di</span></td>';
echo '<td align="center" width="12%" class="wochentage"><span class="bigfont">Mi</span></td>';
echo '<td align="center" width="12%" class="wochentage"><span class="bigfont">Do</span></td>';
echo '<td align="center" width="12%" class="wochentage"><span class="bigfont">Fr</span></td>';
echo '<td align="center" width="12%" class="wochentage"><span class="bigfont">Sa</span></td>';
echo '<td align="center" width="12%" class="wochentage"><span class="bigfont">So</span></td>';
echo '</tr>';
}

function ausgabe () {
//Setzt den Kalender zusammen und gibt ihn aus

echo '<div align="center"><table width="100%" height="100%" border="0" cellspacing="1" cellpadding="2">';
$this->header();
for($i = 1; $i <= $this->tage; $i++) {
$this->zeilenstart($i);
echo $this->heute($i);
$this->zeilenende($i);
}
echo '</table></div>';
}

function kalender ($monat, $jahr) {

$this->tag_zz = date("d");
$this->monat_zz = date("m");
$this->jahr_zz = date("Y");

$this->monat = $monat;
$this->jahr = $jahr;

$this->tage = $this->tageimmonat();

$this->ausgabe();
}
}

if(empty($_GET['monat'])) $monat = date("m");
else $monat = $_GET['monat'];

if(empty($_GET['jahr'])) $jahr = date("Y");
else $jahr = $_GET['jahr'];

?>

<head>
<title>Kalender</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />

<style type="text/css">
<!--
body {
color: #000000;
background-color: #ffffff;
font-size: 12px;
font-family: Tahoma,Verdana,Arial,Helvetiva,sans-serif;
}

a:link, body a:visited, body a:active {
color: #000000;
text-decoration: underline;
font-family: Tahoma,Verdana,Arial,Helvetiva,sans-serif;
font-size: 12px;
font-weight: bold;
}

.heute {
border-left: 2px #5555ff solid;
border-top: 2px #5555ff solid;
border-right: 3px #0000ff solid;
border-bottom: 3px #0000ff solid;
}

.terminfont {
color: #000000;
font-family: Tahoma,Verdana,Arial,Helvetiva,sans-serif;
font-size: 12px;
}

.smallfont {
color: #000000;
font-family: Tahoma,Verdana,Arial,Helvetiva,sans-serif;
font-size: 12px;
font-weight: bold;
}

.bigfont {
color: #000000;
font-family: Tahoma,Verdana,Arial,Helvetiva,sans-serif;
font-size: 18px;
font-weight: bold;
}
.tage {
border-left: 1px #777777 solid;
border-top: 1px #777777 solid;
border-right: 1px #777777 solid;
border-bottom: 1px #777777 solid;
}

.wochentage {
font-weight: bold;
border-left: 2px #ff5555 solid;
border-top: 2px #ff5555 solid;
border-right: 3px #ff0000 solid;
border-bottom: 3px #ff0000 solid;
}

.wochennummer {
font-weight: bold;
border-left: 2px #01dc01 solid;
border-top: 2px #01dc01 solid;
border-right: 3px #00c000 solid;
border-bottom: 3px #00c000 solid;
}

.freietage {
background-color: #cccccc;
border-left: 1px #777777 solid;
border-top: 1px #777777 solid;
border-right: 1px #777777 solid;
border-bottom: 1px #777777 solid;

}

.monat {
font-weight: bold;
border-left: 2px #5555ff solid;
border-top: 2px #5555ff solid;
border-right: 3px #0000ff solid;
border-bottom: 3px #0000ff solid;
}

.nextmonat {
font-weight: bold;
border-left: 1px #777777 solid;
border-top: 1px #777777 solid;
border-right: 1px #777777 solid;
border-bottom: 1px #777777 solid;
}

.lastmonat {
font-weight: bold;
border-left: 1px #777777 solid;
border-top: 1px #777777 solid;
border-right: 1px #777777 solid;
border-bottom: 1px #777777 solid;
}

-->
</style>

</head>

<body>
<?PHP

$kalender = new kalender($monat, $jahr); //mm, jjjj

?>

</body>
</html>

netcup.de Warum gibt es hier Werbung?
bastey bastey am 16.07.06 15:35

Ich habe mal eine Demo hochgeladen.
Kalender in PHP - Demo

Ich finde ihn sehr schön. Gute Arbeit.

milahu milahu am 16.07.06 15:38

Was mir ins Auge sticht, ist die schon fast masochistische Implementierung der Methode
monatsname. Geht doch so viel einfacher:
<?php
class kalender {
var $monatsnamen = array('Januar', 'Februar', 'März' /* ... */);
function monatsname($monat){
return $this->monatsnamen[$monat-1];
}
}
?>

Ansonsten scheint die Klasse sehr undurchsichtig, auch wegen der schleierhaften Namensgebung.

Zum HTML: Das geht schöner..
<table>
<thead>
<tr>
<td>Mo</td>
<td>Di</td>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2</td>
</tr>
</tbody>
</table>

..dann lässt sich das Ganze per CSS auch viel einfacher stylen.

Dionysos, stell doch bitte mal ein paar Termine ein, sonst fehlt das wichtigste.. ;)

sili sili am 16.07.06 16:00

Quote
Original von milahu
Was mir ins Auge sticht, ist die schon fast masochistische Implementierung der Methode
monatsname. Geht doch so viel einfacher:
<?php
class kalender {
var $monatsnamen = array('Januar', 'Februar', 'März' /* ... */);
function monatsname($monat){
return $this->monatsnamen[$monat-1];
}
}
?>


Das würde ich aber anders machen:

class kalender {
var $monatsnamen = array(1 => 'Januar', 'Februar', 'März' /* ... */);
function monatsname($monat){
return $this->monatsnamen[$monat];
}
}


Ansonsten solltest du das HTML validieren ;)

Michael Michael am 16.07.06 16:22

Das Ergebnis sieht gut aus.

Ein paar Anregungen:

- prints/echos innerhalb von Funktion sind bah
- HTML Code zusammenzusetzen und irgendwann auszugeben ist nicht ganz so bah aber immer noch bah. So übertrieben es klingt: Selbst ein Script diesen Umfangs profitiert enorm von einem Templatesystem.
Die Umsetzung mit Tabellen macht das ganze nur unschöner
- den Teil
if(empty($_GET['monat'])) $monat = date("m");
else $monat = $_GET['monat'];

if(empty($_GET['jahr'])) $jahr = date("Y");
else $jahr = $_GET['jahr'];


kann man auch wunderschön in den Konstruktor setzen

- die Termine machen natürlich ohne eine Möglichkeit der Dynamisierung keinen Sinn

Michael

Rebel4s Rebel4s am 16.07.06 16:47

Danke für die Tipps, werd sie später umsetzen!

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt