PHP Code verbessern

Hallo liebe Experten

Ich habe von InnoXTC eine Code erhalten, der mir meine Internetseite zu bestimmten Tagen und Uhrzeiten Offline stellt.

Kann mir jemand den Code so modifizieren, dass ich die einzelnen Tage mit jeweiliger Uhrzeit eintragen kann?
Momentan kann ich entweder die ganzen Tage oder einfach eine Start-und Stopzeit eintragen.

Es sollte so sein dass ich wählen kann z.B. Tag 6,7 Uhrzeit z.B. 14.00 Start 23.30 Stop, Tag 1 Uhrzeit z.B. 18.00 Start 22.00 Stop usw…

Schlussendlich wären die Zeiten so:
Montag - Donnerstag
17.00 Uhr - 22.00 Uhr

Freitag
17.00 Uhr - 23.45 Uhr

Samstag
13.00 Uhr - 23.45 Uhr

Sonntag
13.00 Uhr - 22.00 Uhr

Hier der Code:

    // Hinweis: date('N') ab PHP 5.01 (?)

// Autor: InnuXTC 17.06.2015

// error_reporting(0);

// Wochentage (Montag = 1, Dienstag = 2, … Sonntag = 7)

$close = array();
//(1,2,4) z.B. möglich

// Geöffnet ab

$time_start = ‚09:00‘;

// Geschlossen ab

$time_stop = ‚22:00‘;

// Feiertage

$holiday = array();
// ‚18.06.2015‘,‚19.06.2015‘ in den Klammern z.B.

// Prüfen ob geöffnet ist [ WOCHENTAG | UHRZEIT | FEIERTAG ]
// Wenn ja …

if (date(‚N‘) != in_array(date(‚N‘), $close) && date(‚H:i‘) >= $time_start && date(‚H:i‘) <= $time_stop && date(‚d.m.Y‘) != in_array(date(‚d.m.Y‘), $holiday))
{

// Ausgabe OFFEN

// Wenn nein …

else

{

// Ausgabe GESCHLOSSEN mit Gimmick (Öffnungszeiten) als Beispiel

//echo „Geschlossen. Seite ist nur von " . $time_start . " bis " . $time_stop . " Uhr erreichbar.“;

// Oder Umleitung auf andere Website (z.B. geschlossen.html)
header(„Location: http://vvvvv.ch/offline.html“);
exit;

}

?>

Leider hatte ich nach der Anfrage an InnuXTC bis anhin keine Antwort erhalten.
Vielen lieben Dank und liebe Grüsse

Sascha

Das ist aber keine besonders elegante Lösung, die du da bekommen hast. Aber egal, dann frickeln wir das mal weiter…

Mach dir für die Uhrzeiten auch einfach je ein array

// Geöffnet ab Montag (=gleicher Index wie bei den Wochentagen)
$time_start[1] = '09:00';
//Dienstag
$time_start[2] = '08:00';
//Mittwoch
$time_start[3] = '09:00';
...    
//Geschlossen ab Montag
$time_stop[1] = '22:00';
...

Und dann verwendest du einfach den heutigen Wochentag als Index deines Array in der Abfrage. Und diese Abfrage ist viel zu kompliziert und zudem auch noch falsch. Ich würde das - der Übersichtlichkeit halber - einfach schachteln. Das macht die Logik viel klarer.

Achtung: in deinem Beispiel gab es keine Definition der Variable $holiday, also ignoriere ich das in der Abfragelogik. Das musst du dann mal selbst dazupacken.

//erhöhe die Lesbarkeit!
$today=date('N');

//Ob geschlossen oder nicht, entscheidet sich in mehreren Ästen der Abfrage, also refaktorisieren wir die eigentliche Aktion mittels eines defaults, damit fällt zudem der else-Zweig weg

$nowIsOpen=false;

if (!in_array($today, $close))
{
    //grundsätzlich könnte heute offen sein.
    //also prüfen wir auf die Uhrzeit, aber nicht als Text, sondern richtig.
    $actualTime=time();
    //die als Text gegebene Uhrzeit in eine Zahl wandeln
    $actualTimeStart=strtotime(date("Y-m-d")." ".$time_start[$today]);
    $actualTimeEnd=strtotime(date("Y-m-d")." ".$time_end[$today]);

    //Es bleibt die triviale Prüfung
    if($actualTime > $actualTimeStart && $actualTime < $actualTimeEnd)
        $nowIsOpen=true;
}

if($nowIsOpen)
{
    //offen
}else
{
    //geschlossen
}

Hallo Roberti_Onlein

Vielen lieben Dank für Deine Antwort.
Ich habs probiert am Donnertsag um 16.30 Uhr. Leider hat es die Seite nicht Offline geschaltet. Woran kann das liegen?

Hier mein Code:

<?php

/* -----------------------------------------------------------------------------------------
$Id: index.php 4173 2013-01-04 12:08:26Z web28 $

XT-Commerce - community made shopping
http://www.xt-commerce.com
  
Copyright (c) 2003 XT-Commerce

based on:
(c) 2000-2001 The Exchange Project  (earlier name of osCommerce)
(c) 2002-2003 osCommerce(default.php,v 1.84 2003/05/07); www.oscommerce.com
(c) 2003         nextcommerce (default.php,v 1.13 2003/08/17); www.nextcommerce.org

Released under the GNU General Public License 
-----------------------------------------------------------------------------------------
Third Party contributions:
Enable_Disable_Categories 1.3                Autor: Mikel Williams | [email protected]
Customers Status v3.x  (c) 2002-2003 Copyright Elari [email protected] | www.unlockgsm.com/dload-osc/ | CVS :   http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/elari/?sortby=date#dirlist

Released under the GNU General Public License
---------------------------------------------------------------------------------------*/


// Hinweis: date('N') ab PHP 5.01 (?)
// Autor: InnuXTC 17.06.2015

// error_reporting(0);

// Geöffnet ab Montag (=gleicher Index wie bei den Wochentagen)
$time_start[1] = '10:00';
//Dienstag
$time_start[2] = '10:00';
//Mittwoch
$time_start[3] = '10:00';
//Donnerstag
$time_start[4] = '17:00';
//Freitag
$time_start[5] = '10:00';
//Samstag
$time_start[6] = '13:00';
//Sonntag
$time_start[7] = '13:00';


//Geschlossen ab Montag - Sonntag
$time_stop[1] = '22:00';
$time_stop[2] = '22:00';
$time_stop[3] = '22:00';
$time_stop[4] = '22:00';
$time_stop[5] = '23:45';
$time_stop[6] = '23:45';
$time_stop[7] = '22:00';

// Feiertage

$holiday = array();
// '18.06.2015','19.06.2015' in den Klammern z.B.


$nowIsOpen=true;

if (!in_array($today, $close))
{
    //grundsätzlich könnte heute offen sein.
    //also prüfen wir auf die Uhrzeit, aber nicht als Text, sondern richtig.
$actualTime=time();
//die als Text gegebene Uhrzeit in eine Zahl wandeln
$actualTimeStart=strtotime(date("Y-m-d")." ".$time_start[$today]);
$actualTimeEnd=strtotime(date("Y-m-d")." ".$time_end[$today]);

//Es bleibt die triviale Prüfung
if($actualTime > $actualTimeStart && $actualTime < $actualTimeEnd)
    $nowIsOpen=true;
}

 if($nowIsOpen)
 {
 include ('includes/application_top.php');

 // create smarty elements

$smarty = new Smarty;

 // include boxes
 require (DIR_FS_CATALOG.'templates/'.CURRENT_TEMPLATE.'/source/boxes.php');
 include (DIR_WS_MODULES.'default.php');
 require (DIR_WS_INCLUDES.'header.php'); //web28 - 2013-01-04 - load header.php after default.php because of error                handling status code
   $smarty->assign('language', $_SESSION['language']);

   $smarty->caching = 0;

if (!defined('RM'))
    $smarty->load_filter('output', 'note');
$smarty->display(CURRENT_TEMPLATE.'/index.html');

 include ('includes/application_bottom.php');

 }
 // Wenn nein ...

 else
{

 // Ausgabe GESCHLOSSEN mit Gimmick (Öffnungszeiten) als Beispiel

//echo "Geschlossen. Seite ist nur von " . $time_start . " bis " . $time_stop . " Uhr erreichbar.";

// Oder Umleitung auf andere Website (z.B. geschlossen.html)
 header("Location: http://vvvvt.ch/offline.html");
 exit;

}

?>

Liebe Grüsse
Sascha

Du hast meine Zuweisung von $today entfernt. Hast du meinen Quelltext auch gelesen und verstanden oder nur so reinkopiert?

Grüße

Hallo Roberti_Onlein,

Vielen Dank nochmals für Deine Antwort.

Ja entschuldige, ich hatte $today=date(‚N‘); im geposteten Code aus versuchsgründen mal gelöscht. Hatte aber vorher mit $today=date(‚N‘); auch keinen Erfolg.

Klar habe ich alles durchgelesen, und gemeint ich hätte es begriffen.

Nun läuft es.
Ich habe den Fehler gefunden.
Die Arrays hast Du mit $time_stop[1] usw… angegeben, aber bei der Prüfung stand:
$actualTimeEnd=strtotime(date(„Y-m-d“)." ".$time_end[$today]);
Also $time_end anstelle von $time_stop

Nun funktioniert es tadellos.

Vielen Dank nochmals und liebe Grüsse
Sascha

Huch. Das passiert, wenn man Code auf Papier schreibt und nicht probiert. Sowas fällt dir leichter auf, wenn du während der Entwicklung das error-reporting auf E_ALL setzt.

error_reporting(E_ALL);

http://php.net/manual/de/function.error-reporting.php

Das bedeutet, dass ALLE Fehler und Warnungen ausgegeben werden. Wenn du Sachen neu entwickelst, solltest du das immer auf volle Pulle stellen und dafür sorgen, dass deine Anwendung keine Meldungen generiert. Nur so kannst du sicher sein, dass deine Anwendung auch in den nächsten 2 PHP-Versionen noch funktioniert.

Und damit hättest du gleich eine Meldung bekommen, dass die Variable $time_end undefiniert ist und in welcher Zeile der Fehler aufgetreten ist.

Das hätte dir mutmaßlig viel Zeit gespart.