Dienstpläne
-
Ich versuche die ganze Zeit eine Möglichkeit zu basteln, für die, die kein Internet haben den Dienstplan für ein halbes Jahr zu drucken, jedoch finde ich absolut keine passende API-Funktion mit der ich eine Auflistung für einen bestimmten Zeitraum zu einem bestimmten Dienst erhalte, an wann wer für welchen Dienst eingeteilt ist.
Hat schon jemand sowas ähnliches gebaut?
Kann mir jemand sagen, welche Funktion ich dafür brauche (vorzugsweise mit einem kleinen Beispiel). Ich danke schon mal vielmals für die Hinweise!
Grüße
Marko -
@mtlmarko89 Die Dienstpläne kannst du ja über den ical-Link runter laden.
Allenfalls könnte man was machen, analog dem da:
https://forum.churchtools.de/topic/2818/ct-exporter -
die Dienstpläne per iCal-Link habe ich nicht gefunden, aber man kann mit manuellem Anstoß, indem man sich den Dienstplan im CT direkt als CSV exportiert, die CSV kann man sich ins PHP einlesen und schon zurecht filtern, wie man es braucht.
Blöd ist hierbei nur, dass die Titelzeile über 2 Zeilen verteilt ist, weshalb das automatische zuordnen aktuelle nicht klappt, zumindest suche ich mir da noch einen Weg, vermutlich mit sowas wie "wenn NULL, dann lass den aktuellen Wert, ansonsten überschreibe" oder sowas in der 2. Zeile...
Viel besser wäre es aber auch, wenn man sich die "CSV" auch direkt ohne Datei-Erstellung ins Script laden könnte, das wäre dann so viel einfacher ... -
@mtlmarko89 Wenn du auf dem Dienstplan nach ganz unten scrollst, findest du den Link "Dienstplan abonnieren per iCal".
-
Ah, jetzt habe ich es gefunden, danke schön, aber inzwischen bin ich mit der CSV-Lösung auch schon fast fertig, Ich muss nur noch die "?" entfernen und für eine bessere Übersichtlichkeit noch einen Zeitraumfilter...
Auf jeden Fall, vielen Dank für deine Hilfe. Wie meine Lösung aussieht, werde ich später noch posten
-
@mtlmarko89 Da bin ich mal gespannt!
-
also auf meinem lokalen Web-Server habe ich einen Unterordner "functions". Darin befindet sich die Datei "csv.php".
<?php function getstructure($datei, $anzzeilen = 1, $trennzeichen = ";") { $structure = array(); $row = 1; if (($handle = fopen($datei, "r")) !== FALSE) { while ((($data = fgetcsv($handle, 1000, $trennzeichen)) !== FALSE) AND ($row 0) { $structure[$c] = utf8_encode($data[$c]); } } $row++; } } return $structure; } function read_csv($datei, $structure, $zbeginn = 2, $trennzeichen = ";", $timefilter1 = "", $timefilter2 = "") { $csv = array(); $row = 1; $Dt1 = new DateTime("31.12.1999 23:59:59"); $Dt2 = new DateTime("31.12.1999 23:59:59"); if (strlen($timefilter1) > 0) { $Dt1 = new DateTime($timefilter1); } if (strlen($timefilter2) > 0) { $Dt2 = new DateTime($timefilter2); } if (($handle = fopen($datei, "r")) !== FALSE) { while ((($data = fgetcsv($handle, 1000, $trennzeichen)) !== FALSE)) { if ($row >= $zbeginn) { $num = count($data); $dataset = array(); $doadd = true; for ($c=0; $c= $tDt) { if ($Dt < $Dt1) { $doadd = false; } } if ($Dt2 >= $tDt) { if ($Dt > $Dt2) { $doadd = false; } } } if ($doadd) { $dataset[$structure[$c]] = utf8_encode($data[$c]); } } $csv[] = $dataset; } $row++; } } return $csv; } function filterstructure($struc, $anz = 0, $word = "") { $structure = array(); $a = 0; foreach ($struc as $str) { if (($a <= $anz) or (strlen($word) < 1) or (strtolower($word) == strtolower($str))) { $structure[] = $str; } $a++; } return $structure; } ?>
Zur Erläuterung: Die erste Funktion "getstructure" liest die obersten x Zeilen ($anzzeilen) aus und bastelt daraus die Feldtitel zusammen und speichert diese in ein Array.
Die 3. der Funktionen ("filterstructure") arbeitet basierend auf der 1. Funktion, hier kann eingeschränkt werden, welche der Felder man nutzen will. Die 2. Funktion "read_csv" fängt dort an, wo die 1. Funktion aufhört. Hier wird der Inhalt der CSV-Datei eingelesen und ebenfalls in Array gespeichert. So viel zur der Hilfsdatei. Hier kommt nun der Inhalt meiner aktuellen index.php (werde diese später mit dem Design erweitern und zu dienstplan.php umbenennen oder sowas).<?php include_once('functions/csv.php'); $dienst = "Lobpreis"; $DatumVon = "01.08.2017 00:00:00"; $DatumBis = "31.12.2017 23:59:59"; $struc = getstructure("dienstplan.csv", 2); $structure = filterstructure($struc, 3, $dienst); $arr = read_csv("dienstplan.csv", $struc, 3, ";", $DatumVon, $DatumBis); ?><!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <?php echo ' <table width=100%>'."\n"; echo ' <tbody>'."\n"; echo ' <tr>'."\n"; foreach ($structure as $th) { echo ' <th>'.$th.'</th>'."\n"; } echo ' </tr>'."\n"; foreach ($arr as $dataset) { echo ' <tr>'."\n"; foreach ($structure as $th) { if ($th == $dienst) { echo ' <td>'.str_replace(", ","<br />",$dataset[$th]).'</td>'."\n"; } else { echo ' <td>'.$dataset[$th].'</td>'."\n"; } } echo ' </tr>'."\n"; } echo ' </tbody>'."\n"; echo ' </table>'."\n"; ?> </body> </html>
Dadurch, dass ich hier nun keine Daten direkt aus ChurchTools hole, ist hier das sonst übliche Login nicht nötig. Kurz zu dem, was ich hier mache. Zunächst definiere ich die Parameter für die Aufrufe, also welchen Dienst ich darstellen will und von welchem Zeitraum (andere Schreibweisen aktuell nicht getestet), dann wird die Struktur ermittelt und anschließend auf den interessanten Teil eingeschränkt und dann die Daten eingelesen. Diese Daten werden dann in diesem Fall tabellarisch dargestellt.
Ich hoffe, ich habe jetzt nicht zu viel beschrieben. Und ja, ich bin mir sicher, dass es bestimmt auch elegantere Varianten gibt und gewisse Stellen effizienter gestaltet werden könnten. Aber das ist, was wir brauchen und was ich in möglichst wenig Zeit zusammenbasteln konnte
Ach ja, Voraussetzung ist zudem, dass der als CSV exportierte Dienstplan mit bei dem PHP-Skript liegt und der Wert des Parameters für den Dienst, muss genauso geschrieben werden, wie der gewünschte Dienst.
Irgendwie ist nicht alles vorhanden. Problem scheint das Größer-Als und das Kleiner-Als zu sein. Kann man das irgendwie umgehen?
-
@mtlmarko89 sagte in Dienstpläne:
Irgendwie ist nicht alles vorhanden. Problem scheint das Größer-Als und das Kleiner-Als zu sein. Kann man das irgendwie umgehen?
Wenn Du Leerzeichen rund um Größer-als und Kleiner-als lässt, könnte es klappen. Habe ich m.W. auch mal so hinbekommen ...