Kalender Tutorial - Event/Termin-kalender daraus gemacht

Irgendjemand_1

Erfahrenes Mitglied
So.
Da hier anscheinend seeehr viel über das Kalender Tutorial (bin neu hier) geredet wird, unter anderem auch Termin/Event-Kalender Fragen auftauchen, hab ich den mal etwas modifiziert (ich hoffe, dass ich das durfte) und einen Event/Termin-Kalender daraus gemacht.

PHP:
<?php
// Connection zur Datenbank aufbauen
// Müsst ihr halt noch machen

// Zum überprüfen, ob ein Event existiert
function check_event($thisday, $events) {
  for ($i = 0; $i <= count($events); $i++) {
    if ($events[$i][0] == $thisday['mday'] && $events[$i][1] == $thisday['mon'] && $events[$i][2] == $thisday['year']) {
      return $i;
    }
  }
  if ($i == count($events)-1) {
    return false;
  }
}

define("DAY", (60*60*24));
$today = getdate();
$days = array ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
$months = array ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");

// Hier switch-Anweisung daraus machen, wenn ihr mehrere Monate einfügen wollt.
if (!isset($_GET['next'])) {
  $month = $today['mon'];
}
else {
  $month = ($today['mon']+1);
}
$start_day_time = mktime (0, 0, 0, $month, 1, $today['year']);
$start_day = getdate($start_day_time);

$sql = "SELECT `month`, `year`, `day`  // Die restlichen Spalten - z.B Den Inhalt etc. um den anzuzeigen, wenn man draufklickt 
        FROM `events`
        WHERE `month` = '".$month."'
        AND `year` = '".$today['year']."'";
$result = mysql_query($sql) or die (mysql_error());
$i = 0;
while ($row = mysql_fetch_assoc($result)) {
  $events[$i] = array ($row['day'], $row['month'], $row['year']);
  $i++;
  }
if (!isset($_GET['event'])) {
  echo "<table border='2' cellspacing='3'>\n"; 
  for ($i = 0; $i <= 6; $i++) {
    echo "<th>";
    echo $days[$i];
    echo "</th>";
  }

  for ($i = 0; $i < (6*7); $i++) {
    $thisday = getdate($start_day_time);
    
    if (($i % 7) == 0 ) {
      // Wenn der Monat zuende ist Script beenden (damit kein unnötiges <tr> kommt)
      if ($thisday['mon'] != $month) {
        break;
      }
      echo "<tr>\n";
    } 
    
    // den 1. Monatstag erst anzeigen, wenn der richtige Wochentag gezählt wird, wenn der Monat zuende ist leere Zelle schreiben.
    if ($i < $start_day['wday'] || $thisday['mon'] != $month) {
      echo "<td></td>\n";
    } 
    
    // Wenn der Tag im aktuellem Monat ist 
    else {
      $check = check_event($thisday, $events);
      if (isset($events[$check][0])) {
        if (!isset($_GET['next'])) {
          echo "<td><a href='eventcalendar.php?event=".$check."'>".$thisday['mday']." ".$thisday['month']."<br>\n";
        }
        else {
          echo "<td><a href='eventcalendar.php?event=".$check."&next=1'>".$thisday['mday']." ".$thisday['month']."<br>\n";
        }
        echo $events[$check][3];
        echo "</a></td>";
        $start_day_time += DAY;
      }
      else {
        echo "<td>".$thisday['mday']." ".$thisday['month']."</td>\n";
        $start_day_time += DAY;
      }
    }
  }
  echo "</table>\n";
  echo "<br>\n";

  // Zwischen derzeitigen und nächsten Monat wechseln
  if (!isset($_GET['next'])) {
    echo "<a href='eventcalendar.php?next=1'>Show next month</a>\n";
  }
  else {
    echo "<a href='eventcalendar.php'>Show current month</a>\n";
  }
}

// Wenn ein event angeklickt wurde
else {
  if (isset($events[$_GET['event']])) {
    // Wichtig
    // Inhalt eures Events - Kalender wird ausgeblendet und das Event gezeigt
    // Includen könntet ihr auch
    // $_GET['event'] steht nicht für die id des Events, sondern für den Index des Arrays
  else { 
      echo "Ungültiges Event!\n"; 
  }
  if (isset($_GET['next'])) {
    echo "\n<br>\n<a href='eventcalendar.php?next=1'>Back</a>\n";
  }
  else {
    echo "\n<br>\n<a href='eventcalendar.php'>Back</a>\n";
  }
}  
?>

Müsst ihr nur noch alles mit der Datenbank anpassen und unten hab ich 3 Zeilen Kommentar, wo steht, was ihr dort noch einfügen müsst (den Inhalt, wenn man auf einen Termin klickt)
Ich denke, man sieht noch, dass es vom Tutorial abgeleitet ist ;)

Ach ja, man kann dort nur zwischen dem jetzigen Monat und dem nächsten Moant wechseln, aber ihr könntet das mit einer switch-Anweisung ganz einfach um 10 Monate erweitern (diese Stelle ist auch kommentiert)
Auf design ist wiedermal keine Rücksicht genommen worden.
Ich hoffe, dass kein Fehler drinnen ist, ich hab es aber schon ausprobiert, allerdings hab ich ja jetzt das Zeug, was ich aus der DB auslese usw. wieder rausgenommen, damit ihr das besser anpassen könnt, hoffentlich hab ich nicht ausversehen etwas gelöscht.
Hier gibt es ein Beispiel

PS: Muss das etwa unter Tutorials?
 
Servus

ich weis das thema schon alt ist, aber mich würde interessieren wie du die switch anweisung einbringst!

Mein Problem ist das ich eine 3-Monatsansicht machen will und ich nicht weis, wie ich das hinbekomme!

Die anzeige soll etwa so sein:

Wie der aktuelle kalender aussieht nur das halt der Monatsname Über den wochentagen stehen soll und das eine Spalte angelegt werden müsste mit den Kalenderwochen!
Und dann wieder von vorne!

So das mann halt 3 Monate sieht und der aktuelle immer der erste ist!

Kann mmir da noch jemand weiterhelfen?

Danke schon mal

grüße Compane
 
Hi,

also vom Prinzip her brauchst du wie du bereits gesagt hast zwei Links bzw. Buttons. Die frage ist nun, ob du "nur" den nächsten monat willst oder auch die übernächsten usw. Das ändert die Sache etwas.

Die Links/Buttons müssen als Übergabeparameter (per POST oder GET) die Info "nächsten Monat" (+1) und "vorherigen Monat" (-1) an das eigene Skript schicken. Also z.B. wird vom kalender.php welches den kalender anzeigt auch die POST oder GET-Daten geschickt.

Diese Daten werden dann am Anfang vom Skript ausgewerten und so anhand von einer fallunterscheidung (IF...) ein Offset (+1 oder -1) auf die Datumswerte addiert (oder subtrahiert). Dadurch soll erreicht werden dass nächster monat oder der letzte monat angezeigt wird. Nun musst noch aufpassen auf die Links "nächster/letzer Monat". Entweder im Falle einer Anzeige von dem nächsten oder letzten Monat kann nun nur noch der aktuelle Monat angezeigt werden, oder wieder wie in der Ausgangssituation beide links die wieder zum nächsten oder letzten Monat führen.

Wenn egal welcher Monat angezeigt wird, auch die Buttons nächster und letzter Monat vorhanden sein sollen, sollten die immer beim Initialisieren die entsprechende Werte bekommen. Im Ausgangszustand würde der Button "nächster Monat" z.B. +1 haben. wenn einmal auf diesen Button gedrückt wird, bekommt der Button "nächster Monat" +2 als neuen Wert.

Zur Auswertung von den Daten per POST/GET siehe hier

Soweit alle Unklarheiten beseitigt?

Guten Rutsch
wünscht, Shiva
 
hm...

am Anfang vom Skript wertest die Übergabeparameter aus und änderst damit die monatsvariable:

PHP:
If( übergabeparameter gesetzt) {
$monatsvariable = date(n) + *der übergebene parameter*;
}
else{
$monatsvariable = date(n);
}

date(n) ersetzt du im kompletten skript mit deiner neuen variable $monatsvariable.

Dann musst nur noch die Werte für die Buttons "nächster Monat" und "letzter Monat" anpassen. Da machst auch wieder eine Fallunterscheidung. Der Initialwert ist natürlich -1 für letzten monat und 1 für nächsten monat.

grüße
 
Hi,

doch, das Skript funktioniert. Es gibt nur ein kleinen Fehler in der Beschreibung wie man die Navigation für nächster / letzter Monat zum laufen bekommt.

Also.

1) Skript runterladen und als calendar.php speichern: http://www.cascade.org.uk/software/php/calendar/Calendar.txt

2) Überschreiben der Navigations-Funktion mit:

PHP:
    function getCalendarLink($month, $year)
    {
        $s = getenv('SCRIPT_NAME');
        return "$s?month=$month&year=$year";
    }

3) neue php datei showcalendar.php mit folgendem code erstellen:

PHP:
<?
include 'calendar.php';
// Construct a calendar to show the current month
$d = getdate(time());

if ($month == "")
{
    $month = $d["mon"];
}

if ($year == "")
{
    $year = $d["year"];
}

$cal = new Calendar;
echo $cal->getMonthView($month, $year);
?>

Das wars.
Ach ja, der Fehler ist auf der Seite . und zwar die Zeite mit "$cal = new MyCalendar;"
Es sollte nicht MyCalendar sondern wie oben nur Calendar heißen.

Grüße
 
Hi!

Auf der Seite gehts bei mir auch nicht. Vermutlich fängt er die Übergabeparameter (?month=2&year=2009) nicht ab. Aber wie gesagt, mit der Anleitung oben geht es bei mir.

Mit Navi und allem.
 
Zurück