• Aktuell
    • Tags
    • Beliebt
    • Benutzer
    • Gruppen
    • Suche
    • Registrieren
    • Anmelden

    Vom Calendar Objekt zum zugehörigen Event kommen?

    ChurchTools Schnittstellen
    php events calendar api
    4
    7
    391
    Lade mehr Beiträge
    • Älteste zuerst
    • Neuste zuerst
    • Meiste Stimmen
    Antworten
    • In einem neuen Thema antworten
    Anmelden zum Antworten
    Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
    • ErwinCramerE
      ErwinCramer
      zuletzt editiert von

      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

      Ralf BürzeleR 1 Antwort Letzte Antwort Antworten Zitieren 2
      • Ralf BürzeleR
        Ralf Bürzele @ErwinCramer
        zuletzt editiert von

        @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!

        Pfarrer und CT-Admin der Evang. Kirchengemeinde Althütte

        T ErwinCramerE 2 Antworten Letzte Antwort Antworten Zitieren 0
        • T
          thommyb ChurchToolsMitarbeiter @Ralf Bürzele
          zuletzt editiert von

          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.

          Ralf BürzeleR 1 Antwort Letzte Antwort Antworten Zitieren 0
          • Ralf BürzeleR
            Ralf Bürzele @thommyb
            zuletzt editiert von

            @thommyb Ah, das ist eine gute Idee.

            Grundsätzlich könnte /calendars/appointments auch gleich die url zum Event ausspucken - das wär fein.

            Pfarrer und CT-Admin der Evang. Kirchengemeinde Althütte

            1 Antwort Letzte Antwort Antworten Zitieren 0
            • ErwinCramerE
              ErwinCramer @Ralf Bürzele
              zuletzt editiert von

              @ralf-bürzele Vielen Dank für die prompte Hilfe, ich werde beide Ansätze mal ausprobieren.

              DumbergerLD 1 Antwort Letzte Antwort Antworten Zitieren 0
              • DumbergerLD
                DumbergerL @ErwinCramer
                zuletzt editiert von DumbergerL

                @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);
                
                DumbergerLD 1 Antwort Letzte Antwort Antworten Zitieren 0
                • DumbergerLD
                  DumbergerL @DumbergerL
                  zuletzt editiert von DumbergerL

                  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.

                  1 Antwort Letzte Antwort Antworten Zitieren 1
                  • aschildA aschild hat am auf dieses Thema verwiesen
                  • Erster Beitrag
                    Letzter Beitrag