Webstatt.org - Community seit 2006 - 2012 (2024?)

Termin Kalender

Avatar user-287
16.07.2006 13: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"zwinkern
{
if($this->monat != 12)
{
$neuermonat = $this->monat+1;
$neuesjahr = $this->jahr;
}
else
{
$neuermonat = 1;
$neuesjahr = $this->jahr+1;
}
}
elseif($do == "last"zwinkern
{
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"zwinkern.'</td>';
echo '<td class="nextmonat" colspan="4" align="center">'.$this->monatwechseln("next"zwinkern.'</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"zwinkern;
$this->monat_zz = date("m"zwinkern;
$this->jahr_zz = date("Y"zwinkern;

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

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

$this->ausgabe();
}
}

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

if(empty($_GET['jahr'])) $jahr = date("Y"zwinkern;
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>

Avatar user-125
16.07.2006 13:35

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

Ich finde ihn sehr schön. Gute Arbeit.

Liebe user-125y aka user-125 aka dionysos
Avatar user-255
16.07.2006 13: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.. zwinkern

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
Avatar user-300
16.07.2006 14:00

Original von user-255
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 zwinkern

Avatar user-253
16.07.2006 14: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"zwinkern;
else $monat = $_GET['monat'];

if(empty($_GET['jahr'])) $jahr = date("Y"zwinkern;
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

Avatar user-287
16.07.2006 14:47

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