Dans ce chapitre, nous allons continuer à pratiquer PHP à partir d'un exemple concret : afficher les horaires d'ouverture d'un magasin et indiquer s'il est ouvert à une heure donnée. Ce sera l'occasion de découvrir les constantes, quelques fonctions utiles sur les tableaux, puis la manipulation des dates avec date().
Définir une configuration avec des constantes
Pour commencer, on veut stocker les créneaux d'ouverture du magasin. Comme ces horaires ne sont pas amenés à changer pendant l'exécution du script, on peut utiliser une constante plutôt qu'une variable classique.
On crée pour cela un fichier config.php qui contiendra les valeurs de configuration réutilisables dans plusieurs pages du site.
Une constante se définit avec la fonction define(). Elle prend :
- en premier paramètre, le nom de la constante ;
- en second paramètre, sa valeur ;
- en troisième paramètre optionnel, une indication sur la sensibilité à la casse du nom.
Par convention, le nom d'une constante s'écrit en majuscules. Contrairement aux variables, on n'utilise pas le symbole $ pour lire sa valeur :
Générer l'affichage des horaires
Sur la page contact.php, on veut afficher les horaires sous la forme :
Pour éviter de mélanger toute la logique avec le HTML, on crée une fonction dans functions.php.
La fonction construit d'abord un tableau de phrases, puis utilise implode() pour rassembler les éléments avec le mot et entre chaque créneau.
implode() permet de transformer un tableau en chaîne de caractères. Le premier paramètre correspond au séparateur à insérer entre les éléments, et le second au tableau à fusionner.
Pour utiliser tout cela dans contact.php, on inclut les fichiers nécessaires avec require_once.
Gérer les jours de la semaine
On peut ensuite rendre la configuration plus précise en définissant les horaires pour chaque jour de la semaine. On crée alors un tableau plus complexe : chaque entrée correspond à un jour, et contient ses créneaux.
Ici, les deux derniers jours n'ont pas de créneau : le magasin est fermé le samedi et le dimanche.
Pour afficher les noms des jours, on définit une autre constante.
On peut ensuite parcourir les jours et récupérer les créneaux correspondant à la même clé.
Il faut aussi adapter creneaux_html() pour gérer les jours fermés. Pour vérifier qu'un tableau est vide, on peut utiliser empty().
empty() permet de déterminer si une variable est vide. Dans notre cas, cela permet de détecter simplement un tableau sans créneau.
Récupérer le jour courant avec date()
Pour mettre en évidence le jour courant, on utilise la fonction date().
La fonction date() prend en premier paramètre un format. Ce format est une chaîne de caractères composée de lettres qui seront remplacées par des valeurs de date.
Par exemple :
peut afficher une date sous la forme du jour, du numéro du jour, du mois et de l'année.
Dans la vidéo, on remarque cependant que les dates sont affichées en anglais par défaut, suivant la locale installée. Pour cet exercice, on garde donc notre tableau JOURS pour afficher les jours en français.
Ce qui nous intéresse surtout ici, c'est de récupérer le numéro du jour dans la semaine :
Avec N, PHP renvoie un nombre où lundi vaut 1. Dans notre tableau, lundi est à l'index 0, il faudra donc soit ajouter 1 à la clé du tableau, soit retirer 1 à la valeur renvoyée par date('N').
Attention : date() renvoie une chaîne de caractères. Si on veut comparer avec un entier, on peut convertir la valeur avec (int).
Définir le bon fuseau horaire
En testant l'heure courante, on peut obtenir un décalage si PHP utilise le fuseau horaire UTC par défaut. Un timestamp représente le nombre de secondes écoulées depuis le 1er janvier 1970 à l'heure de Greenwich, et PHP calcule ensuite les dates selon le fuseau horaire configuré.
Pour définir le fuseau horaire à utiliser, on peut appeler date_default_timezone_set().
Il est important de le faire si l'horaire du magasin dépend d'un pays ou d'une ville précise. La date sera calculée côté serveur avec ce fuseau horaire, même si l'utilisateur consulte le site depuis une autre zone du monde.
Savoir si le magasin est ouvert
On veut maintenant créer une fonction capable de dire si une heure donnée se trouve dans une liste de créneaux.
La fonction reçoit toutes les informations dont elle a besoin en paramètres : l'heure et les créneaux à tester. C'est plus réutilisable que d'aller chercher directement la date courante ou la constante CRENEAUX depuis la fonction.
Par exemple, cela permettrait aussi de tester si le magasin sera ouvert dimanche à 9 heures, simplement en changeant les paramètres envoyés.
On peut ensuite récupérer l'heure actuelle, le jour actuel et les créneaux du jour.
Pour l'heure, le format G permet d'obtenir une heure entre 0 et 23 sans zéro initial.
Ensuite, dans le HTML, on affiche le bon message.
On utilise une comparaison stricte avec l'heure de fin : si le magasin ferme à 11 heures, alors à 11 heures pile, il est considéré comme fermé.
Utiliser une condition ternaire
Pour choisir rapidement une valeur suivant une condition simple, on peut utiliser l'opérateur ternaire.
Cela revient à écrire :
Le ternaire est pratique pour économiser quelques lignes, mais il faut rester raisonnable. Si la condition devient trop complexe, un if classique sera souvent plus lisible.
Créer un formulaire de vérification
Pour terminer, on peut ajouter un formulaire qui permet à l'utilisateur de choisir un jour et une heure, puis de savoir si le magasin sera ouvert.
Le formulaire utilise la méthode get, ce qui permet de partager l'URL avec les paramètres choisis.
En haut du fichier, on récupère les valeurs depuis $_GET si elles existent, sinon on utilise la date courante.
L'opérateur ?? permet d'utiliser une valeur par défaut quand une donnée n'existe pas.
Pour éviter de répéter le code du select, on peut créer une fonction dédiée.
On peut alors afficher le champ plus simplement :
Ce système reste volontairement simple : il ne prend pas en compte les jours fériés ou des règles particulières. Mais il permet de combiner plusieurs notions importantes : constantes, tableaux, fonctions, formulaires, dates et conditions.