• Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    Vom Calendar Objekt zum zugehörigen Event kommen?

    ChurchTools Schnittstellen
    php events calendar api
    4
    7
    391
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • ErwinCramerE
      ErwinCramer
      last edited by

      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 Reply Last reply Reply Quote 2
      • Ralf BürzeleR
        Ralf Bürzele @ErwinCramer
        last edited by

        @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 Replies Last reply Reply Quote 0
        • T
          thommyb ChurchToolsMitarbeiter @Ralf Bürzele
          last edited by

          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 Reply Last reply Reply Quote 0
          • Ralf BürzeleR
            Ralf Bürzele @thommyb
            last edited by

            @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 Reply Last reply Reply Quote 0
            • ErwinCramerE
              ErwinCramer @Ralf Bürzele
              last edited by

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

              DumbergerLD 1 Reply Last reply Reply Quote 0
              • DumbergerLD
                DumbergerL @ErwinCramer
                last edited by 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 Reply Last reply Reply Quote 0
                • DumbergerLD
                  DumbergerL @DumbergerL
                  last edited by 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 Reply Last reply Reply Quote 1
                  • aschildA aschild hat am auf dieses Thema verwiesen
                  • First post
                    Last post