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?


  • ChurchToolsMitarbeiter

    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?


  • ChurchToolsMitarbeiter

    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
    

Anmelden zum Antworten
 

Es scheint als hättest du die Verbindung zu ChurchTools Forum verloren, bitte warte während wir versuchen sie wieder aufzubauen.