474 lines
13 KiB
PHP
474 lines
13 KiB
PHP
<?php
|
|
|
|
|
|
/**
|
|
*
|
|
* Ein Client für die Darstellung von Kalenderterminen und die Online-Buchung dieser Termine
|
|
* im Kontext von community.stattbuchung.de
|
|
*
|
|
* Jede Darstellung liest dabei die Daten vom community.stattbuchung.de Server ein und gibt diese Entsprechend aus
|
|
* Zur Authentifizierung wird Benutzername, Kennwort und der API-Key benötigt.
|
|
* Sollte im produktiven Einsatz immer SSL-gesichert verwendet werden.
|
|
*
|
|
* Autor: Thomas Mack
|
|
*/
|
|
|
|
|
|
include('client.php');
|
|
include('template.php');
|
|
$ini = parse_ini_file('config.ini');
|
|
|
|
$debug=false;
|
|
|
|
/**
|
|
* Für jede Aktion wird ein Opcode an den Server geschickt.
|
|
* Dieser wird mit weiteren Daten im JSON-Format parametrisiert.
|
|
* Die jeweils notwendigen Paramater variieren.
|
|
* In jedem Fall sollte der API-Key unter dem Attribut 'de_stattbuchung_Kanal'
|
|
* enthalten sein
|
|
*/
|
|
define("opcObjectlistProdukt", 256160);
|
|
define("opcObjectlistEventNachZeitraum", 255100);
|
|
define("opcQueryProdukt",256167);
|
|
define("opcLoadProduktContainer",256168);
|
|
define("opcFetchTreffpunkt",256141);
|
|
define("opcCalendarByChannel",257000);
|
|
define("opcFetchTermindetail",257001);
|
|
define("opcAddAnmeldung",257002);
|
|
define("opcStichwortlistByKanal",257003);
|
|
define("opcPaymentStepOne",257007);
|
|
|
|
/**
|
|
* Ende OPCODE Definition
|
|
*/
|
|
|
|
define("templatePath",$ini['templatePath'].'/');
|
|
|
|
function renderProduktliste($resp, $sessionInfo, $query) {
|
|
echo "<div class='container'>";
|
|
echo "<div class='result'><h3><span class='fa fa-search'></span>Die Suche nach <em>".$query."</em> ergab ".$resp["items"][0]["resultSetCount"]." Teffer</h3>";
|
|
$queryresult = $resp["items"];
|
|
|
|
foreach ($resp[items][0][items] as $produkt) {
|
|
echo "<div class='produktlistitem'><span class='fa fa-external-link'></span>";
|
|
echo "<a href='index.php?produkt=".$produkt["oid"]."'>";
|
|
echo $produkt["label"];
|
|
echo "</a>";
|
|
echo "</div>";
|
|
}
|
|
echo "</div>";
|
|
echo "</div>";
|
|
|
|
}
|
|
|
|
/**
|
|
* Beispiel für eine Navigation, die Termine jeweils eines Monats anbietet.
|
|
* StattBuchung benötigt immer einen Zeitraum von, bis im ISO-FORMAT
|
|
* Mit dieser Methode wird eine Abstraktion auf Ebenen von Monaten erreicht.
|
|
*
|
|
* Die Methode nutzt das HTML-Template 'nav_liste.inc'
|
|
* Für die Darstellung des Dezember 2018 werden folgende Parameter übergeben:
|
|
* - "monat_name" => 'Dezember' (Abhähngig von der Server-Locale),
|
|
* - "monat_down" => 11,
|
|
* - "jahr_down" => 2018,
|
|
* - "monat_up" => 1,
|
|
* - "jahr_up" => 2019
|
|
*/
|
|
function renderMonatNavigation($start) {
|
|
date_default_timezone_set('Europe/Berlin');
|
|
$akt = $start->getTimestamp();
|
|
$start->sub(new DateInterval('P1M'));
|
|
$ts =$start->getTimestamp();
|
|
$start->add(new DateInterval('P2M'));
|
|
$tsUp =$start->getTimestamp();
|
|
$params=array(
|
|
"monat_name" => strftime('%B',$akt),
|
|
"monat_down" => strftime('%m',$ts),
|
|
"jahr_down" => strftime('%G',$ts),
|
|
"monat_up" => strftime('%m',$tsUp),
|
|
"jahr_up" => strftime('%G',$tsUp)
|
|
);
|
|
$viewRow = new Template($params, templatePath);
|
|
echo $viewRow->render('nav_liste.inc');
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* Darstellung einer einfach Suchbox im oberen Seitenbereich.
|
|
* Die Darstellung wird im Template searchbox.inc erzeugt.
|
|
* Die Parametrisierung erfolgt in der HTML-Datei.
|
|
* Im einfachsten Fall wird nur ein Query-String übergeben.
|
|
* Es können zudem die Optionen von, bis, schlagwort, eventtyp gesetzt werden.
|
|
*
|
|
*/
|
|
|
|
function renderSearchBox() {
|
|
$params=array();
|
|
date_default_timezone_set('Europe/Berlin');
|
|
$viewRow = new Template($params, templatePath);
|
|
echo $viewRow->render('searchbox.inc');
|
|
|
|
}
|
|
|
|
|
|
function renderSuccess() {
|
|
$params=array();
|
|
date_default_timezone_set('Europe/Berlin');
|
|
$viewRow = new Template($params, templatePath);
|
|
echo $viewRow->render('success.inc');
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* Darstellung des Anmeldeformulars für eine Veranstaltung.
|
|
* Die Validierung der Felder ist in der Template-Datei zu realisieren.
|
|
* Falls eine online-Zahlung angeboten werden soll muss diese selbst implementiert werden.
|
|
* Erst nach erfolgter Zahlung dürfen die Daten an StattBuchung übermittelt werden.
|
|
*
|
|
*/
|
|
|
|
function renderAnmeldeformular($resp, $sessionInfo, $paypal, $step) {
|
|
$ep = $resp;
|
|
|
|
date_default_timezone_set('Europe/Berlin');
|
|
|
|
$viewRow = new Template($ep, templatePath);
|
|
$viewRow->properties['freitn'] =$ep["maxtn"]-$ep["tn"];
|
|
$viewRow->properties['von'] = new DateTime($ep["von"]);
|
|
$viewRow->properties['bis'] = new DateTime($ep["bis"]);
|
|
$viewRow->properties['paypal'] = $paypal;
|
|
$viewRow->properties['step'] = $step;
|
|
|
|
|
|
echo $viewRow->render('anmeldeformular.inc');
|
|
|
|
}
|
|
|
|
|
|
function renderTerminliste($resp, $sessionInfo, $query, $templatePrefix, $swlist) {
|
|
|
|
date_default_timezone_set('Europe/Berlin');
|
|
$view = new Template($swlist, templatePath);
|
|
|
|
echo $view->render($templatePrefix.'_head.inc');
|
|
|
|
foreach ($resp[items][0][items] as $ep) {
|
|
|
|
if($odd == true) {
|
|
$ep['odd_even'] = 'odd';
|
|
$odd = false;
|
|
} else {
|
|
$ep['odd_even'] = 'even';
|
|
$odd = true;
|
|
}
|
|
|
|
$viewRow = new Template($ep, templatePath);
|
|
if(is_int($ep["maxtn"])) {
|
|
$viewRow->properties["freitn"]=$ep["maxtn"]-$ep["tn"];
|
|
} else {
|
|
$viewRow->properties["freitn"]=99-$ep["tn"];
|
|
$viewRow->properties["maxtn"]=99;
|
|
}
|
|
|
|
$viewRow->properties['von'] = new DateTime($ep["von"]);
|
|
$viewRow->properties['bis'] = new DateTime($ep["bis"]);
|
|
|
|
echo $viewRow->render($templatePrefix.'_row.inc');
|
|
|
|
}
|
|
echo $view->render($templatePrefix.'_foot.inc');
|
|
|
|
}
|
|
|
|
|
|
|
|
function sendAnmeldung($id, $sessionInfo, $apikey, $oidang, $verkaufstelle, $zahlungsart, $postdata) {
|
|
date_default_timezone_set('Europe/Berlin');
|
|
|
|
$gebdate = new DateTime( $postdata['geburtsdatum']);
|
|
$params=array(
|
|
"oid" => $postdata['de_stattbuchung_event_Modul'],
|
|
"anrede"=>$postdata['anrede'],
|
|
"vorname"=>$postdata['vorname'],
|
|
"nachname"=>$postdata['nachname'],
|
|
"strasse"=>$postdata['strasse'],
|
|
"plz"=>$postdata['plz'],
|
|
"ort"=>$postdata['ort'],
|
|
"email"=>$postdata['email'],
|
|
"telefon"=>$postdata['telefon'],
|
|
// "institution"=>$postdata['institution'],
|
|
"geburtsdatum"=>$gebdate->format(DateTime::ATOM),
|
|
"de_bidat_av_Profiltyp_geburtsort"=>$postdata['geburtsort'],
|
|
"kommentar"=>$postdata['kommentar'],
|
|
"de_stattbuchung_event_Modul"=>$postdata['de_stattbuchung_event_Modul'],
|
|
"de_stattbuchung_Kanal"=>$apikey,
|
|
"de_stattbuchung_Verkaufsstelle"=>$verkaufstelle,
|
|
"systems_sdw_fi_Zahlungsart"=>$zahlungsart,
|
|
"systems_sdw_hr_Angestellter"=>$oidang
|
|
);
|
|
|
|
foreach ($postdata as $key => $value) {
|
|
if(strpos($key, "de_stattbuchung_Teilnehmerart_") === 0) {
|
|
$params[$key] = $value;
|
|
}
|
|
}
|
|
|
|
$resp=post($sessionInfo, opcAddAnmeldung, $params, "{}", $debug) ;
|
|
|
|
if($resp['beschreibung'] == 'OK') {
|
|
echo "<h1>Herzlichen Dank für Ihre Anmeldung</h1>";
|
|
echo "<div>Sie sollten in Kürze eine Nachricht über die Adresse ".$postdata['email']." erhalten.</div>";
|
|
} else {
|
|
echo "<h1>Ups</h1>";
|
|
echo "<div>Bei der Anmeldung ist etwas schief gelaufen, bitte versuchen Sie es erneut </div>";
|
|
|
|
echo "<hr><small>".$resp['beschreibung']."</small>";
|
|
|
|
}
|
|
return $resp;
|
|
}
|
|
|
|
function renderTerminDetail($resp, $sessionInfo, $showmap, $cssid) {
|
|
$ep = $resp;
|
|
//var_dump($resp);
|
|
date_default_timezone_set('Europe/Berlin');
|
|
|
|
$view = new Template($ep, templatePath);
|
|
|
|
$view->properties['cssid'] = $cssid;
|
|
if(is_int($ep["maxtn"])) {
|
|
$view->properties['freitn'] =$ep["maxtn"]-$ep["tn"];
|
|
} else {
|
|
$view->properties['freitn'] =99-$ep["tn"];
|
|
$view->properties['maxtn'] =99;
|
|
|
|
}
|
|
$view->properties['von'] = new DateTime($ep["von"]);
|
|
$view->properties['bis'] = new DateTime($ep["bis"]);
|
|
$view->properties['validFrom'] = new DateTime($ep["validFrom"]);
|
|
|
|
$view->properties['showmap'] = $showmap;
|
|
|
|
echo $view->render('termindetail.inc');
|
|
|
|
}
|
|
|
|
function renderTerminDetailListenansicht($resp, $sessioninfo) {
|
|
echo "<div id='bidat-events'>";
|
|
|
|
if($resp[items][0][itemCount]==0) {
|
|
echo "<div class='error-message'>Ihre Anfrage hat keine Termine ergeben.</div>";
|
|
} else {
|
|
$odd = true;
|
|
foreach ($resp[items][0][items] as $termin) {
|
|
if($odd == true) {
|
|
$termin['odd_even'] = 'odd';
|
|
$odd = false;
|
|
} else {
|
|
$termin['odd_even'] = 'even';
|
|
$odd = true;
|
|
}
|
|
renderTerminDetail($termin, $sessionInfo, false, 'bidat_list');
|
|
}
|
|
}
|
|
echo "</div>";
|
|
|
|
}
|
|
|
|
|
|
|
|
function fetchTreffpunkt($id, $sessionInfo) {
|
|
$params=array("oid" => $id);
|
|
$treffpunkt=post($sessionInfo, opcFetchTreffpunkt, $params, "{}", $debug) ;
|
|
|
|
return $treffpunkt;
|
|
}
|
|
|
|
/**
|
|
* Lädt die Informationen zu einem Termin von StattBuchung
|
|
*
|
|
*/
|
|
|
|
function fetchTermindetail($id, $sessionInfo, $apikey, $verkaufstelle) {
|
|
$params=array(
|
|
"oid" => $id,
|
|
"de_stattbuchung_event_Modul"=>$id,
|
|
"de_stattbuchung_Verkaufsstelle"=>$verkaufstelle,
|
|
"de_stattbuchung_Kanal"=>$apikey
|
|
);
|
|
$resp=post($sessionInfo, opcFetchTermindetail, $params, "{}", $debug) ;
|
|
|
|
return $resp;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Main.
|
|
*
|
|
*/
|
|
|
|
try {
|
|
$sessionInfo=login($ini['host'], $ini['user'], $ini['psw'], $debug);
|
|
|
|
date_default_timezone_set('Europe/Berlin');
|
|
|
|
//$resp=get($sessionInfo, opcObjectlistProdukt, $params, $debug) ;
|
|
|
|
$treffpunktid = $_GET['treffpunkt'];
|
|
$registerid = $_GET['register'];
|
|
$modulid = $_GET['modul'];
|
|
$modultermine = $_GET['modultermine'];
|
|
|
|
$formid = $_GET['form'];
|
|
$stichwortkey = $_GET['stichwort'];
|
|
|
|
$monat = $_GET['monat'];
|
|
$jahr = $_GET['jahr'];
|
|
$maxResult = $_GET['maxResultLength'];
|
|
$teaser = $_GET['teaser'];
|
|
$viewStyle = $_GET['style'];
|
|
|
|
$verkaufstelle = $ini['de_stattbuchung_Verkaufsstelle'];
|
|
$zahlungsart = $ini['systems_sdw_fi_Zahlungsart'];
|
|
|
|
|
|
$view = new Template(array(), templatePath);
|
|
if($teaser > 0) {
|
|
$view->properties['bodyid']="_teaser";
|
|
}
|
|
|
|
|
|
$view->title=$ini["seitentitel"];
|
|
if(is_null($ini["css"])) $view->properties['css'] = 'bidat.css';
|
|
else $view->properties['css'] = $ini["css"];
|
|
|
|
echo $view->render('header.inc');
|
|
|
|
|
|
|
|
|
|
if ($ini['show_stichwort_selector'] == true) {
|
|
$params=array("oid" => "0",
|
|
"de_stattbuchung_Kanal"=>$ini["apikey"],
|
|
"de_stattbuchung_event_Typ"=>$ini["de_stattbuchung_event_Typ"]);
|
|
|
|
if($jsonString == NULL) $jsonString = "{}";
|
|
$swlist=post($sessionInfo, opcStichwortlistByKanal, $params, $jsonString, $debug) ;
|
|
} else {
|
|
$swlist = NULL;
|
|
}
|
|
|
|
|
|
if($treffpunktid > 100) {
|
|
|
|
fetchTreffpunkt($treffpunktid, $sessionInfo);
|
|
|
|
} else if( $_GET['success']==true) {
|
|
renderSuccess();
|
|
}
|
|
|
|
else if($registerid == 872) {
|
|
|
|
$resp = sendAnmeldung($registerid, $sessionInfo, $ini['apikey'], $ini['oid_ang'], $verkaufstelle, $zahlungsart, $_POST);
|
|
|
|
if($ini['paypal'] == true) {
|
|
header('Content-type: application/json');
|
|
echo json_encode($resp);
|
|
} else {
|
|
renderSuccess();
|
|
}
|
|
|
|
} else if ($modulid > 100) {
|
|
|
|
renderTerminDetail(fetchTermindetail($modulid, $sessionInfo, $ini['apikey'], $verkaufstelle), $sessionInfo, TRUE, 'eb-event-page');
|
|
|
|
} else if ($formid > 100) {
|
|
$paypal = false;
|
|
if($ini['paypal']== true) $paypal = true;
|
|
|
|
renderAnmeldeformular(fetchTermindetail($formid, $sessionInfo, $ini['apikey'], $verkaufstelle), $sessionInfo, $paypal, 1);
|
|
|
|
} else if($treffpunktid > 100) {
|
|
$paypal = false;
|
|
if($ini["paypal"]=='true') $paypal = true;
|
|
|
|
renderAnmeldeformular($registerid, $sessionInfo, $paypal);
|
|
|
|
} else if($teaser > 0) {
|
|
$params=array("oid" => "0",
|
|
"de_stattbuchung_Kanal"=>$ini["apikey"],
|
|
"de_stattbuchung_event_Typ"=>$ini["de_stattbuchung_event_Typ"],
|
|
"maxResultLength"=>$teaser);
|
|
$resp=post($sessionInfo, opcCalendarByChannel, $params, $jsonString, $debug) ;
|
|
renderTerminliste($resp, $sessionInfo, '','teaser', NULL);
|
|
|
|
|
|
} else {
|
|
|
|
if ($ini['show_searchbox']==true) {
|
|
renderSearchBox();
|
|
}
|
|
|
|
$query =$_GET['query'];
|
|
$query=htmlspecialchars($query);
|
|
|
|
$params=array("oid" => "0",
|
|
"de_stattbuchung_Kanal"=>$ini["apikey"],
|
|
"de_stattbuchung_event_Typ"=>$ini["de_stattbuchung_event_Typ"]);
|
|
if($query !== '') {$params['muster']=$query;}
|
|
if($modultermine >0) {$params['de_stattbuchung_Produkt']=$modultermine;}
|
|
if($maxResult > 0) {
|
|
$params['maxResultLength'] = $maxResult;
|
|
} else {
|
|
$params['maxResultLength'] = 100;
|
|
}
|
|
|
|
if($stichwortkey != 'NULL') {
|
|
$params['de_stattbuchung_Stichwort_key'] = $stichwortkey;
|
|
}
|
|
|
|
|
|
if(!is_null($monat)) {
|
|
if(is_null($jahr)) {
|
|
$jahr = date ('Y', time());
|
|
}
|
|
if ($monat >12) {
|
|
$jahr++;
|
|
$monat = $monat-12;
|
|
} else if ($monat ==0) {
|
|
$jahr--;
|
|
$monat = 12;
|
|
}
|
|
|
|
$start = new DateTime( '1.'.$monat.'.'.$jahr);
|
|
$ende = new DateTime( '1.'.$monat.'.'.$jahr);
|
|
$ende->add(new DateInterval('P1M'));
|
|
$ende->sub(new DateInterval('P1D'));
|
|
|
|
$params['von'] = $start->format(DateTime::ATOM);
|
|
$params['bis'] = $ende->format(DateTime::ATOM);
|
|
|
|
|
|
}
|
|
$jsonString ="{oid:0}";
|
|
$resp=post($sessionInfo, opcCalendarByChannel, $params, $jsonString, $debug) ;
|
|
if($monat > 0) renderMonatNavigation($start);
|
|
if(is_null($stichwortkey) || $viewStyle == 'table') renderTerminliste($resp, $sessionInfo, $query, 'table', $swlist);
|
|
else renderTerminDetailListenansicht($resp, $sessioninfo);
|
|
|
|
}
|
|
|
|
// Ausloggen nicht vergessen!
|
|
logoff($sessionInfo, $debug);
|
|
|
|
} catch (Exception $e) {
|
|
echo 'Exception: '.$e->getMessage()." code: ".$e->getCode()."<br/>";
|
|
}
|
|
|
|
echo $view->render('footer.inc');
|
|
|
|
?>
|