Vom Calendar Objekt zum zugehörigen Event kommen?
-
Hallo,
wahrscheinlich oute ich mich mit dieser Frage als ziemlicher Neuling. Aber mir ist es leider nicht gelungen, hier dafür eine Antwort zu finden.
Ich ermittle mittels PHP Daten aus Kalendern:
$appointments = AppointmentRequest::forCalendars([2,3])
?->where("from", "2023-04-01")
?->where("to", "2023-05-01")
?->get() ?? [];und kann z.B. durch iterieren und Infos anzeigen:
foreach ($appointments as $curAppointment)
{
$gsd = $curAppointment->getStartDate();
echo ...
...Gibt es auch eine Funktion, um ein evtl. zugehöriges Event Objekt zu ermitteln und so die dort "Diensthabenden" zu ermitteln?
Vielen Dank & Grüße
Erwin -
@erwincramer Tust Du nicht
Ich beziehe mich im folgenden auf die Nomenklatur der RestAPI, wie das bei Dir in php mußt Du noch rausfinden.
Du holst ja die Termineliste über /calendars/appointments - bei Dir AppointmentRequest::forCalendars
Ergebnis eines Eintrages is z.B.:
...
{
"base": {
"id": 432065,
"caption": "Gottesdienst",
...
"calendar": {
"id": 2,
"name": "Gottesdienste & Andachten",
"nameTranslated": "Gottesdienste & Andachten",
...
}
},
"information": "mit Pfr. Ralf Bürzele. ...",
...
"startDate": "2023-03-26T07:15:00Z",
...
},
"onBehalfOfPid": null
},
"calculated": {
"startDate": "2023-03-26T07:15:00Z",
"endDate": "2023-03-26T08:15:00Z"
}
},Leider enthält diese Liste zunächst nicht den eventurl. Diesen bekommt man dann über
/calendars/{calendarId}/appointments/{appointmentId}/{startDate}
d.h. aus dem geholten Eintrag calenderID, appointmentId und startDate (ohne Uhrzeit!!) auslesen und dann diese Funktion aufrufen. Ergebnis für diesen Eintrag sieht dann so aus:{
"data": {
"appointment": {
"base": {
"id": 432068,
"caption": "Gottesdienst",
...
},
"information": "mit Pfr. Ralf Bürzele. ...",
...
"startDate": "2023-03-26T08:15:00Z",
...
},
"event": {
"title": "Gottesdienst",
"domainType": "event",
"domainIdentifier": "677",
"apiUrl": "https://elkw0303.krz.tools/api/events/677",
"frontendUrl": "https://elkw0303.krz.tools/?q=churchservice#ListView/searchEntry:%23677/",
"imageUrl": null,
"icon": "calendar-day",
"domainAttributes": []
},
...
}Mit der apiUrl kommt man dann direkt zum gewünschten Event - so vorhanden. Die Dienste haben dort aber nur eine numerische Id, d.h. die muß man ggf. über /event/masterdata
Ich kann DIr leider kein Code-Snippet geben, da ich bisher nur Zeit hatte, das von Hand auszuprobieren und noch nicht, was dazuzuprogrammieren. Und php wär's eh nicht.
HTH!
-
Ja, die Verbindung zwischen Termin und Event könnte durchaus etwas einfacher sein.
Ich mache es noch etwas anders: Zu den Terminen in einem gegebenen Zeitfenster hole ich mir gleich noch alle Events mit
/api/events?direction=forward&include=eventServices&from=" + str(from_date) + "&to=" + str(to_date)
und suche dann jeweils nach der appointmentId unter diesen Events. Dadurch kann ich die Zahl der REST-Requests erheblich reduzieren.
-
@thommyb Ah, das ist eine gute Idee.
Grundsätzlich könnte /calendars/appointments auch gleich die url zum Event ausspucken - das wär fein.
-
@ralf-bürzele Vielen Dank für die prompte Hilfe, ich werde beide Ansätze mal ausprobieren.
-
@erwincramer Hi Erwin,
wenn ich das richtig interpretiert habe nutzt du den ChurchTools-API Wrapper von unserem Team hier (https://github.com/5pm-HDH/churchtools-api)?
Ich hab die Verbindung zwischen Appointment und Event bisher nicht berücksichtigt, weil wie auch @thommyb schreibt, gibt es bisher keine geeignete API-Route dazu.
Hier mal ein Code-Beispiel im Stile des API-Wrappers:
$appointment = AppointmentRequest::forCalendar(54)->get()[0]; // Rufe alle Events für den Appointment Tag ab. $events = EventRequest::where("from", date("Y-m-d", strtotime($appointment->getStartDate()))) ->where("to", date("Y-m-d", strtotime($appointment->getEndDate() . " + 1 day"))) ->get(); // Filter Events nach Titel $events = array_filter($events, function(Event $event) use ($appointment){ return $appointment->getCaption() == $event->getName(); }); // Wenn wir nur ein Element im Array erwarten, können wir über die "end"-Methode das letzte Element auswählen. $firstEvent = end($events); print_r($firstEvent);
-
Update Sept. 2023:
Es gibt mittlerweile einen eigenen API Endpunkt, mit dem sich zu einem Termin (Appointment) die zugehörigen Buchungen und das Event abrufen lassen:
/calendars/{calendarId}/appointments/{appointmentId}/{startDate}
@aschild Hat den Endpunkt auch für den ChurchTools-API Wrapper umgesetzt:
$calendarId = 2; $appointmentId = 13; $combinedAppointment = CombinedAppointmentRequest::forAppointment($calendarId, $appointmentId, "2023-10-01")->get(); $appointment = $combinedAppointment->getAppointment(); // see Appointment-Model $event = $combinedAppointment->getEvent(); // see Event-Model $bookings = $combinedAppointment->getBookings(); // see Booking-Model
Siehe Dokumentation.
-