Zeitsperre und zeitabhängiger Content mit PHP
Je nachdem was für einen Inhalt man bereitstellt, kann es sein, dass dieser einer bestimmten Altersbeschränkung unterliegt. Stellt man jugendgefährdende Inhalte bereit, muss man dafür sorgen, dass diese erst nach Altersverifikation zugänglich sind. Zusätzlich gibt es die Möglichkeit, entsprechende Inhalte erst ab einer bestimmten Uhrzeit zugänglich zu machen. In diesem Artikel schauen wir uns an, wie man je nach Uhrzeit unterschiedlichen Content ausliefern kann.
Vorüberlegung
Zunächst überlegen wir uns, was notwendig ist, um Inhalte zeitabhängig auszuliefern. Wir möchten im besten Fall eine Funktion mit 3 Parameter, wobei die ersten beiden Parameter die Inhalte darstellen, die ausgeliefert werden wenn der Besucher in der angegeben Zeit auf die Website kommt bzw. wenn er außerhalb der Zeitspanne die Website besucht. Als dritter Parameter soll letztendlich ein Array mit der Startzeit und Endzeit übergeben werden.
Die Idee um zu prüfen, ob ein Besucher zwischen 2 vorgegebenen Uhrzeiten die Website besucht ist folgende:
Sollte die Zeit in der er auf die Website kommt, größer der Startzeit und kleiner der Endzeit sein, dann liegt er im angegeben Intervall. Bei dieser Betrachtung gibt es jedoch ein Problem und zwar läuft die Uhrzeit jeden Tag von 0 bis 23.59 Uhr und wird dann wieder 0Uhr. Liegen also Start- und Endzeit auf dem selben Tag reicht es zu prüfen, ob der Zeitpunkt des Besuchs größer als die Startzeit und kleiner als die Endzeit ist. Sollte jedoch eine Zeitspanne von z.B. 23 bis 5 Uhr angegeben sein, funktioniert diese einfache Methode nicht mehr.
Um diese Problem zu lösen, speichern wir in einem Array alle volle Uhrzeiten (also z.B. 12.00Uhr) von dem Startzeitpunkt bis 0 Uhr, da der Endzeitpunkt erst irgendwann im nächsten Tag liegt, liegen diese Zeitpunkte definitiv im angegebenen Intervall. Bei der Endzeit gehen wir analog vor, es werden alle vollen Uhrzeiten von 0 bis zur Endzeit in einem weiteren Array gespeichert. Durch das Zusammenfügen der beiden Arrays erhalten wir das gewünschte Intervall.
Wenn beide Uhrzeiten im selben Tag liegen funktioniert das Ganze auch, nur dass die beiden Arrays nicht zusammengefügt werden, sondern die Schnittmenge gebildet wird.
Funktion für zeitabhängigen Inhalt
Nach der Theorie können wir nun zur Praxis überschreiten.
function timeContent($content_A, $content_B, $time) {
...
}
$content_A ist ein String, der den Inhalt enthält der ausgeliefert wird, wenn der Besucher in der angegebenen Zeitspanne ist.
$content_B ist ein String, der den Inhalt enthält der ausgeliefert wird, wenn der Besucher nicht in der angegebenen Zeitspanne ist.
$time ist ein Array mit dem Start und Endzeitpunkt.
Vorweg gleich mal die fertige Funktion:
function timeContent($content_A, $content_B, $time) {
if(!isset($time['Start']) || !isset($time['End'])) {
return false;
}
$start = explode(':', $time['Start']);
$end = explode(':', $time['End']);
if(count($start) != 2 || count($end) != 2) {
return false;
}
$cast_array_values_to_in = function($value) { return (int)$value; };
$start = array_map($cast_array_values_to_in, $start);
$end = array_map($cast_array_values_to_in, $end);
if($start[0] > 24 || $start[0] < 0) {
return false;
}
if($start[1] > 59 || $start[1] < 0) {
return false;
}
if($end[0] > 24 || $end[0] < 0) {
return false;
}
if($end[1] > 59 || $end[1] < 0) {
return false;
}
//In der Vorüberlegung angesprochene Arrays
$i = 0;
$s['h'] = array($start[0]+1);
while($i < 24) {
if($s['h'][$i] >= 24)
break;
array_push($s['h'], $s['h'][$i]+1);
$i++;
}
$i = 0;
$e['h'] = array($end[0]-1);
while($i < 24) {
if($e['h'][$i] <= 0)
break;
array_push($e['h'], $e['h'][$i]-1);
$i++;
}
// Ende liegt im nächsten Tag
if($start[0] > $end[0]) {
$range = array_merge($s['h'], $e['h']);
} else {
// Ende liegt im aktuellen Tag
$range = array_intersect($s['h'], $e['h']);
}
$in_range = false;
if(in_array((int)date('H'), $range)) {
$in_range = true;
}
if(date('H') == $start[0] && date('i') >= $start[1]) {
$in_range = true;
}
if(date('H') == $end[0] && date('i') <= $end[1]) {
$in_range = true;
}
if($in_range) {
return $content_A;
} else {
return $content_B;
}
}
Zunächst wird nur geprüft, ob die Eingabe richtig ist und Sinn ergibt. Sollte dies nicht der Fall sein wird false zurückgegeben, ansonsten läuft die Funktion weiter. Mit der Funktion array_map() wird sichergestellt, dass die beiden Arrays nur noch ganzzahlige Werte enthalten und nicht sinnlos sind wie z.B. 17.5:30 Uhr.
Achtung! array_map() mit einer Lambda-Funktion funktioniert so erst seit PHP Version 5.3.
Dann werden die in der Vorüberlegung angesprochenen Arrays erzeugt, die das angegebene Intervall zwischen Start- und Endzeit enthalten. Anschließend wird geprüft, ob die Uhrzeiten auf dem selben Tag liegen, oder nicht, je nachdem werden die Arrays dann zusammengefügt oder die Schnittmenge gebildet. Zum Schluss wird noch die aktuelle Uhrzeit abgeglichen und dann entweder $content_A oder $content_B zurückgeliefert, je nachdem ob der Besucher momentan in der Zeitspanne ist oder nicht.
Angewendet wird die Funktion folgendermaßen:
timeContent('Die liegst in der Sperrzeit!',
'Du bist außerhalb der Zeit!',
array('Start' => '11:00', 'End' => '17:15'))