Event-Kalender

Mit dem Event-Kalender können Sie Events (Ereignisse) in einer DB-Tabelle speichern. Die Events werden übersichtlich in einem Kalender angezeigt. Die Navigation des Kalenders läuft vollständig über JavaScript (Ajax), somit ist kein Seitenwechsel notwendig.

Live-Demo - Event-Kalender
Live-Demo - Event-Kalender

Dieser Kalender zeigt alle Tage eines Monats in Form einer Tabelle an. Dabei kann über Buttons zum Vormonat/Vorjahr oder kommenden Monat/Jahr navigiert werden, auch die Auswahl eines bestimmten Wochentags, der Woche, Monats oder Jahres ist möglich.

Der Eingetragene Event, der Tag oder das Kalenderblatt können direkt ausgewählt werden. Ein Journal zeigt alle Events im Kalenderjahr an. Flexible Größe - Der Kalender passt sich automatisch der Breite der Seite an.

Die Events können direkt im Kalender eintragen oder bearbeitet werden. Vielfältige Sortier-. und Suchfunktionen machen das auffinden der Events zu einem Kinderspiel.

Eigenschaften

Weitere Eigenschaften

Neu

Video

Hinweise zur Installation

Voraussetzung:
Webserver (Linux) mit PHP 7.2 (oder höher), eine MySQL/MariaDB-Datenbank. Es werden alle aktuellen Browser unterstützt, mit Ausnahme des Microsoft Internet Explorer 11 und ältere Versionen.

Führen Sie folgende Anweisungen nacheinander aus:

  1. In der Datei: verbindung.php tragen Sie Ihre Zugangsdaten (zur Datenbank) ein. Dort sind auch weitere Einstellungen möglich.
  2. Laden Sie alle Dateien auf Ihrem Webserver hoch.
  3. Rufen Sie die Datei: installation.php in Ihrem Browser auf.
  4. Rufen Sie die Datei: demo.htm in Ihrem Browser auf und tragen Sie Ihre ersten Event in den Kalender ein.

Herunterladen: event-kalender.zip

Viel Spaß damit!

Hinweise, Fehler und Vorschläge, bitte hier in den Kommentaren eintragen.

Hilfe und Tipps

Den Event-Kalender einbinden

Der Kalender lässt sich in jede HTML-Seite einbinden, einfach den Blau hervorgehobenen Text in die Seite einfügen.

<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>Kalender</title>
  <link rel="stylesheet" href="kalenderstyle.css">
  <script type="text/javascript" src="kalenderscript.js"></script>
 </head>
<body>

<div id="kalender"></div>

</body>
</html>
Den Event-Kalender in ein anderes Verzeichnis einbinden

Die Relativen Pfade anpassen, ausgehend vom aktuellen Verzeichnis in dem der Verweis liegt!

<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>Kalender</title>
  <link rel="stylesheet" href="deinverzeichnis/event-kalender/kalenderstyle.css">
  <script type="text/javascript" src="deinverzeichnis/event-kalender/kalenderscript.js"></script>
 </head>
<body>

<div id="kalender"></div>

</body>
</html>

In der Datei: kalenderscript.js (Zeile: 18) folgendes anpassen:

const verzeichnis = "deinverzeichnis/event-kalender/";
Die Anmeldung im Event-Kalender

Einfach auf der Tastatur L drücken um sich anzumelden oder abzumelden.
Oder so wie auf der folgenden Animation zu sehen ist.

Anmeldung im Event-Kalender
Anmeldung im Event-Kalender (Gif-Animation, ca. 244 kb)
Ein Hintergrundbild für den Event-Kalender

Öffne die Datei: "kalenderstyle.css" und entferne die folgenden CSS-Kommentarzeichen:

/* Kalender */
div#kalender {
 box-shadow: 1px 1px 10px #CFCFCF;
 /*background-image: url(hintergrundbild.jpg);
 background-repeat: No-Repeat;
 background-size: Cover;*/
}

/* Tabelle */
table#kalender {
 font-family: Verdana, Sans-Serif;
 background-color: #F5F5F5;
 border-collapse: Collapse;
 empty-cells: Hide;
 width: 100%;
 /*opacity: 0.85;*/
 cursor: Default;
}box-shadow: 1px 1px 0px 0px #c3c3c3;
[Bildschirmfoto] 
Der Event-Kalender mit einem Hintergrundbild.
Der Event-Kalender mit einem Hintergrundbild.

Wenn man eine Liste der Events auch auf einer anderen Seite anzeigen möchte, dann sind die folgenden PHP-Scripte hilfreich.

Die Events des aktuellen Monats anzeigen

Dieses Script zeigt die Events des aktuellen Monats an.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// Event-Kalender
// Events des aktuellen Monats anzeigen

include "verbindung.php"// Dateipfad eventuell anpassen

$select $db->query("SELECT `start`, `event`, `beschreibung`
                      FROM `" $TABLE_PREFIX "_kalender`
                      WHERE YEAR(`start`) = YEAR(NOW()) AND
                            MONTH(`start`) = MONTH(NOW())
                      ORDER BY `start` ASC");
$events $select->fetchAll();
foreach (
$events as $event) {
 
sscanf($event["start"], "%4s-%2s-%2s %5s"$dbJahr$dbMonat$dbTag$dbUhr);
 echo 
'<p>$dbTag '.' $dbMonat '.' $dbJahr '&emsp;$dbUhr ' Uhr - ' .
 
$event["event"] . '<br>$event["beschreibung"] . '</p>';
}
?>
Aktuelle Events anzeigen

Hier können Sie selbst die Anzahl der Events bestimmen die angezeigt werden soll.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// Event-Kalender
// Aktuelle Events anzeigen (mit Beschreibung)

include "verbindung.php"// Dateipfad eventuell anpassen

$anzahl 12// Anzahl
$select $db->query("SELECT `start`, `event`, `beschreibung`
                      FROM `" $TABLE_PREFIX "_kalender`
                      WHERE `start` >= NOW()
                      ORDER BY `start` ASC
                      LIMIT " $anzahl);
$events $select->fetchAll();
foreach (
$events as $event) {
 
sscanf($event["start"], "%4s-%2s-%2s %5s"$dbJahr$dbMonat$dbTag$dbUhr);
 echo 
'<p>$dbTag '.' $dbMonat '.' $dbJahr '&emsp;$dbUhr ' Uhr - ' .
 
$event["event"] . '<br>$event["beschreibung"] . '</p>';
}
?>
Events der nächsten 31 Tage

Immer Aktuell, die Events der nächsten 31 Tage (individuell einstellbar).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// Event-Kalender
//  Events der nächsten 31 Tage (individuell einstellbar).

include "verbindung.php"// Dateipfad eventuell anpassen

$tage 31// Tage
$select $db->query("SELECT `start`, `event`, `beschreibung`
                      FROM `" $TABLE_PREFIX "_kalender`
                      WHERE (TO_DAYS(`start`) - TO_DAYS(NOW())) >= 0 AND (TO_DAYS(`start`) - TO_DAYS(NOW())) <= " $tage "
                      ORDER BY `start` ASC");
$events $select->fetchAll();
foreach (
$events as $event) {
 
sscanf($event["start"], "%4s-%2s-%2s %5s"$dbJahr$dbMonat$dbTag$dbUhr);
 echo 
'<p>$dbTag '.' $dbMonat '.' $dbJahr '&emsp;$dbUhr ' Uhr - ' .
 
$event["event"] . '<br>$event["beschreibung"] . '</p>';
}
?>

Event-Kalender als APP installieren Voraussetzung: Windows 10 und Microsoft Edge (Chromium).
  1. Die Datei: "demo.htm" mit CSS anpassen.
    <style>
    body {
     margin:  0 0 850px 0;
    }
    
    div#kalender {
     box-shadow: unset;
    }
    </style>
  2. Ein Icon für die App erstellen - Favicon erstellen
    <link rel="SHORTCUT ICON" href="icon.ico" type="image/x-icon"> zwischen <head> und </head> einfügen.
  3. Datei speichern.
  4. Browser: Microsoft Edge (Chromium) öffnen und die Datei in der Adresszeile aufrufen.
  5. Im Menü folgendes auswählen:
  6. Fertig
Einen Wochentag im Kalender farbig hervorheben

Die folgende CSS-Anweisung, in der Datei: kalenderstyle.css, hebt die Wochentage Samstag und Sonntag hervor:

.Samstag,
.Sonntag {
 background-color: #FF9595 !important;
}
Einen Wochentag im Kalender farbig hervorheben
Oder, zum Beispiel für den Donnerstag:
td:nth-child(4) {
 background-color: #FF9595 !important;
}

Um den 10 Monatstag hervorzuheben genügt folgende Anweisung:

#n10 {
 background-color: #FF9595 !important;
}
Steuerung des Kalenders über die Tastatur deaktivieren

Manchmal ist es notwendig, die Tastaturbefehle die der Kalender verwendet zu deaktivieren.
Öffnen Sie die Datei: "kalenderscript.js", suchen Sie nach folgendem Eintrag:

const tastaturnavigation = true;

Ersetzen Sie: true durch: false

Audio-Ausgabe des Kalenders deaktivieren

Öffnen Sie die Datei: "kalenderscript.js", suchen Sie nach folgendem Eintrag:

const audioausgabe = true;

Ersetzen Sie: true durch: false


Events über "Ziehen und Ablegen" verschieben

Events über Ziehen und Ablegen (Drag and Drop) verschieben.


Die Wochennummern ein.- und ausblenden

Die Wochennummern per Ziehen ein.- und ausblenden oder Taste # drücken.

Einen Tag direkt über die Tastatur anwählen

• Einen Tag direkt über die Tastatur (Ziffernblock 0 … 9) anwählen.
• Eine Woche mit STRG + Ziffernblock 0 … 9 anwählen.
• Einen Monat mit ALT + Ziffernblock 0 … 9 anwählen.


Events exportieren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php

/*
* Event-Kalender - Events exportieren - kalender2srvics.php (utf-8)

* origin: - » »  werner-zenk.de
* modify: RaHa    

* Scriptname z.B.: /var/www/vhosts/domain.tld/kalender/kalender2srvics.php
* domain.tld ist durch den eigenen Domainnamen zusetzen!
*/

session_start();

// Verbindungsdaten zur Datenbank
require_once("dbinfo.inc.php");

// ersetzen mit eigener Domain
$StrDomain="myDomain";

// ersetzen mit gültigem Path
$StrPath="/var/www/vhosts/".$StrDomain."/ics/";

// Standarddateiname der ICS-Datei, ggf. ändern
$StrFileName=$TABLE_PREFIX;

/*
* Aufruf unter Plesk - Geplante Aufgaben oder crontab (stündlich oder anders): 
* $StrPath.kalender2srvics.php"
* oder $StrPath.kalender2srvics.php?pass=XXX"

* Kalenderdatei wird gespeichert unter $StrPath.$abfragename.ics
* mit Smartphone wird diese als Kalenderabo abonniert: $StrDomain/ics/$abfragename.ics
* Alarm: 1 Tag und 1 Stunde vor dem Event, wird nur gesetzt wenn das Eventdatum nach dem aktuellen Datum liegt
* Prioritäten >15 werden hier nicht gespeichert
* getestet mit iPhone, iPad, Mac OS X, iCal, Thunderbird Mac/Win 
*/

/*
* Events als ICS exportieren
*/

$abfragename="";
// Parameter via URL-Aufruf
if (isset($_REQUEST['pass'])) { $abfragename=$_REQUEST['pass']; }

// Parameter via Scriptaufruf
if (isset($argv[1])) { $abfragename=$argv[1]; }

mb_internal_encoding("UTF-8");

// Verbindung zur Datenbank aufbauen
$db_link mysqli_connect ($DB_HOST$DB_BENUTZER$DB_PASSWORT$DB_NAME);
mysqli_query($db_link"SET NAMES 'utf8'");

$sql "SELECT * FROM ".$TABLE_PREFIX."_kalender ORDER BY start";

$db_erg mysqli_query$db_link$sql );
if ( ! 
$db_erg )
{
die(
'Ungültige Abfrage: ' mysqli_error());
}

$str_suche=chr(13).chr(10);
$str_ersatz='\n';
$eol '\n';

$cal_timestamp time();

$cal_ics_content "BEGIN:VCALENDAR" $eol "METHOD:PUBLISH" $eol "VERSION:2.0" $eol"CALSCALE:GREGORIAN"$eol "PROID:domain.tld" $eol;

while (
$event mysqli_fetch_array($db_erg))
{
if (
$event["prioritaet"<16) {

sscanf($event["start"], "%4s-%2s-%2s %2s:%2s"$dbJahr$dbMonat$dbTag$dbStunde$dbMinute);
sscanf($event["ende"], "%4s-%2s-%2s %2s:%2s"$dbJahr2$dbMonat2$dbTag2$dbStunde2$dbMinute2);
$cal_start $dbJahr $dbMonat $dbTag 'T' $dbStunde $dbMinute '00';
$cal_end $dbJahr2 $dbMonat2 $dbTag2 'T' $dbStunde2 $dbMinute2 '00';
$cal_current_time date("Ymd") . 'T' date("His");
$cal_title=$event["event"];
$cal_location $event["ort"];
$cal_description strip_tags($event["beschreibung"]);
$cal_description preg_replace('/\[.*?\](.*)\[\/.*?\]/isU'''$cal_description);
$cal_description str_replace($str_suche$str_ersatz$cal_description);

$cal_url "";

$alarm "ALARM";
$cal_alarm_datecreate date_create($dbJahr.'-'.$dbMonat.'-'.$dbTag.' '.$dbStunde.':'.$dbMinute.':00');
$cal_alarm_timestamp date_timestamp_get($cal_alarm_datecreate);

// wenn aktuelle Zeit vor Event, dann keinen Alarm auslösen
if ($cal_alarm_timestamp<$cal_timestamp){ $alarm "NOALARM"; }

// wenn in Beschreibung NOALARM als Textzeile vorhanden, dann keinen Alarm auslösen
if (strpos($cal_description"NOALARM")){ $alarm "NOALARM"; }    

// z.B.: wenn Priorität = 3, dann wenn Event-Name=Abfragename, dann keinen Alarm auslösen
if ($event["prioritaet"]=3){if ($event["name"] !== $abfragename ){$alarm "NOALARM";} }


$cal_ics_content .= 'BEGIN:VEVENT'.$eol.
'UID:' .$cal_start.$event["id"].$eol.
'DTSTART:'.$cal_start.$eol.
'DTEND:'.$cal_end.$eol.
'LOCATION:'.$cal_location.$eol.
'DTSTAMP:'.$cal_current_time.$eol.
'SUMMARY:'.$cal_title.$eol.
'URL;VALUE=URI:'.$cal_url.$eol.
'DESCRIPTION:'.$cal_description.$eol;

if (
$alarm!=="NOALARM"){
// obige Zeile vor $cal_ics_content .= 'BEGIN:VEVENT'.$eol. verschieben, wenn das gesamte Event nicht gespeichert werden soll
$cal_ics_content .= 'BEGIN:VALARM'.$eol.
'TRIGGER:-PT1H'.$eol.
'ATTACH;VALUE=URI:Basso'.$eol.
'ACTION:AUDIO'.$eol.
'DESCRIPTION:'.$cal_title.$eol.
'END:VALARM'.$eol.
'BEGIN:VALARM'.$eol.
'TRIGGER:-P1D'.$eol.
'ATTACH;VALUE=URI:Basso'.$eol.
'ACTION:AUDIO'.$eol.
'DESCRIPTION:'.$cal_title.$eol.
'END:VALARM'.$eol;
}

$cal_ics_content .= 'END:VEVENT'.$eol;
}    
}

$cal_ics_content .= 'END:VCALENDAR';

// ics-file begin
if ($abfragename !== "" ) { $StrFileName=$abfragename; }
$StrFileName=$StrPath.$StrFileName.".ics";
$IntFileOpenHandle fopen($StrFileName"wb");
fwrite($IntFileOpenHandle$cal_ics_content);
fclose($IntFileOpenHandle);
// ics-file end

?>