Navigation

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

    Vom Calendar Objekt zum zugehörigen Event kommen?

    ChurchTools Schnittstellen
    api calendar events php
    4
    7
    137
    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.
    • ErwinCramer
      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ürzele 1 Reply Last reply Reply Quote 2
      • Ralf Bürzele
        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!

        T ErwinCramer 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ürzele 1 Reply Last reply Reply Quote 0
          • Ralf Bürzele
            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.

            1 Reply Last reply Reply Quote 0
            • ErwinCramer
              ErwinCramer @Ralf Bürzele last edited by

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

              DumbergerL 1 Reply Last reply Reply Quote 0
              • DumbergerL
                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);
                
                DumbergerL 1 Reply Last reply Reply Quote 0
                • DumbergerL
                  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
                  • First post
                    Last post