 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
16.12.2005, 20:30
|
#1
|
|
TP-Insider
Registriert seit: Feb 2002
Ort: Burgkichen (Austria)
|
Wiederkehrende Termine
Haut mich nicht, wenns sowas schon im Forum gibt, ich hab echt lange genug gesucht und nix gefunden.
So, meine Frage:
Ich programmier grad eine Terminverwaltung und möchte auch die Möglichkeit geben, dass ein Termin mehrmals eingetragen wird, wenn er sich wiederholt.
z.b. Täglich/wöchentlich/monatlich/vierteljährlich bis zu einem bestimmten Datum.
Dann soll es 2 auswahlmöglichkeiten geben:
-1- gleiches datum (1.jan, 1.feb, 1.märz)
-2- gleicher wochentag (1.jan, 5.feb, 5.märz - bei 2006)
modus 1 bei monatlich und vierteljährlich ist kein Problem: monat plus 1 bzw 3
Aber bei den anderen Sachen bin ich ziemlich blank.
könnte mir jemand hilfestellung geben?
danke!
__________________
Gruß
Tobias
Sag einem Klugen einen Fehler, er wird erfreut und dankbar sein.
Ein Dummer sieht dich nur als Quäler und schnappt sofort beleidigt ein.
[Karl Heinz Söhler]
|
|
|
16.12.2005, 21:43
|
#2
|
|
TP-Insider
Registriert seit: Feb 2002
Ort: Burgkichen (Austria)
|
ich trage die termine in die DB ein, das macht es vielleicht einfacher
__________________
Gruß
Tobias
Sag einem Klugen einen Fehler, er wird erfreut und dankbar sein.
Ein Dummer sieht dich nur als Quäler und schnappt sofort beleidigt ein.
[Karl Heinz Söhler]
|
|
|
16.12.2005, 22:30
|
#3
|
|
Guest
Registriert seit: Aug 2002
|
Vielleicht solltest du das anders machen: Jeder Datensatz bekommt einen Vermerk, ob es sich um einen wiederkehrenden Termin handelt, und wenn ja, dann berücksichtigt das Script diese Art von Terminen in jeder Anzeige ohne, dass es explizit in diesem Jahr oder diesem Monat eingetragen sein muss.
|
|
|
16.12.2005, 23:40
|
#4
|
|
TP-Insider
Registriert seit: Feb 2002
Ort: Burgkichen (Austria)
|
daran hab ich auch schon gedacht, aber dann lassen sich solche termine schlecht löschen.
oder man will zu einzelnen terminen nochml was hinzufügen....
__________________
Gruß
Tobias
Sag einem Klugen einen Fehler, er wird erfreut und dankbar sein.
Ein Dummer sieht dich nur als Quäler und schnappt sofort beleidigt ein.
[Karl Heinz Söhler]
|
|
|
17.12.2005, 02:44
|
#5
|
|
TP-Urgestein
Registriert seit: Nov 2003
Ort: NRW
|
Auf Grund er evtl. hohen Anzahl von Datensätzen würde ich ehr die Methode von Strogij aufgreifen.
Eine Tabelle in die die Serientermine eingetragen werden.
id | starttermin | endtermin | intervallart | kommentar
Dann eine Tabelle, die für Ausnahmen, Zusatzinfos usw da ist.
id | termin_id | gelöscht | datum | zusatzinfo
Dann arbeitest du einfach mit nem JOIN, das Feld "gelöscht" bekommt einfach eine 1, wenn der Termin zu dem datum nicht angezeigt werden soll (ergo: gelöscht).
Eine Info kann man dann für ein spez. Datum eines Serienelem. auch anzeigen lassen.
Via Cron-Job kannst dann täglich prüfen lassen, welche Terminserien angelaufen sind (endtermin) darauf dann erst alle verknüpften Datensätze der zweiten Tab löschen, dann die Serie in der ersten.
So hat man eine viel schlankere DB, was bei einer Vielzahl von Usern bestimmt hilfreich ist.
|
|
|
17.12.2005, 10:37
|
#6
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
Ich würde es mit 2-3 Zusatzfeldern lösen, ein Feld für wiederkehrend und 1 Feld für die Formel.
Für letzteres musst Du Dir einen eigenen Syntax einfallen lassen, mit dem Du den Termin berechnen kannst, z.B.
I=T;A=25 //Intervall Tag, Anzahl Wiederholungen 25
I=J;A=-1; //Intervall Jahr, Wiederholungen unendlich
I=J,A=-1;B=W //Intervall Jahr, Wiederholungen unendlich, Bedingung gleicher Wochentag
ev. nimmst Du ein Feld, in dem der erste Wiederholungstermin drinsteht und das aktualisiert wird, wenn der Termin<=NOW ist.
Bei den Bedingungen ist es klar, das SQL nicht ausreicht um die Reihe auszugeben, hier muss dann schon PHP eingesetzt werden.
Damit es Dir leichter fällt, das Formelfeld umzuwandeln, kannst Du auch ein serialisiertes Array benutzen, das ist in einer Zeile geschrieben / ausgelesen.
Geändert von steffenk (17.12.2005 um 10:42 Uhr).
|
|
|
17.12.2005, 12:06
|
#7
|
|
TP-Insider
Registriert seit: Feb 2002
Ort: Burgkichen (Austria)
|
ok überzeugt.
aber wie lasse ich das dann ausrechnen wann die wiederholung vom 17.12. im Juli 2006 ist?
z.b. wenns am gleichen wochetag sein soll?
__________________
Gruß
Tobias
Sag einem Klugen einen Fehler, er wird erfreut und dankbar sein.
Ein Dummer sieht dich nur als Quäler und schnappt sofort beleidigt ein.
[Karl Heinz Söhler]
|
|
|
17.12.2005, 12:11
|
#8
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
Du musst Dir in jedem Fall Funktionen anlegen, die Datumsberechnungen durchführen.
Vielleicht gibt Dir ja die Typo3-Extension sk_calendar eine Idee, hier die Berechnungsfunktionen:
PHP-Code:
function addRecurringEvents($event_arr) {
$temp_arr = array();
$recurr_until_fallback = date('Y-m-d');
$recurr_until_fallback = explode('-', $recurr_until_fallback);
$recurr_until_fallback = mktime(0,0,0,$recurr_until_fallback [1]+12,$recurr_until_fallback [2],$recurr_until_fallback [0]);
$count = 1;
// get exeptions
$sql = "SELECT * FROM tx_skcalendar_exeptions";
$result = mysql_query($sql);
while ($data = mysql_fetch_array($result))
{
$exept_arr[$data['event']][] = trim($data['exeptdate']);
}
// arrayforming
if($event_arr) {
foreach($event_arr as $row) {
// Exeption Shootout
$exeptions = ARRAY();
if ($exept_arr[$row['uid']]) $exeptions = $exept_arr[$row['uid']];
$sortfield = $row['date'] . '_' . $count; // so multiple events per Day are possible
if (!$row['recurr_until']) $row['recurr_until'] = $recurr_until_fallback;
switch ($row['recurring']) {
case 1: // daily
$uid = $row['uid'];
while ($row['date'] <= $row['recurr_until'])
{
if (!in_array($row['date'],$exeptions)) // ignore exepted dates
{
$row['uid'] = $uid . '_re'.$row['date']; // distinction between different Ghostcopies
$sortfield = $row['date'] . '_' . $count; // so multiple events per Day are possible
$temp_arr[$sortfield] = $row;
}
$date = date('Y-m-d', $row['date']);
$date = explode('-',$date);
$row['date'] = mktime(0,0,0,$date[1],$date[2]+1,$date[0]);
}
break;
case 2: // weekly
$uid = $row['uid'];
while ($row['date'] <= $row['recurr_until'])
{
if (!in_array($row['date'],$exeptions)) // ignore exepted dates
{
$row['uid'] = $uid . '_re'.$row['date']; // distinction between different Ghostcopies
$sortfield = $row['date'] . '_' . $count; // so multiple events per Day are possible
$temp_arr[$sortfield] = $row;
}
$row['date'] = $row['date'] + 604800; // one week
if (date('H',$row['date']) ==23) $row['date'] = $row['date'] + 3600; // stupid DST
elseif (date('H',$row['date']) ==1) $row['date'] = $row['date'] - 3600; // stupid DST
}
break;
case 3: // monthly
$uid = $row['uid'];
while ($row['date'] <= $row['recurr_until'])
{
if (!in_array($row['date'],$exeptions)) // ignore exepted dates
{
$row['uid'] = $uid . '_re'.$row['date']; // distinction between different Ghostcopies
$sortfield = $row['date'] . '_' . $count; // so multiple events per Day are possible
$temp_arr[$sortfield] = $row;
}
// bit tricky for months have differnt amounts of days
$date = date('Y-m-d', $row['date']);
$date = explode('-',$date);
$row['date'] = mktime(0,0,0,$date[1]+1,$date[2],$date[0]);
}
break;
case 4: // yearly
$uid = $row['uid'];
while ($row['date'] <= $row['recurr_until'])
{
if (!in_array($row['date'],$exeptions)) // ignore exepted dates
{
$row['uid'] = $uid . '_re'.$row['date']; // distinction between different Ghostcopies
$sortfield = $row['date'] . '_' . $count; // so multiple events per Day are possible
$temp_arr[$sortfield] = $row;
}
// bit tricky for months have differnt amounts of days
$date = date('Y-m-d', $row['date']);
$date = explode('-',$date);
$row['date'] = mktime(0,0,0,$date[1],$date[2],$date[0]+1);
}
case 5: // monthly on a certain weekday
$uid = $row['uid'];
while ($row['date'] <= $row['recurr_until'])
{
if (!in_array($row['date'],$exeptions)) // ignore exepted dates
{
$row['uid'] = $uid . '_re'.$row['date']; // distinction between different Ghostcopies
$sortfield = $row['date'] . '_' . $count; // so multiple events per Day are possible
$temp_arr[$sortfield] = $row;
}
// find next date
$date = date('Y-m-w', $row['date']); // all we need to know: weekday, month and Year
$date = explode('-',$date);
if ($date[2] == 0) $date[2] = 7; // week starts monday
$weekday_fnm = date('w',mktime(0,0,0,$date[1]+1,1,$date[0])); // fnm = first next month
if ($weekday_fnm == 0) $weekday_fnm =7;
if ($date[2] < $weekday_fnm) $add = 5*604800; // need an aditional week to jump the month
else $add = 4*604800;
$row['date'] = $row['date'] + $add; // ta da ...
if (date('H',$row['date']) ==23) $row['date'] = $row['date'] + 3600; // stupid DST
elseif (date('H',$row['date']) ==1) $row['date'] = $row['date'] - 3600; // stupid DST
}
break;
default:
$temp_arr[$sortfield] = $row; // just write into temp array
break;
}
$count++;
}
ksort($temp_arr); // Sort events.
}
return $temp_arr;
}
|
|
|
17.12.2005, 12:32
|
#9
|
|
TP-Insider
Registriert seit: Feb 2002
Ort: Burgkichen (Austria)
|
oft ist die Lösung doch so einfach:
echo date("d.m.Y", mktime(0, 0, 0, 1, 1, 2005));
für wöchentlich: mktime(0, 0, 0, 1, 1+7, 2005);
für 2-wöchentlich: mktime(0, 0, 0, 1, 1+14, 2005);
für monatlich: mktime(0, 0, 0, 1+1, 1, 2005);
für monatlich (gleicher tag): mktime(672, 0, 0, 1, 1, 2005); da muss man dann noch kurz checken, ob doch im selben monat ist. wenn ja nochmal 168 dazu
usw.
dann noch funktionen schreiben...fertig
ERLEDIGT - DANKE
__________________
Gruß
Tobias
Sag einem Klugen einen Fehler, er wird erfreut und dankbar sein.
Ein Dummer sieht dich nur als Quäler und schnappt sofort beleidigt ein.
[Karl Heinz Söhler]
|
|
|
17.12.2005, 12:38
|
#10
|
|
TP-Urgestein
Registriert seit: Nov 2003
Ort: NRW
|
Da musst du schon etwas mit date und mktime arbeiten.
Hier mal ein kurzes Bsp. für die Ausgabe aller Samstage für ein Jahr
PHP-Code:
<? echo "Heute ist ein ".$heute_tag = date("l", time()); for($i=1; $i<=365; $i++){ $datum = mktime(0, 0, 0, date("m") , date("d")+$i, date("Y")); if(date("l", $datum) == $heute_tag) echo "<br>".date("j.m.Y",$datum)." ist auch ein ".date("l", $datum); } ?>
Edit:
Ok, Ok, ich war halt zu langsam 
|
|
|
17.12.2005, 23:09
|
#11
|
|
TP-Insider
Registriert seit: Feb 2002
Ort: | | |