Script de gestion d'horaires

Résolu/Fermé
a70m Messages postés 2763 Date d'inscription jeudi 21 mai 2009 Statut Contributeur Dernière intervention 2 février 2014 - 14 oct. 2013 à 17:39
a70m Messages postés 2763 Date d'inscription jeudi 21 mai 2009 Statut Contributeur Dernière intervention 2 février 2014 - 20 oct. 2013 à 00:53
Bonjour,

Je suis en train de retourner le problème dans tous les sens, mais je n'arrive pas à trouver quelque chose de convainquant.

Sur un site qui gère 3 commerces, je souhaite faire une page qui permet de modifier les horaires d'ouverture de chaque commerce.

Les horaires peuvent être de 4 formes différentes :
10:00 - 18:00 En continu
10:00 12:00 - 14:00 18:00
Nous consulter
Fermé

Pour le moment dans une table SQL, j'ai sauvegardé mes horaires de la façon suivante (mais ça n'est pas des plus pratique !)

id | id_commerce | jour | debut1 | fin1 | continu | fermé | nous_consulter | debut2 | fin2 |

Où :
id_commerce vaut 1, 2 ou 3 selon le commerce
jour vaut lundi, mardi, ..., dimanche, jours fériés
debut1 correspond à l'ouverture
fin1 correspond à la fermeture du midi si l'horaire est de la forme (10:00 12:00 - 14:00 18:00) du soir si horaire de la forme 10:00 18:00
continu vaut 1 si horaire de la forme 10:00 18:00, 0 dans les autres cas
fermé vaut 1 quand ... le commerce est fermé (facile ;))
nous_consulter vaut 1 ou 0 si le commerce est fermé mais peut être ouvert exceptionnellement (jours fériés notamment, mais pas systématiquement)
debut2 horaire d'ouverture l'après midi si horaire de la forme 10:00 12:00 - 14:00 18:00
fin2 horaire de fermeture l'après midi si horaire de la forme 10:00 12:00 - 14:00 18:00

Ce qui fait que j'ai 24 lignes dans ma table (1/jour/commerce (+jours fériés)) mais pour le formulaire d'édition c'est un calvaire.

J'ai fait quelques recherches sur le net, mais rien ne correspond à ça, la plupart ne se contentent que d'un debut et d'une fin, pas de coupure le midi :(

Je suis presque sûr que j'ai à refaire ma table donc inutile de repartir sur ce plan là, il m'a l'air bien compliqué.

J'espère être le plus clair possible, mais s'il manque des infos faites-le moi savoir :)
D'avance merci !

a70m
A voir également:

5 réponses

JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 14/10/2013 à 18:21
Salut,

id | id_commerce | jour | debut_am | fin_am | debut_pm| fin_pm | nous_consulter |
Si debut_am et debut_pm sont NULL, le commerce est fermé.
Si debut_am est NULL, et debut_pm ne l'est pas, le commerce ouvre l'aprés midi.
Si le contraire, le commerce ouvre la matinée seulement.
Si debut_am et fin_pm ne sont pas NULL, mais fin_am et debut_pm le sont, alors le commerce ouvre ses portes en continu.

Voila, il ne te reste qu'a jouer avec le IF dans tes requêtes SQL.
Pour la modification des horaires, je ne vois pas ou est le problème.

Mettez en résolu quand c'est résolu -.- ...
0
a70m Messages postés 2763 Date d'inscription jeudi 21 mai 2009 Statut Contributeur Dernière intervention 2 février 2014 217
14 oct. 2013 à 18:28
Salut,

Merci pour ta réponse rapide !

L'idée me semble pas mal, mais là où ça coince encore, c'est sur ma page admin, j'ai mes 4 select pour selectionner mes horaires pour chaque jour.

Lorsque je liste mes horaires pour les modifier j'ai un formulaire de la forme :

<form ...>
Lundi [debut_am][fin_am][debut_pm][fin_pm] (4 select)
Mardi [debut_am][fin_am][debut_pm][fin_pm] (4 select)
...
Enregistrer
</form>

Ce formulaire je l'ai 3 fois, un pour chaque commerce, mais une fois envoyé, je ne sais pas comment gérer tous mes select. En fonction des jours ? des id ? des id_commerce ?

Je bute sur un truc con je sais, mais je suis un peu pommé là

Merci encore.
a70m
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 14/10/2013 à 23:23
Tu dois avoir quelque chose dans ce genre ...
Affichage du formulaire :

<?php
$days = array(
1 => 'Samedi',
2 => 'Dimanche',
3 => 'Lundi',
4 => 'Mardi',
5 => 'Mercredi',
6 => 'Jeudi',
7 => 'Vendredi');

$parts = array('debut_am', 'fin_am', 'debut_pm', 'fin_pm');

foreach($days AS $id => $name) {
echo '<p>' . $name . '</p>';

foreach($parts AS $val) {
echo '<select name="day_' . $id . '_' . $val . '">';

if(substr($val, 0, 3) == 'fin') echo '<option value="closed"></option>';
else echo '<option value="closed">Fermé</option>';

for($h = 0; $h < 24; $h++)
for($m = 0; $m < 60; $m++) {
$val = str_pad($h, 2, '0', STR_PAD_LEFT) . ':' . str_pad($m, 2, '0', STR_PAD_LEFT);
echo '<option value="' . $val . '">' . $val . '</option>';
}
echo '</select>';
}
}

Et dans le script de traitement, si le formulaire en envoyé ...
PS : L'id du commerce doit également exister, soit sous forme de champs caché, soit dans une variable de session ou GET.

// Vérification que le formulaire est complet et correct
$correctForm = true;

foreach($days AS $id => $name) {
foreach($parts AS $val) {
$field = 'day_' . $id . '_' . $val;

if(!isset($_POST[$field]) OR empty($_POST[$field])) {
$correctForm = false;
break;
}
}

$debut = $_POST['day_' . $id . '_debut_am'];
$fin = $_POST['day_' . $id . '_debut_am'];

if(!compare($debut, $fin)) {
$correctForm = false;
break;
}

$debut = $_POST['day_' . $id . '_debut_pm'];
$fin = $_POST['day_' . $id . '_debut_pm'];

if(!compare($debut, $fin)) {
$correctForm = false;
break;
}
}

if($correctForm) {
$req = 'INSERT INTO table (id_commerce, jour, debut_am, fin_am, debut_pm, fin_pm) VALUES ';

foreach($days AS $id => $name) {
$req .= '(' . $id_commerce . ',' . $id . ',';

$debut_am = ($_POST['day_' . $id . '_debut_am'] != 'closed') ? $_POST['day_' . $id . '_debut_am'] : null;
$fin_am = ($debut_am == null) ? $debut_am : $_POST['day_' . $id . '_fin_am'];

$debut_pm = ($_POST['day_' . $id . '_debut_pm'] != 'closed') ? $_POST['day_' . $id . '_debut_pm'] : null;
$fin_pm = ($debut_pm == null) ? $debut_pm : $_POST['day_' . $id . '_fin_pm'];

$req .= ($debut_am == null) ? 'NULL,' : '\'' . $debut_am . '\',';
$req .= ($fin_am == null) ? 'NULL,' : '\'' . $fin_am . '\',';
$req .= ($debut_pm == null) ? 'NULL,' : '\'' . $debut_pm . '\',';
$req .= ($fin_pm == null) ? 'NULL,' : '\'' . $fin_pm . '\',';
}

$req = rtrim($req, ', ');

var_dump($req);
}

PS : Non testé, je l'ai écris directement sur CCM, donc aucune garantie que ça fonctionne de premier coup, mais bon, c'est supposé te donner une idée sur comment procéder pour traiter le formulaire.

Mettez en résolu quand c'est résolu -.- ...
0
a70m Messages postés 2763 Date d'inscription jeudi 21 mai 2009 Statut Contributeur Dernière intervention 2 février 2014 217
14 oct. 2013 à 22:29
Waou, merci de ta réponse et du temps que tu as passé là dessus. Je testerai ça le week end prochain, je ne peux pas cette semaine.

Je donnerai des nouvelles sur ce post.

Merci encore
a70m
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 14/10/2013 à 23:29
De rien.

PS : Edité.

<?php
$days = array(
1 => 'Samedi',
2 => 'Dimanche',
3 => 'Lundi',
4 => 'Mardi',
5 => 'Mercredi',
6 => 'Jeudi',
7 => 'Vendredi');

$parts = array('debut_am', 'fin_am', 'debut_pm', 'fin_pm');

foreach($days AS $id => $name) {
echo '<p>' . $name . '</p>';

foreach($parts AS $val) {
echo '<select name="day_' . $id . '_' . $val . '">';

if(substr($val, 0, 3) == 'fin') echo '<option value="closed"></option>';
else echo '<option value="closed">Fermé</option>';

for($h = 0; $h < 24; $h++)
for($m = 0; $m < 60; $m++) {
$val = str_pad($h, 2, '0', STR_PAD_LEFT) . ':' . str_pad($m, 2, '0', STR_PAD_LEFT);
echo '<option value="' . $val . '">' . $val . '</option>';
}
echo '</select>';
}
}

--------------------------------------------------------------------------------------------------------

// Vérification que le formulaire est complet et correct
$correctForm = true;

foreach($days AS $id => $name) {
foreach($parts AS $val) {
$field = 'day_' . $id . '_' . $val;

if(!isset($_POST[$field]) OR empty($_POST[$field])) {
$correctForm = false;
break;
}
}

$debut = $_POST['day_' . $id . '_debut_am'];
$fin = $_POST['day_' . $id . '_debut_am'];

if(!compare($debut, $fin)) {
$correctForm = false;
break;
}

$debut = $_POST['day_' . $id . '_debut_pm'];
$fin = $_POST['day_' . $id . '_debut_pm'];

if(!compare($debut, $fin)) {
$correctForm = false;
break;
}
}

if($correctForm) {
$req = 'INSERT INTO table (id_commerce, jour, debut_am, fin_am, debut_pm, fin_pm) VALUES ';

foreach($days AS $id => $name) {
$req .= '(' . $id_commerce . ',' . $id . ',';

$debut_am = ($_POST['day_' . $id . '_debut_am'] != 'closed') ? $_POST['day_' . $id . '_debut_am'] : null;
$fin_am = ($debut_am == null) ? $debut_am : $_POST['day_' . $id . '_fin_am'];

$debut_pm = ($_POST['day_' . $id . '_debut_pm'] != 'closed') ? $_POST['day_' . $id . '_debut_pm'] : null;
$fin_pm = ($debut_pm == null) ? $debut_pm : $_POST['day_' . $id . '_fin_pm'];

$req .= ($debut_am == null) ? 'NULL,' : '\'' . $debut_am . '\',';
$req .= ($fin_am == null) ? 'NULL,' : '\'' . $fin_am . '\',';
$req .= ($debut_pm == null) ? 'NULL,' : '\'' . $debut_pm . '\',';
$req .= ($fin_pm == null) ? 'NULL), ' : '\'' . $fin_pm . '\'), ';
}

$req = rtrim($req, ', ');

var_dump($req);
}

Mettez en résolu quand c'est résolu -.- ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
a70m Messages postés 2763 Date d'inscription jeudi 21 mai 2009 Statut Contributeur Dernière intervention 2 février 2014 217
19 oct. 2013 à 22:07
Salut,

Super ton script, je l'ai un peu modifié à ma sauce et quand j'affiche ma requête tout m'a l'air correct, mais dès que je veux l'exécuter, j'ai une erreur.
j'ai pas mal cherché mais je ne vois pas d'où ça pourrai venir.

Voici la requête que j'ai :
INSERT INTO horaires (id, id_salle, jour, debut_am, fin_am, debut_pm, fin_pm) VALUES ('', '2','Lundi','NULL','NULL','NULL','NULL'), ('', '2','Mardi','00:15','closed','NULL','NULL'), ('', '2','Mercredi','NULL','NULL','NULL','NULL'), ('', '2','Jeudi','NULL','NULL','NULL','NULL'), ('', '2','Vendredi','NULL','NULL','NULL','NULL'), ('', '2','Samedi','NULL','NULL','NULL','NULL'), ('', '2','Dimanche','NULL','NULL','NULL','NULL'), ('', '2','Jours Fériés','NULL','NULL','NULL','NULL')


Et l'erreur :
Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''INSERT INTO horaires (id, id_salle, jour, debut_am, fin_am, debut_pm, fin_pm) V' at line 1' in horaires.php(62): PDO->exec(''INSERT INTO ho...') #1 {main} thrown in horaires.php on line 62

Si tu penses savoir d'où ça peut provenir ...

Merci d'avance
a70m
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 19/10/2013 à 23:03
C'est quoi les quotes dans le exex ?!

Postes la partie d'exécution de la requête.

PS : si id est en auto increment, supprime le de la requête, ça valeur sera affecté automatiquement.

Concernant les valeurs NULL, je te conseille d'utiliser la deuxième version du script que j'ai posté, parce que dans la première, les NULL sont interprétés en tant que chaines de caractères !
0
a70m Messages postés 2763 Date d'inscription jeudi 21 mai 2009 Statut Contributeur Dernière intervention 2 février 2014 217
19 oct. 2013 à 23:11
Ah voilà, c'était effectivement ces quotes que j'avais pas vu dans le exec !
Merci beaucoup de ton aide, je vais encore modifier quelques trucs pour que ce soit comme il faut.

Merci beaucoup
a70m
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
19 oct. 2013 à 23:23
De rien !

Je n'ai pas précisé le rôle de la fonction compare.

Elle est supposé vérifier que la valeur des deux paramètres est correcte, et que le premier temps(premier paramètre) est inférieur au second(second paramètre), vu que l'heure de début est supposée être inférieur a l'heure de fin.
0
a70m Messages postés 2763 Date d'inscription jeudi 21 mai 2009 Statut Contributeur Dernière intervention 2 février 2014 217
19 oct. 2013 à 23:26
Ah oui en effet, je l'ai supprimée du coup puisque la fonction posait problème et qu'il peut y'avoir des horaires comme 20:00 - 02:00 donc avec le chevauchement de minuit, c'est délicat à gérer donc je l'ai viré.

Mais merci des précisions
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
19 oct. 2013 à 23:53
Ok.

Mais il faut vérifier quand même les valeurs, vu que l'utilisateur peut les changer dans le formulaire et peut y mettre n'importe quoi !
0