API-Abfrage: "Wer hat in der nächsten Woche Geburtstag?"
-
Wir wollen möglichst automatisiert eine Liste generieren, welche Mitglieder in der kommenden Woche Geburtstag haben. Hat jemand ein Code-Beispiel, wie man mit den Geburtstagen über die API "jonglieren" kann?
Habe wohl
https://api.churchtools.de/function-getBirthdayList.html
gefunden, aber wie kann ich nun getBirthdayList per API aufrufen und dabei $diff_from und $diff_to selbst übergeben? -
Habe ich Dir dann in 3.11 gebaut, siehe getBirthdayList()
https://api.churchtools.de/class-CTChurchDBModule.html -
Klasse! Ab wann werden wir das nutzen können?
(Bitte jetzt nicht antworten: "Wenn 3.11 veröffentlicht ist". Ich würde gern meinen Leuten gegenüber ein - halbwegs - konkretes Datum nennen können. Danke!)BTW: Müsste 3.11 nicht eigentlich 3.1.1 heißen?
-
Die kommt morgen abend raus:)
-
@jmrauen sagte:
> Die kommt morgen abend raus:)Yippeh!
-
Beispielcode (an einigen Stellen noch nicht gut aufgeräumt ...):
(Wichtig: alle Dateien müssen am Anfang noch eine Zeile
< ? php
vorangestellt bekommen - Leerzeichen in der Zeile bitte entfernen. Außerdem Leerzeichen unmittelbar hinter "< " entfernen. Das musste ich etwas verbiegen, der Code wird hier sonst nicht richtig angezeigt.)Datei geb.php:
require_once('lib.php'); if (!isset($_GET['w'])) exit; $w = intval(@$_GET['w']); $d = isset($_GET['d']) ? intval($_GET['d']) : 1; if ($d < 1) $d = 1; if ($d > 8) $d = 8; $from = 7 - date("N") + (7 * $w); $to = $from - 1 + $d * 7; $ts = mktime(0, 0, 0, date("n"), date("j") + $from, date("Y")); echo '< html> < head> < meta http-equiv="content-type" content="text/html; charset=utf-8"> < /head> < body> '; echo '< a href="?w=' . ($w - 1) . '">Eine Woche früher< /a> - < a href="?w=' . ($w + 1) . '">Eine Woche später< /a>< br>'; echo "< b>Sonntagsblatt " . date("d.m.Y", $ts) . '< /b>< br>< br>'; $domain = login(); if(is_array($domain)) $domain = $domain["domain"]; $url = $domain . '?q=churchdb/ajax'; $data = array('func' => 'getBirthdayList', "from" => $from, "to" => $to); $oData = sendRequest($url, $data); list($n, $aGeb) = erzeugeGeburtstagsarray($oData); echo '< hr>' . erzeugeSatz($aGeb) . '< hr>'; echo ' < /body> < /html> '; /* * ************************************************************ */ /** * Überführt die abgerufenen Daten in ein Array Datum->Person * @param type $oData * @return array (Anzahl, Datenarray) */ function erzeugeGeburtstagsarray($oData) { /* Geburtstags-Array aus eingelesenen Daten erzeugen */ $aGeb = array(); $n = 0; foreach ($oData as $nam => $dat) { if ($dat->status == 'Mitglied') { $n++; if (!isset($aGeb[$dat->geburtsdatum_compact])) $aGeb[$dat->geburtsdatum_compact] = array(); $aGeb[$dat->geburtsdatum_compact][] = $dat->vorname . ' ' . $dat->name; echo $dat->vorname . ' ' . $dat->name . ' (' . $dat->geburtsdatum_compact . ')'; } } return array($n, $aGeb); } /** * * @global integer $n Anzahl der Personen * @global integer $d Anzahl Wochen * @param type $aGeb Array mit Datum und Namen * @return string html */ function erzeugeSatz($aGeb) { /** Satz aus Geburtstags-Array erzeugen */ global $n, $d, $ts; $satz = ''; $nHeute = 0; $o = 0; foreach ($aGeb as $datum => $aPersonen) { $bHeute = $datum == date("d.m.", $ts); if ($bHeute) { $nHeute = count($aPersonen); // "Heute" haben $nHeute Personen Geburtstag } foreach ($aPersonen as $k => $sPerson) { $o++; $bErstes = ($o == 1) || ($o == ($nHeute + 1)); if ($bErstes) { $satz .= $bHeute ? 'Heute ' . ($nHeute > 1 ? 'haben' : 'hat') . ' ' : ($satz ? ', und in' : 'In') . ($d == 1 ? ' dieser Woche ' : " diesen $d Wochen ") . ($o < $n ? 'haben' : 'hat') . ' '; } else { $satz .= ($o < ($bHeute ? $nHeute : $n)) ? ', ' : ' und '; } $satz .= $sPerson; } $satz .= " ($datum)"; if (($o == $n) || $bHeute) { $satz .= ' Geburtstag'; } } return $satz; }
Datei lib.php:
/* * * * Funktionen für ChurchTools-API */ /** * API-Login */ if (!function_exists("login")) { function login($m = false, $p = false) { require('conf.php'); if ($m) $mail = $m; if ($p) $pw = $p; $url = $domain . '?q=login'; $data = array('email' => $mail, 'password' => $pw, 'directtool' => 'yes'); $r = sendRequest($url, $data); return array("domain"=>$domain, "result"=>$r, "mail"=>$mail); } } function logout() { require('conf.php'); $url = $domain . '?q=logout'; $data = array('func' => 'logout', 'directtool' => 'yes'); $r = sendRequest($url,$data); if ($r) { $x = deleteCookies(); return $r; } else return false; } /** * Get saved Cookies from filesystem and returns an array * @return array of Cookies in string */ if (!function_exists("getCookies")) { function getCookies() { $sCombined = ''; $aCookies = glob("*.txt"); $n = count($aCookies); if ($n !== 0) { $counter = 0; while ($counter < $n) { $sCombined .= file_get_contents($aCookies["$counter"]) . ';'; ++$counter; } return $sCombined; } else { return $n; } } } function deleteCookies() { $aCookies = glob("*.txt"); $n = count($aCookies); if ($n !== 0) { $counter = 0; while ($counter < $n) { unlink($aCookies["$counter"]); ++$counter; } return true; } else { return $n; } } /** * Save cookies from $aRH (http response header) to the filesystem * @param $aRH */ if (!function_exists("saveCookies")) { function saveCookies($aRH) { $n = count($aRH); // Number of Pieces $counter = 0; while ($counter < $n) { if (preg_match('@Set-Cookie: (([^=]+)=[^;]+)@i', $aRH["$counter"], $matches)) { $fp = fopen($matches["2"] . '.txt', 'w'); fwrite($fp, $matches["1"]); fclose($fp); } ++$counter; } } } /** * Send request to $url with $data * @param [type] $url [description] * @param [type] $data [description] * @param [string] $get liefert $aRes->data->$get statt $aRes->data zurück; */ function sendRequest($url, $data, $get = false) { $options1 = array( 'http' => array( 'header' => "Cookie: " . getCookies() . "\r\nContent-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data), ), ); $context = stream_context_create($options1); $result = file_get_contents($url, false, $context); saveCookies($http_response_header); $aRes = json_decode($result); if (isset($aRes->data)) { if ($get == false) { return $aRes->data; } else { return $aRes->data->$get; } return false; } return false; } //} /** * Gibt den Inhalt eines Objekts HTML-formatiert zurück * @param type $obj * @return string HTML */ function toHtml($obj) { $html = ''; foreach ($obj as $k => $v) { $html .= "$k: "; if (is_object($v)) $html .= toHtml($v); elseif (is_string($v)) $html .= $v; elseif (is_array($v)) $html .= toHtml($v); else $html .= '(?)'; $html .= ''; } $html .= ''; return $html; }
Datei conf.php:
// Hier die Daten für den Zugriff zum eigenen ChurchTools eintragen: $domain = 'https://xxx.church.tools/'; $mail = 'mail@adresse.de'; // Mailadresse eines Users, der die Daten auslesen darf $pw = 'passwort'; // Das Passwort des Users