Closed iceman-fx closed 1 month ago
Ich hätte gerne einen Beispielcode Deiner Abfrage
Hier der Code:
$now = time();
$start = date('Y-m-d H:i:s', $now);
$end = date('Y-m-d H:i:s', strtotime(date('Y-m-d', strtotime('first day of +1 month', $now))) - 1);
$items = \forCal\Handler\forCalHandler::getEntries($start, $end, false, 'SORT_ASC', $category, $location); //3.Param = offline-Termine ausgeben (true|false)
dump($items);
Die Ausgaben sehen dann so aus: start > 2022-09-23 07:27:14 end > 2022-09-30 23:59:59
array:3 [ 0 => array:4 [ "id" => "2" "sort_key" => "20220914131500" "date" => {#221} "entry" => {#222} ] 1 => array:4 [ "id" => "1" "sort_key" => "20220922000000" "date" => {#228} "entry" => {#229} ] 2 => array:4 [ "id" => "4" "sort_key" => "20220922000000" "date" => {#235} "entry" => {#236} ] ]
Im Kalender sind dazu aber 5 Termine angelegt, welche in diesen Zeitraum passen würden:
Es fehlen demnach die Termine, welche nur an einem Tag stattfinden (23.09.20022).
Was passiert wenn du $start = date('Y-m-d H:i:s', $now); mal auf 0 Uhr stellst?
Dann klappt es. Allerdings werden dann Termine angezeigt, welche am Tag bereits gelaufen sind. Das kann u.U. schon mal sehr viel sein, wenn es Termine einer ganzen Stadt sind.
Das Problem ist halt in Eurer Prüfung, welche immer die Zeit mit einbezieht, aber in der DB halt nur das Datum gespeichert wird (ohne Zeit). Damit greift dann die Abfrage/Prüfung nicht mehr korrekt für ganztägige Termine, welche ab 00:00:00 Uhr beginnen.
Ich sehe das nun nicht wirklich als Bug an aber verstehe das Problem. Danke für den Hinweis. @joachimdoerr und ich werden uns beraten. Gerne kannst du aber auch einen PR einreichen.
Als Anmerkung noch... Das Problem wird jeder haben, wenn er sich an die Doku/Hilfe hält, da dort der Startwert immer mit H:i:s angegeben ist.
Die Doku ist schon alt .. ich komme aber nicht dazu sie zu bearbeiten. Hilfe ist jederzeit gern gesehen.
In der aktuelle forCal scheint die Erstellung des Querys zur Abfrage der Termine falsch zu sein. Wenn ein repeat-Termin mit Beginn am gleichen Tag wie der Beginn des Auslesens der Termine erstellt wird, dann wird dieser nicht ausgegeben, obwohl dieser innerhalb des gewünschten Start-End-Zeitfensters liegt.
Bsp: Terminbereich: Start: 22.09.2022 Ende: 30.04.2023
repeat-Termin: 22.09.2022 - 22.09.2022 Wiederholung: monatlich jeden 1. Monat Enddatum: 22.04.2023
Termin wird erst im Oktober angezeigt, jedoch nicht bei den Septemberterminen, was er aber müsste.
UPDATE 1: betrifft übrigens auch nicht wiederkehrende Termin, wenn Sie das Datum von heute (22.09.2022) haben.
UPDATE 2: setzt man das Datum des Termins auf den 23.09.2022 - 23.09.2022, dann wird er heute mit angezeigt. Irgendwo ist da der Wurm drin.
UPDATE 3: Ich vermute, dass die MySQL-Abfrage nicht greifen kann, weil z.B. auf
...BETWEEN '2022-09-22 13:57:55' AND '2022-09-30 23:59:59')...
geprüft wird, aber in der DB nur das Datumsformat hinterlegt ist '2022-09-2022'. Ändert man es nämlich auf...BETWEEN '2022-09-22' AND '2022-09-30')...
werden alle Einträge korrekt ausgegeben.UPDATE 4: In der Funktion decorateEntryRepeats in der Datei https://github.com/FriendsOfREDAXO/forcal/blob/main/lib/forcal/Handler/forcalHandler.php wird das Vergleichsdatum falsch gesetzt, wodurch bei sich wiederholenden Terminen z.B. das Termin-Startdatum älter ist als das aktuelle Startdatum der Eingrenzung ($startSearchDate).
Bsp: Termin-Startdatum ist: 2022-09-22 00:00:00.0 Wird aber in forCalDateTimeHelper::isDateRangeBetweenDateRange verglichen mit: 2022-09-22 14:37:04.0 -> Ergebnis = false
Entweder müsste in der DB auch die Zeit beim Datum mit gespeichert werden oder die Prüfung müsste sich auf den korrekten Tagesbeginn ab 0:00 Uhr beziehen, da sonst ein sich wiederholender Termin am gleichen Tag nicht angezeigt wird.