[Funktion(en), Modul: Cal] Algorithmus für wiederkehrende Termine

PHP Codeschnispel und Beispiel Codes.
k00ni
Beiträge: 1474
Registriert: 22. Juni 2006, 16:44
Kontaktdaten:

[Funktion(en), Modul: Cal] Algorithmus für wiederkehrende Termine

Beitrag von k00ni » 12. September 2007, 16:23

Hallo,

ich grübel gerade an einem Algorithmus für wiederkehrende Termine. Wir "hacken" gerade das Cal-Modul und stellen es etwas um, deshalb. Ich hab nun nur noch keinen richtigen Ansatz für oben genanntes.

Man kann einen Termin erstellen und diesen als "regelmäßig" eintragen. Zusätzlich noch sagen, ob er bspw. "jeden" (jeden zweiten, jeden zweiten und dritten, usw.) Donnerstag stattfindet.

Beispielsweise:

Code: Alles auswählen

- jeden Donnerstag
- jeden zweiten und dritten Samstag
Nun muss ich einen Algo finden, womit ich diese Termine in den Übersichten einbinden kann. Anbei, ich übergebe an die Funktion eine Begrenzung, in welchem Zeitraum diese liegen müssen. (Timestamps, von wann bis wann)

Mein Ansatz sieht so aus, dass ich mir die Eintragung bei "regelmäßig" (also bspw. "jeden zweiten" "samstag", getrennt voneinander gespeichert) anschaue und dann beim Wochentag die Nummer (1-7) ermittle. Dann aus den Angaben hochrechnen auf die direkten Timestamps und dann prüfen, ob sie in den aktuellen Zeitraum reinfallen. Soweit die Theorie :) Vielleicht habt ihr die eine oder andere Idee.


Grüße
- Editiert von k00ni am 14.09.2007, 18:50 -

Benutzeravatar
Powie
Administrator
Beiträge: 7458
Registriert: 4. März 2003, 09:32
Wohnort: Ilmtal
Kontaktdaten:

[Modul: Cal] Algorithmus für wiederkehrende Termine

Beitrag von Powie » 12. September 2007, 16:36

Für jedes Vorkommen des "wiederkehrenden" Termins einen eigenen Datensatz generieren!
Dies hat später den Vorteil das man auch einzelne Instanzen dieses Termins löschen kann ohne den gesamten zu entfernen!
*Never say Never* - [ Dropbox | Webspace ]

k00ni
Beiträge: 1474
Registriert: 22. Juni 2006, 16:44
Kontaktdaten:

[Modul: Cal] Algorithmus für wiederkehrende Termine

Beitrag von k00ni » 13. September 2007, 00:43

[quote]Für jedes Vorkommen des "wiederkehrenden" Termins einen eigenen Datensatz generieren![/quote]

:ugly: Meinst du das ernst? Stelle mir das gerade etwas umständlich vor, wenn man da was an dem Termin ändern möchte. Da müsst ich ja dann alle x tausend Termine anpassen. Gut, dass könnte man umgehen, indem man eine zweite ID einführt und diese dann bei allen Terminen (die zusammengehören) gleich ist.

[quote]Dies hat später den Vorteil das man auch einzelne Instanzen dieses Termins löschen kann ohne den gesamten zu entfernen![/quote]

Nur wie stellst du dir dass dann mit der Administrierung vor? Bei uns geht ein Toptermin immer über 6 Monate. Das sind hochgerechnet 24 Wochen (4 Wochen = 1 Monat). Das sind ggf. 48 Einträge für einen Termin! Ok, der Vorteil wäre, dass man das Auslesen stark vereinfacht. Aber wie willst du dann alle Termine zusammenbekommen und anpassen, wenn Änderungen stattfinden. Man denke an die Art der Wiederkehrung, statt jeden Donnerstag nun jeden ersten und vierten Montag. Dies könnte man dann durch eine Sperrung der "Regelmäßigkeit" entgegensteuern, also dass man das nachhaltig nicht einstellen kann. *grübel*

Eigentlich gefällt mir der Vorschlag gut... aber mal schauen, was du zu oben geschriebenen meinst, Powie :) :-D


Nächtliche Grüße

mahe
Administrator
Beiträge: 5287
Registriert: 16. August 2002, 18:54
Wohnort: Wien
Kontaktdaten:

[Modul: Cal] Algorithmus für wiederkehrende Termine

Beitrag von mahe » 13. September 2007, 06:53

Du setzt ein Flag "Serientermin".
Anhand davon kannst du dann unterscheiden obs ein einmaliger Termin ist oder nicht.
Die anderen Termine findest du anhand der eingegebenen Daten (müssen ja gleich sein)
Bild
Ja, diese Signatur dient zur Werbung!
Und dass ich meine Posts wiederfinde ...

Benutzeravatar
Powie
Administrator
Beiträge: 7458
Registriert: 4. März 2003, 09:32
Wohnort: Ilmtal
Kontaktdaten:

[Modul: Cal] Algorithmus für wiederkehrende Termine

Beitrag von Powie » 13. September 2007, 08:13

du hast die Lösung doch schon selbst angesprochen. Sobald es sich um einen Serientermin handelt generierst du eine eindeutige ID beim Eintragen in die DB, und diese ID ist dann bei allen der gleichen Serie die selbe. Ist es kein Serientermin steht keine ID drin. :-O
*Never say Never* - [ Dropbox | Webspace ]

k00ni
Beiträge: 1474
Registriert: 22. Juni 2006, 16:44
Kontaktdaten:

[Modul: Cal] Algorithmus für wiederkehrende Termine

Beitrag von k00ni » 14. September 2007, 11:40

Morgähnn... ,

hier mal ein paar erste Rümpfe, was ich die Tage so geschafft habe. Nicht viel, aber irgendwie hängen meine Gedanken grad bei 1000 Stellen gleichzeitig.
Wie dem auch sei. Der User kann beim Termin anlegen ja die Regelmäßigkeit bestimmen. Dies geht folgendermaßen im HTML-Code.

Code: Alles auswählen

	jeden
	jeden ersten
	jeden ersten und zweiten
	jeden ersten und dritten
	jeden ersten und vierten
	jeden zweiten
	jeden zweiten und dritten
	jeden zweiten und vierten
	jeden dritten
	jeden dritten und vierten
	jeden vierten

	      

		  
 '. $S_day .''; $I_counter++;
	} ?>
$A_days ist das Array aus der pcal_main.php, welches die Wochentage enthält. Hier wird jedem Wochentag gleich die richtige Nummer zugeordnet. (0-6)

Um dann beim Anlegen des Termins und wenn es ein regelmäßiger ist, alle weiteren anzulegen, hab ich folgendes:
Die Funktion check_which_week soll mir prüfen, in welcher Woche der übergebene Zeitstempel ist. Wie genau diese dann aussieht, muss ich mir noch überlegen. Wenn es gut läuft, hab ichs heute Abend.

[edit]Was ich mir auch noch überlegen muss, wie ich $_POST ['S_periodic'] abfragen kann. Denn es kann 0 enthalten, aber auch 14, was bedeutet, dass der Termin am ersten und vierten Montag (Beispiel) ist. Man könnte die Zahlfolge als Array sehen und dann Abfrage: $_POST ['S_periodic'] [0] und $_POST ['S_periodic'] [1].[/edit]


Grüße

Benutzeravatar
Powie
Administrator
Beiträge: 7458
Registriert: 4. März 2003, 09:32
Wohnort: Ilmtal
Kontaktdaten:

[Modul: Cal] Algorithmus für wiederkehrende Termine

Beitrag von Powie » 14. September 2007, 11:44

ich kann dir nachfühlen. Kalender sind eine Welt für sich, und der pCal hat mich selbst schon unzählige male in den Wahnsinn getrieben.

Was genau programmierst du nun? Einen eigenen Kalender oder eine Änderung am pSys Kalender? Wenn ich mir ansehe was du da machst, es kommt mir ein wenig "übertrieben" vor.
*Never say Never* - [ Dropbox | Webspace ]

k00ni
Beiträge: 1474
Registriert: 22. Juni 2006, 16:44
Kontaktdaten:

[Modul: Cal] Algorithmus für wiederkehrende Termine

Beitrag von k00ni » 14. September 2007, 11:51

[quote]Was genau programmierst du nun? Einen eigenen Kalender oder eine Änderung am pSys Kalender? Wenn ich mir ansehe was du da machst, es kommt mir ein wenig "übertrieben" vor.[/quote]

Wir bohren dein Kalender-Modul auf. Wir hatten u.a. vor, wiederkehrende Termine zu implementieren, neue Felder hinzufügen für Feste, Konzerte etc., neue Arten (Tagestermin, Termin des Monats) von Terminen einbauen sowie eine Implementierung, dass sich User für einen Termin einschreiben können und dies über ihr Userprofil angezeigt wird.

Zu sagen ist auch, dass bei uns der Kalender für Feste und Partys genutzt wird.

k00ni
Beiträge: 1474
Registriert: 22. Juni 2006, 16:44
Kontaktdaten:

[Funktion(en), Modul: Cal] Algorithmus für wiederkehrende Termine

Beitrag von k00ni » 15. September 2007, 01:05

Ich habs! Muhahaha. :-O

Folgende Funktion ermittelt mir nun anhand eines Timestamps, in welcher Woche (1-5) eines Monats sich der Termin befindet.

Code: Alles auswählen

 5) $I_real_week = 5;
	return $I_real_week;
}
?>
Es geht bestimmt noch kleinerer, sauberer, kürzerer, besserer... :ugly: Aber hauptsache, dass Ding läuft erstmal. Nun muss ich nur noch die Abfragen anpassen und dann können die ersten Tests starten. Das Problem ist, dass unten im Beispiel die 1 und 2 bei der Abfrage variieren können. Es könnt auch 2, 5 sein. Damit bekommt man gesagt, in welchen Wochen des Monats der Termin an Tag X stattfindet.

Code: Alles auswählen

if (get_week ($I_start_time) == 1 AND get_week ($I_start_time)  == 2)

Grüße

Antworten