Geburtstagsliste per API Aufruf



  • Hallo,

    möchte auf einer Website alle Geburtstage 7 Tage vor und 30 Tage nach dem aktuellen Datum anzeigen.
    Allerdings bekomme ich irgendwie gar keine Daten zurück außer: Login Erfolgreich.
    Egal welches Beispiel ich auch ausprobiere. Gibt aber auch keinerlei Fehlermeldung.
    Viele Beispiele gibt es ja leider nicht (oder habe ich da eine Resource übersehen?)

    Hat jemand einen Tipp oder gar ein funktionierendes Beispiel?

    Danke und Gruß
    Christian

    Mein Code:

    ''' 'login',
    'email' => 'xxx',
    'password' => 'yyy');
    $result = sendRequest($url, $data);
    if ($result->status == "fail") {
    echo $result->data;
    return;
    }
    echo "Login erfolgreich!";
    // Now get all Birthdays
    $url = 'https://fcgn.churchtools.de/index.php?q=churchDB/ajax';
    $data = array('func' => 'getBirthdayList', 'from'=> '5', 'to' => '10');
    $result = sendRequest($url, $data);
    echo "Userlist:";
    if($result->status=="fail"){
    echo $result->data;
    echo "nix wars";
    return;
    }
    print_r($result->data);
    echo "Ende der Geburtstags-Liste";

    ?>'''



  • Irgendwie hat sich der Code verabschiedet...

    0_1487019538973_Bildschirmfoto 2017-02-13 um 19.41.35.png



  • Hallo,

    du hast hier Deine Anmeldedaten im Klartext reingeschrieben. Bitte umgehend ein neues Passwort vergeben.

    Tschüß Franz



  • @f.goethel Danke!



  • @chs Bitte ;-)



  • Vor etwa einem Jahr habe ich mal den u.g. php-Code geschrieben, um automatisch einen Satz zu generieren, wer nächste Woche Geburtstag hat. Dieser Satz wird bei uns immer auf dem Sonntagsblatt mit abgedruckt. Das Skript muss anfangs mit dem Parameter ?w=0 aufgerufen werden.

    Man kann dann wochenweise vor- oder zurückblättern und mit einem zusätzlichen Parameter d auch noch eine Wochenanzahl >1 wählen (wird z.B. für die gesamten Sommerferien benutzt, wenn das Sonntagsblatt nicht jede Woche aktuell produziert wird). Angenommen also, der Code steht in einer PHP-Datei geburtstage.php, dann könnte man diese Datei mit
    geburtstage.php?w=0&d=2
    aufrufen, um eine 2-Wochen-Vorschau zu bekommen.

    Als Filter ist eingebaut, dass nur tatsächliche Mitglieder der Gemeinde hier berücksichtigt werden.

    Ich denke, die Art, wie hier die Geburtstage ausgelesen werden, könnte Dir vielleicht als Anregung dienen.

    (Achtung: die Leerzeichen hinter < habe ich hier nur eingefügt, damit der Code richtig dargestellt wird.)

    < ?php
    if(!isset($_GET['w'])) exit;
    ?>
    < html>
    < head>
    < meta http-equiv="content-type" content="text/html; charset=utf-8">
    < /head>
    < body>
    < ?php
    
    $domain = 'https://xxxxx.churchtools.de/';
    $mail = 'xxxx@xxxxxxxx.de';
    $pw = 'xxxxxxx';
    
    $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); // Tagesdifferenz zu "heute" für den Sonntag (Startdatum) der gewünschten Woche
    $to = $from - 1 + $d * 7; // Tagesdifferenz zu "heute" für das Enddatum nach $d Wochen
    $ts = mktime(0,0,0,date("n"),date("j")+$from,date("Y")); // Lesbares Datum des Start-Sonntags
    
    
    echo '< a href="?w='.($w-1).'">Eine Woche früher< /a> - < a href="?w='.($w+1).'">Eine Woche später< /a>< br>< br>';
    
    echo "< b>Sonntagsblatt ".date("d.m.Y",$ts).'< /b>< br>< br>';
    
    
    
    // Login to churchtools
    $url = $domain.'?q=login';
    $data = array('email' => $mail, 'password' => $pw, 'directtool' => 'yes');
    sendRequest($url, $data);
    
    // Now get birthday data
    $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>
    ';
    /***************************************************************/
    
    
    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);
    }
    
    function erzeugeSatz($aGeb) {
    	/**
    	 Satz aus Geburtstags-Array erzeugen
    	*/
    	global $n, $d;
    	$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;
    }
    
    
    
    
    /**
     * Get saved Cookies from filesystem and returns an array
     * @return array of Cookies in string
     */ 
    function getCookies() {
      $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;
      }
    }
    
    /**
     * Save cookies from $aRH (http response header) to the filesystem
     * @param $aRH
     */
    function saveCookies($aRH) {
      $n = count($aRH); // Number of Pieces
      $counter = 0;
      while ($counter  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;
    }
    
    
    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 .= '-array-';
    		else $html .= '(?)';
    		$html .= '';
    	}
    	$html .= '';
    	return $html;
    }
    


  • @artus70

    vielen Dank für deine Mühe.
    Auch wenn es mehr ist, als ich eigentlich brauche.
    Der Benutzer soll gar nicht interaktiv tätig werden.

    Jedenfalls, hab ich es ausprobiert (bzw. versucht).
    Leider läuft das script auf einen Fehler.
    Hast du einen Tipp für mich?

    0_1487973246086_Bildschirmfoto 2017-02-24 um 22.52.04.png



  • @artus70

    ...waren nur die Cookies. Hab den Teil rausgenommen.



  • Hallöchen,
    ich bin ganz neu im Umgang mit ChurchTools und um noch ein paar zusätzliche Notwendigkeiten bereitstellen zu können, möchte ich noch ein paar Dinge mit Hilfe der API zusammenstellen. Um ein wenig zu üben, wollte ich diese Geburtstagsliste nachbauen und optisch etwas verändern. Soweit passt alles, jedoch kommen von dem Aufruf nur die Personen, die den Status 3 = "Mitglied" haben (auch ohne die Bedingung in der Funktion "erzeugeGeburtstagsarray"). Es gibt bei uns 3 verschiedene Arten von Status, die 2 zusätzlichen sind abgesehen von der Rechtevergabe und vom Namen identisch zur 3. Weiß jemand zufällig, was passieren würde, wenn ich den Status 3 lösche, was dann noch geladen wird, bzw. ob ich innerhalb von ChurchTools noch irgendwo eine Einstellung vornehmen muss, damit die anderen 2 Stati mit geladen werden?



  • ok, habe es nun selbst herausgefunden, das kann man in den Admin-Einstellungen im Register "ChurchDB" einstellen, die Labelbeschriftung wäre dann "Status-Ids für die Geburtstagsliste (kommasepariert) *"



  • @mtlmarko89 wie sieht dein Aufruf aus,? Ist evtl für andere auch interessant.



  • Im Prinzip genauso wie das weiter oben, nur dass ich das in eine Tabelle einordne und auf die zusätzlichen Funktionen verzichte (Das Login vorher und die Grundstruktur meine Homepage lasse ich mal aus Platzgründen beiseite):

    $host = 'instanz.churchtools.de';
    $user = 'e-mail@domain.de';
    $pw = 'MeinPasswortIstGeheim';
    $w = 0;
    $d = 5;
    
    
    echo ''."\n";
    echo ''."\n";
    echo ''."\n";
    echo 'Nachname'."\n";
    echo 'Vorname'."\n";
    echo 'Tage'."\n";
    echo 'Alter'."\n";
    echo 'Status'."\n";
    echo ''."\n";
    
    if($d < 1) $d = 1;
    if($d > 8) $d = 8;
    
    $from = 7-date("N") + (7 * ($w-1)); // Tagesdifferenz zu "heute" für den Sonntag (Startdatum) der gewünschten Woche
    $to = $from - 1 + $d * 7; // Tagesdifferenz zu "heute" für das Enddatum nach $d Wochen
    $ts = mktime(0,0,0,date("n"),date("j")+$from,date("Y")); // Lesbares Datum des Start-Sonntags
    
    //echo date("d.m.Y", $ts)."\n";
              
    // Now get birthday data
    $url = 'https://'.$host.'/index.php?q=churchdb/ajax';
    $data = array('func' => 'getBirthdayList', "from" => $from, "to" => $to); 
    $oData = sendRequest($url,$data);
    
    //print_r($oData->data);
    
    foreach ($oData->data as $dataset)
    {
    //  print_r($dataset);
      echo ''."\n";
      echo ''.$dataset->name.''."\n";
      echo ''.$dataset->vorname.''."\n";
      echo ''.$dataset->diffDays.''."\n";
      echo ''.$dataset->age.''."\n";
      echo ''.$dataset->status.''."\n";
      echo ''."\n";
    }
    echo ''."\n";
    echo '';
    echo ''.date("d.m.Y", $ts)."\n";
    

    Wie schon gesagt, das ist zum Üben, sehr stark an den obigen Schnippseln angelehnt, nur dass hier w=0 die aktuelle Woche wäre, oben wäre die aktuelle Woche die 1 gewesen, also eigentlich nichts Neues.


Anmelden zum Antworten
 

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