Hallihallo!
Nur so als eventuelle Anregung, kann ich Dir erzählen, wie ich es in meinem Kalender mal gemacht habe, hier mal beispielhaft ausgehend von einer Monatsanzeige mit allen Terminen des Monats:
- lege ein Array von Arrays an, für jeden Tag des Monats ein Element:
$tage = array();
for ($i=1; $i<=$anzahl_der_tage_im_monat; $i++) {
$tage[$i] = array();
}
Das ist ist erstmal die ganz grobe Struktur, in die hinterher die Termindaten reingeschaufelt werden. Ich fange übrigens mit Absicht mit dem Index 1 an, das macht es für mich etwas einfacher in der späteren Verwendung.
-
Lies alle Termine aus der Datenbank (oder woher auch immer, das kann z.B. auch eine iCal-Datei sein), die in den entsprechenden Monat fallen.
-
Iteriere per foreach durch alle gefundenen Termine und lege sie in dem Array von eben ab. Beim Ablegen in dem Array kann man Alles ablegen, was man möchte. Ist zwar vielleicht nicht die eleganteste Option, aber sie ist übersichtlich.
foreach ($gelesene_termine as $gt) {
// Lege Start und Ende des Termins fest.
// Das Folgende war bei meinem Kalender passend,
// weil ich Start und Ende als Timestamp
// in der Datenbank stehen hatte.
// Bei anderen Formaten müsste man das noch anpassen, etwa per strtotime()
$start = date("j",$gt['start']); // "j" = Tag des Monats, ohne führende 0
$end = date("j",$gt['ende']);
for($betroffener_tag = $start; $betroffener_tag <= $end; $betroffener_tag++) {
$tage[$betroffener_tag][] = array(
'id' => $gt['id'],
'titel' => $gt['titel'],
'ort' => $gt['ort'],
// ... alles, was man sonst noch so braucht,
// etwa in meinem Fall:
'onclick' => 'zeigetermin('.$gt['id'].')',
'label' => $gt['label']
);
}
}
An diesem Punkt könnte man schon, wenn man das möchte, dafür sorgen, dass nur am ersten Tag des Termins alle Infos dazu in das Array kommen. Das habe ich damals so gemacht. Heute würde ich aber eher in der Ausgabe des Arrays als HTML diese Sortierung vornehmen. Das macht das Ganze variabler und wiederverwendbarer.
- Gehe jetzt den "maschinenlesbaren Monat" (also das Array $tage) durch, und baue daraus das gewünschte HTML zusammen.
Das hast Du aber ja schon geschafft gehabt.
Um jetzt zu erreichen, dass die Termindetails nur am ersten Tag des jeweiligen Termins angezeigt werden, könnte man ein zusätzliches Hilfs-Array benutzen, z.B.
$done = array();
Bei jedem Termin, der in das HTML eingesetzt werden soll, kann man nun überprüfen, ob$done[Termin_ID]
existiert undtrue
ist. Falls nicht, wurde der Termin offenbar noch nicht abgearbeitet, man bearbeitet also gerade seinen ersten Tag. Also alle Details ins HTML schreiben, dann$done[Termin_ID] = true
setzen, und weiter. Am nächsten Tag des Termins existiert dann$done[Termin_ID]
, und es isttrue
. Also macht man z.B. nur eine farbliche Markierung und (z.B.) den onclick-handler (ich weiss, ekelhaft, aber man kann das ja auch über das Setzen einer Klasse im HTML regeln 😉 ).
Wie gesagt, in einigen Details würde ich meinen Kalender nach heutigem Wissen anders programmieren, vor Allem würde ich die Dinge wie das Auslesen der Termine, das Aufbereiten der Datenstruktur für die Anzeige und die Anzeige selber voneinander in Funktionen voneinander kapseln.
Aber ich denke, der grobe Programmablauf wäre immer noch derselbe.
Vielleicht konnte ich Dir ja ein Wenig helfen :-)
Beste Grüsse, Tobias Hahner