17 luglio 2015

PHP: output dinamico in base all'ora e alla data

Un'altra incursione nelle funzioni PHP legate al tempo con l'obiettivo di condizionare l'esecuzione di un codice in base all'ora, al giorno della settimana ed alle festività annuali.

Avevamo già affrontato in questo post la gestione di un evento in base al giorno della settimana, attraverso l'istruzione switch e la funzione date() di PHP.

In questo caso però le cose si complicano: occorre definire un array che contiene le due variabili (giorno della settimana date("w") ora e minuti date("H.i")) che devono essere utilizzate entrambe dall'istruzione switch per effettuare il confronto.

Per esempio se vogliamo attivare un evento in un certo arco di tempo di un determinato giorno della settimana, possiamo impostare delle condizioni simili a queste:
 case ($oggi == 1 && $ora >= 08.30 && $ora <= 13.00):
il codice subordinato a questo case verrà eseguito solo il lunedì dalle ore 8:30 alle ore 13:00.

Per gestire le festività annuali, abbiamo inserito in un array le date fisse. Per calcolare la Pasqua ci siamo avvalsi della funzione easter_date() che restituisce un timestamp Unix della data della Pasqua dal 1970 fino al 2037.
$pasqua  = date("d-m", easter_date());
Per calcolare la data della Pasquetta abbiamo aggiunto un giorno alla Pasqua con la funzione date_add().
$pasqua2 = date_create(date('d-m-Y', easter_date()));
date_add($pasqua2, date_interval_create_from_date_string('1 day'));
$pasquetta = date_format($pasqua2, 'd-m');
Non resta che confrontare la data attuale con le date inserite nell'array con un ciclo foreach e condizionare, con un if/else, l'esecuzione di tutto il codice in base al risultato del confronto.

Per la demo abbiamo ipotizzato la gestione automatica di un avviso grafico e testuale della disponibilità del servizio di un'assistenza telefonica.

demo orario negozio
DEMO

Questo è il codice completo:
<?php
date_default_timezone_set('Europe/Rome');
$on      = true; // cambiare con false nei giorni di chiusura per ferie
$data    = date("d-m");
$pasqua  = date("d-m", easter_date());
$pasqua2 = date_create(date('d-m-Y', easter_date()));
date_add($pasqua2, date_interval_create_from_date_string('1 day'));
$pasquetta = date_format($pasqua2, 'd-m');
$festivi   = array( // giorni festivi gg-mm
    '01-01',
    '06-01',
    $pasqua,
    $pasquetta,
    '25-04',
    '01-05',
    '02-06',
    '15-08',
    '01-11',
    '08-12',
    '25-12',
    '26-12'
); 
foreach ($festivi as $value) {
    if ($data == $value)
        $on = false;
}
if ($on == true) {
    $oggi   = date("w");
    $ora    = date("H.i"); //orario hh.mm
    $orario = array($oggi, $ora);
    switch ($orario) {
        case ($oggi == 0): // domenica chiusura settimanale
            $outputTxt = "non è attiva";
            $outputImg = "phone-off.png";
            break;
        case ($oggi == 1 && $ora >= 08.30 && $ora <= 13.00): // lunedì orario mattina
        case ($oggi == 1 && $ora >= 15.00 && $ora <= 19.30): // lunedì orario pomeriggio
            $outputTxt = "è attiva";
            $outputImg = "phone-on.png";
            break;
        case ($oggi == 2 && $ora >= 08.30 && $ora <= 13.00): // martedì orario mattina
        case ($oggi == 2 && $ora >= 15.00 && $ora <= 19.30): // martedì orario pomeriggio
            $outputTxt = "è attiva";
            $outputImg = "phone-on.png";
            break;
        case ($oggi == 3 && $ora >= 08.30 && $ora <= 13.00): // mercoledì orario mattina
        case ($oggi == 3 && $ora >= 15.00 && $ora <= 19.30): // mercoledì orario pomeriggio
            $outputTxt = "è attiva";
            $outputImg = "phone-on.png";
            break;
        case ($oggi == 4 && $ora >= 08.30 && $ora <= 13.00): // giovedì orario mattina
        case ($oggi == 4 && $ora >= 15.00 && $ora <= 19.30): // giovedì orario pomeriggio
            $outputTxt = "è attiva";
            $outputImg = "phone-on.png";
            break;
        case ($oggi == 5 && $ora >= 08.30 && $ora <= 13.00): // venerdì orario mattina
        case ($oggi == 5 && $ora >= 15.00 && $ora <= 19.30): // venerdì orario pomeriggio
            $outputTxt = "è attiva";
            $outputImg = "phone-on.png";
            break;
        case ($oggi == 6): // sabato chiusura settimanale
            $outputTxt = "non è attiva";
            $outputImg = "phone-off.png";
            break;
        default:
            $outputTxt = "non è attiva";
            $outputImg = "phone-off.png";
            break;
    }
} else {
    $outputTxt = "non è attiva";
    $outputImg = "phone-off.png";
}
?>

Questo il codice per l'output:
<div>L'assistenza telefonica <?php echo $outputTxt; ?></div>
<img src="img/<?php echo $outputImg; ?>" alt="telefono" />

Rimandiamo le possibili ulteriori applicazioni alla vostra fantasia.

Per approfondire l'argomento:

2 commenti:

  1. Ciao e grazie per il tuo intervento
    Come posso modificare la font ed il colore del testo che appare?
    Grazie

    RispondiElimina
    Risposte
    1. Ciao, prego.
      Puoi assegnare al div che contiene l'output un id o una classe che formatterai con i CSS

      Elimina