Es wurden einige Klassen erstellt, damit iCalendar-Dateien geparsed und erstellt werden können. Diese iCalendar-Dateien können per Google-Calendar, iCal oder auch Outlook erstellt und abonniert, damit man andere Personen über z.B. Veranstaltungen informieren kann.
Klassen wurden erstellt und die Grundfunktionen sind schon enthalten. Zum testen habe ich mir den Inhalt Deutsche Feiertage als iCalendar-Datei geholt um Tests durchzuführen.
Ausschnitt aus der iCalendar-Datei:
Für die restliche Frage gehe ich der einfachheit halber von folgender Struktur aus, die ein Event aus dem Kalender darstellt. Hier ist jeweils Anfangs- (from), und Endzeit (until) angegeben, sowie eine Wiederholung (Interval).
Nun habe ich gesehen, dass in der Datei nicht für jedes Jahr ein neues Eintrag für in diesem Fall dem 1. Weihnachtsfeiertag eingetragen wurde, sondern ein Interval, wie oft sich dieser wiederholt.
Ich eine Funktion isActive erstellt um einen Status zu erhalten ob dieser Event gerade stattfindet. Hierzu muss ich jedoch (in diesem Fall noch sehr geringe Menge) die Elemente aus dem DatePeriod mit foreach durchlaufen.
1. Frage:
Wie begrenzt man die Durchläufe der DatePeriod sinnvoll? Reicht es eurer Meinung nach per LimitIterator einen Ausschnitt der DatePeriod zu holen oder gibt es hier bei umfangreicheren DatePeriod effizientere Möglichkeiten? (Beispiel: DatePeriod von 1900 bis 2100, ich möchte aber nur Einträge von 2010 bis 2020).
2. Frage:
Gibt es bei einer DatePeriod eine einfachere Möglichkeit zu erkennen ob sich ein Datum in einem Eintrag der DatePeriod befindet?
Der Beispielcode:
Klassen wurden erstellt und die Grundfunktionen sind schon enthalten. Zum testen habe ich mir den Inhalt Deutsche Feiertage als iCalendar-Datei geholt um Tests durchzuführen.
Ausschnitt aus der iCalendar-Datei:
Code:
BEGIN:VCALENDAR VERSION:2.0 BEGIN:VEVENT UID:DE-IF-1225 DTSTART;VALUE=DATE:20101225 DTEND;VALUE=DATE:20101226 RRULE:FREQ=YEARLY;INTERVAL=1 SUMMARY:1. Weihnachtsfeiertag DTSTAMP:20100101T000000Z END:VEVENT END:VCALENDAR
PHP-Code:
$event = array(
'summary' => '1. Weihnachtsfeiertag',
'from' => new DateTime('2010-12-25'),
'until' => new DateTime('2010-12-26'),
'interval' => new DateInterval('P1Y')
);
Ich eine Funktion isActive erstellt um einen Status zu erhalten ob dieser Event gerade stattfindet. Hierzu muss ich jedoch (in diesem Fall noch sehr geringe Menge) die Elemente aus dem DatePeriod mit foreach durchlaufen.
1. Frage:
Wie begrenzt man die Durchläufe der DatePeriod sinnvoll? Reicht es eurer Meinung nach per LimitIterator einen Ausschnitt der DatePeriod zu holen oder gibt es hier bei umfangreicheren DatePeriod effizientere Möglichkeiten? (Beispiel: DatePeriod von 1900 bis 2100, ich möchte aber nur Einträge von 2010 bis 2020).
2. Frage:
Gibt es bei einer DatePeriod eine einfachere Möglichkeit zu erkennen ob sich ein Datum in einem Eintrag der DatePeriod befindet?
Der Beispielcode:
PHP-Code:
$event = array(
'summary' => '1. Weihnachtsfeiertag',
'from' => new DateTime('2010-12-25'),
'until' => new DateTime('2010-12-26'),
'interval' => new DateInterval('P1Y')
);
function between($needle, $from, $until) {
if($needle < $from) {
return false;
}
if($needle > $until) {
return false;
}
return true;
}
function getIterator($event) {
$fromPeriod = new DatePeriod($event['from'], $event['interval'], 10);
$untilPeriod = new DatePeriod($event['until'], $event['interval'], 10);
$iterator = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$iterator->attachIterator(new IteratorIterator($fromPeriod), 'from');
$iterator->attachIterator(new IteratorIterator($untilPeriod), 'until');
return $iterator;
}
function isActive($event, $currentDateTime) {
foreach(getIterator($event) as $item) {
if(between($currentDateTime, $item['from'], $item['until'])) {
return true;
}
}
return false;
}
var_dump(isActive($event, new DateTime()));
var_dump(isActive($event, new DateTime('2014-12-25 13:37')));
PHP-Code:
bool(false)
bool(true)
Kommentar