TP Underground Lounge 07/08
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 16.12.2005, 20:30   #1
TP-Insider
 
Benutzerbild von TobiasKa
 
Registriert seit: Feb 2002
Ort: Burgkichen (Austria)
TobiasKa ist auf einem guten Weg
Question

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]
TobiasKa ist offline   Mit Zitat antworten


Alt 16.12.2005, 21:43   #2
TP-Insider
 
Benutzerbild von TobiasKa
 
Registriert seit: Feb 2002
Ort: Burgkichen (Austria)
TobiasKa ist auf einem guten Weg
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]
TobiasKa ist offline   Mit Zitat antworten
Alt 16.12.2005, 22:30   #3
Guest
 
Registriert seit: Aug 2002
Strogij hilft, wo's gehtStrogij hilft, wo's geht
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.
Strogij ist offline   Mit Zitat antworten
Alt 16.12.2005, 23:40   #4
TP-Insider
 
Benutzerbild von TobiasKa
 
Registriert seit: Feb 2002
Ort: Burgkichen (Austria)
TobiasKa ist auf einem guten Weg
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]
TobiasKa ist offline   Mit Zitat antworten
Alt 17.12.2005, 02:44   #5
TP-Urgestein
 
Benutzerbild von webcreate
 
Registriert seit: Nov 2003
Ort: NRW
webcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichts
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.
__________________
Gruß Mark
Mein Blog zum TP || XING Profil || grafiker.de Profil || How to use GOOGLE
emCalculator 1.0

webcreate IT SOLUTIONS
www.webcreate-nrw.de
webcreate ist offline   Mit Zitat antworten
Alt 17.12.2005, 10:37   #6
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer

Geändert von steffenk (17.12.2005 um 10:42 Uhr).
steffenk ist offline   Mit Zitat antworten
Alt 17.12.2005, 12:06   #7
TP-Insider
 
Benutzerbild von TobiasKa
 
Registriert seit: Feb 2002
Ort: Burgkichen (Austria)
TobiasKa ist auf einem guten Weg
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]
TobiasKa ist offline   Mit Zitat antworten
Alt 17.12.2005, 12:11   #8
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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;
    

__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 17.12.2005, 12:32   #9
TP-Insider
 
Benutzerbild von TobiasKa
 
Registriert seit: Feb 2002
Ort: Burgkichen (Austria)
TobiasKa ist auf einem guten Weg
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]
TobiasKa ist offline   Mit Zitat antworten
Alt 17.12.2005, 12:38   #10
TP-Urgestein
 
Benutzerbild von webcreate
 
Registriert seit: Nov 2003
Ort: NRW
webcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichts
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(000date("m")  , date("d")+$idate("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
__________________
Gruß Mark
Mein Blog zum TP || XING Profil || grafiker.de Profil || How to use GOOGLE
emCalculator 1.0

webcreate IT SOLUTIONS
www.webcreate-nrw.de
webcreate ist offline   Mit Zitat antworten
Alt 17.12.2005, 23:09   #11
TP-Insider
 
Benutzerbild von TobiasKa
 
Registriert seit: Feb 2002
Ort: