IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

checkbox planning par heure


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 29
    Points : 16
    Points
    16
    Par défaut checkbox planning par heure
    Bonjour,

    J'ai un souci avec un bout de code pour récupérer les heures de présence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <form method="POST">
        <input type="checkbox" name="mon_champ[]" value="0730" checked="checked"/>07h30<br>
        <input type="checkbox" name="mon_champ[]" value="0800" checked="checked"/>08h00<br>
        <input type="checkbox" name="mon_champ[]" value="0830"/>08h30<br>
        <input type="checkbox" name="mon_champ[]" value="0900"/>09h00<br>
        <input type="checkbox" name="mon_champ[]" value="0930" checked="checked"/>09h30<br>
        <input type="checkbox" name="mon_champ[]" value="1000" checked="checked"/>10h00<br>
        <input type="checkbox" name="mon_champ[]" value="1030"/>10h30<br>
        <input type="submit" value="OK">
    </form>
    et je tente de le recupérer comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <?php
    $cocher = "0000";
    $tmp="0000";
    if (isset($_POST['mon_champ'])) {
        echo "Vous avez choisi :";
        for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
            if ($_POST['mon_champ'][$i] > $tmp)
    		{
    		$tmp = $_POST['mon_champ'][$i];
    		}
    		else
    		{
    		$cocher = $cocher . $_POST['mon_champ'][$i];
    		$tmp = $_POST['mon_champ'][$i];
    		}
        }
    }
    echo $cocher;
    ?>
    Mais ca ne fonctionne pas.

    Le but est d'avoir :
    $cocher = 0730080009301000

    en gros, il est présent de 7h30 à 8h et revient de 9h30 à 10h

    Merci

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    ça boucle à l'infini non ?

    la condition de ton for() n'est pas bonne car tu y fais une assignation donc toujours vrai !


    Néanmoins, voici un code plus juste si j'ai bien tout compris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    $busy = "";
    if (isset($_POST['mon_champ']) && count($_POST['mon_champ'] > 0)) {
        foreach($_POST['mon_champ'] AS $v) {
            $busy .= $v;
        }
        echo "Vous avez choisi : ".$busy; 
        // Affiche : Vous avez choisi : 0730080009301000 
    }
    ?>

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Salut,

    voila comment je ferai ca :
    Dans ton formaulaire ce n'est pas checked="checked" mais simplement checked
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <form method="POST" action=''>
        <input type="checkbox" name="mon_champ[]" value="0730" checked>07h30<br>
        <input type="checkbox" name="mon_champ[]" value="0800" checked>08h00<br>
        <input type="checkbox" name="mon_champ[]" value="0830">08h30<br>
        <input type="checkbox" name="mon_champ[]" value="0900">09h00<br>
        <input type="checkbox" name="mon_champ[]" value="0930" checked>09h30<br>
        <input type="checkbox" name="mon_champ[]" value="1000" checked>10h00<br>
        <input type="checkbox" name="mon_champ[]" value="1030"/>10h30<br>
        <input type="submit" value="OK">
    </form>
    Pour le traitement du formulaire (utilise la fonction print_r pour débogger c'est bien pratique):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    echo "<pre>";
    print_r($_POST);
    echo "</pre>";
     
    if (isset($_POST['mon_champ'])) {
        echo "Vous avez choisi :";
        for ($i = 0 ; $i <  count($_POST['mon_champ']); $i++) {
     
    		$cocher .=  $_POST['mon_champ'][$i];
     
     
        }
    }
    echo $cocher;
    ?>
    bon courage.

  4. #4
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Citation Envoyé par jerome600 Voir le message
    Salut,

    voila comment je ferai ca :
    Dans ton formaulaire ce n'est pas checked="checked" mais simplement checked
    FAUX ! ARCHI FAUX ! il est beaucoup plus propre d'écrire checked="checked" tout comme :
    selected="selected", readonly="readonly", disabled="disabled", etc...

    PS : @Jerome : Dans ta correction de code :
    1] Tu ne vérifie pas qu'au moins une case a été cochée (count($_POST['mon_champ']) > 0)
    2] Tu ne déclares pas la variable que tu echo(), or tu écris .=
    3] Tu devrais echo() uniquement si le if() est vrai.. donc pas en dehors de ce dernier


    Bref... mon code plus haut marche très bien

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Super
    Ca marche nickel "darkstar123456"

    Merci

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    oulalala , autant pour moi merci de me remettre dans le droit chemin.

    ok pour l'initialisation de la variable , c'est un oubli de ma part.
    Par contre étant donné que les données postées sont uniquement les données cochées :

    Array
    (
    [mon_champ] => Array
    (
    [0] => 0730
    [1] => 0800
    [2] => 0930
    [3] => 1000
    )

    )

    si $_POST["mon_champ"] existe c'est qu'il n'est pas vide.

    et de plus , il n'y a pas de boucle infinie dans le code initial , les variables sont assignées avant le premier ";" , la condition d'arret est bien $i<$c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {

    PS : mon code marche tres bien aussi

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    heu non en faite, si c'est deja beaucoup mieux, mais y a juste un petit truc que j'ai oublié

    si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <form method="POST">
        <input type="checkbox" name="mon_champ[]" value="0730" checked="checked"/>07h30<br>
        <input type="checkbox" name="mon_champ[]" value="0800" checked="checked"/>08h00<br>
        <input type="checkbox" name="mon_champ[]" value="0830" checked="checked"/>08h30<br>
        <input type="checkbox" name="mon_champ[]" value="0900"/>09h00<br>
        <input type="checkbox" name="mon_champ[]" value="0930" checked="checked"/>09h30<br>
        <input type="checkbox" name="mon_champ[]" value="1000" checked="checked"/>10h00<br>
        <input type="checkbox" name="mon_champ[]" value="1030" checked="checked"/>10h30<br>
        <input type="submit" value="OK">
    </form>
    il me faut
    $cocher = 0730083009301030
    en fait, il me faut le 1er et le dernier de chaque petit groupe
    il est la de 7h30 a 8h30 donc le 0800 est coché mais n'apparait pas dans le resultat
    Idem pour 9h30 a 10h30, les cases 9h30,10h et 10h30 sont coché mais seul 0930"1030 apparait^^

    je complique un peu sorry

  8. #8
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    @Jerome : Mea Culpa

    Sinon pour ton problème, je pense que tu as choisis une mauvaise solution... à ta place j'utiliserais 2 liste déroulantes : 1) heure d'arrivée 2) heure de départ

    Perso, j'avais du faire un agenda et c'est comme ça que j'avais fait... déjà rien que les checkboxes c'est hyper ambigu :s ça me fait penser à "ok 8h30 je coche mais à 8h31 j'suis pu là !" c'est vraiment du vrai/faux les checkboxes donc je trouve ça moyen pour des tranches horaires

  9. #9
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    je sais bien, mais on me laisse pas trop le choix
    Au pire, je bidouillerai avec "substr" sur le resultat

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    voila comment je ferai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    if (isset($_POST['mon_champ'])) {
        echo "Vous avez choisi :";
    	$cocher=$_POST['mon_champ'][0];
        $dans_un_bloc=true;
    	for ($i = 1 ; $i <  count($_POST['mon_champ']); $i++) {
     
     
    		if ($_POST['mon_champ'][$i-1] + 30 == $_POST['mon_champ'][$i] ||  $_POST['mon_champ'][$i-1] + 70 == $_POST['mon_champ'][$i]) //trouve la fin du bloc
    		{
    			if ($dans_un_bloc==false) //on trouve le debut d'un bloc
    			$cocher.=$_POST['mon_champ'][$i-1];
     
    			$dans_un_bloc=true;
    		}
    		else
    		{
    			$dans_un_bloc=false;
    			$cocher.=$_POST['mon_champ'][$i-1];
    		}
     
     
        }
    }
    echo $cocher.$_POST['mon_champ'][$i-1];
    @darkstar123456 : J'ai peut-etre pas testé tous les cas particuliers , mais je suis sur que je peux compter sur toi !! A bientot

  11. #11
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    il me semble que le problème de ton code est qu'il est fait pour "30 minutes de battement maximum", du coup, si un utilisateur coches 7h00 => 9h00 ça va bugger ?
    ou alors j'ai regardé trop vite...

    PS : j'fais un code de mon côté aussi ^^

    EDIT : voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?php
    $hours = array(
    				'0730' => '07h30',
    				'0800' => '08h00',
    				'0830' => '08h30',
    				'0900' => '09h00',
    				'0930' => '09h30',
    				'1000' => '10h00',
    				'1030' => '10h30',
    			);
    $hours_keys = array_keys($hours);
     
     
    function next_exists($i) {
    	return (isset($_POST['mon_champ'][$i+1]));
    }
     
    if (isset($_POST['mon_champ'])) {
    	$busy = array();
    	$str = "";
    	for($i=min($_POST['mon_champ']); $i <= max($_POST['mon_champ']); $i++) {		
    		if (isset($_POST['mon_champ'][$i])) {
    			$busy[] = $_POST['mon_champ'][$i];
    			while(!next_exists($i) && $i < max($_POST['mon_champ'])) {
    				++$i;
    				$busy[] = $i;
    			} 
    			if (next_exists($i)) {
    				++$i;
    				$busy[] = $i;
    			}
    		}
    	}
    	foreach($busy AS $v) {
    		$str .= $hours_keys[$v];
    	}
    	echo "<p>Vous avez choisi : ".$str."</p>";
    }
    ?>
     
    <form method="POST">
    	<?php
    	for($i=0; $i < count($hours_keys); $i++) {
    		echo '<div><label><input type="checkbox" name="mon_champ['.$i.']" value="'.$i.'"';
    		if (isset($_POST['mon_champ'][$i])) {
    			echo ' checked="checked"';
    		}
    		echo '/>'.$hours[$hours_keys[$i]].'</label></div>';
    	}
    	?>
        <div><input type="submit" value="OK"></div>
    </form>
    Exemple de retour si je coche :
    07h30
    08h30
    09h30
    10h00
    Vous avez choisi : 07300800083009301000
    Exemple de retour si je coche :
    08h30
    10h00
    Vous avez choisi : 080008300900093010001030

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    il me semble que le problème de ton code est qu'il est fait pour "30 minutes de battement maximum"
    $i+30 ou $i+70 est la condition pour savoir si deux valeurs sont consécutives.
    il aurait été plus simple de sotcker 0750 pour 7H30. La condition aurait été $i+50

  13. #13
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Citation Envoyé par jerome600 Voir le message
    $i+30 ou $i+70 est la condition pour savoir si deux valeurs sont consécutives.
    il aurait été plus simple de sotcker 0750 pour 7H30. La condition aurait été $i+50
    ouais sauf qu'a vue de nez, ça marche pas au delà d'1h donc si tu coches 7h00 & 10h00 ça marche pas :s
    pi j'ai testé ton code, y'a rien qui marche chez moi en fait j'ai p-e pas le bon formulaire j'sais pas

    Bon sinon l'auteur de ce post pourrait dire si la solution lui convient ? :p

  14. #14
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par jerome600 Voir le message
    voila comment je ferai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    if (isset($_POST['mon_champ'])) {
        echo "Vous avez choisi :";
    	$cocher=$_POST['mon_champ'][0];
        $dans_un_bloc=true;
    	for ($i = 1 ; $i <  count($_POST['mon_champ']); $i++) {
     
     
    		if ($_POST['mon_champ'][$i-1] + 30 == $_POST['mon_champ'][$i] ||  $_POST['mon_champ'][$i-1] + 70 == $_POST['mon_champ'][$i]) //trouve la fin du bloc
    		{
    			if ($dans_un_bloc==false) //on trouve le debut d'un bloc
    			$cocher.=$_POST['mon_champ'][$i-1];
     
    			$dans_un_bloc=true;
    		}
    		else
    		{
    			$dans_un_bloc=false;
    			$cocher.=$_POST['mon_champ'][$i-1];
    		}
     
     
        }
    }
    echo $cocher.$_POST['mon_champ'][$i-1];
    @darkstar123456 : J'ai peut-etre pas testé tous les cas particuliers , mais je suis sur que je peux compter sur toi !! A bientot
    C'est exactement ca.
    Bon, j'ai eu le droit de changé les valeurs en 50 au lieu de 30, donc, j'ai un peu adapté le code et ca marche...enfin presque.
    Le reslutat pour 07h30-12h00 puis 13h00-15h30 => 7.5012001300155E+014 au lieu d'avoir 0750120013001550.
    Y a un truc bizarre la...

  15. #15
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    J'oublié, j'ai changé la dernier ligne de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $cocher.$_POST['mon_champ'][$i-1];
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $cocher.$_POST['mon_champ'][$i-1]+50;
    car il me manque une demi heure a la fin

    Avec le +50 ca marche pas
    Sans, il me manque une demi heure

  16. #16
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Citation Envoyé par Bruce Campbell Voir le message
    J'oublié, j'ai changé la dernier ligne de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $cocher.$_POST['mon_champ'][$i-1];
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $cocher.$_POST['mon_champ'][$i-1]+50;
    car il me manque une demi heure a la fin

    Avec le +50 ca marche pas
    Sans, il me manque une demi heure
    Si tu veux, mon code ne tient pas compte des heures mais des index donc t'as juste à changer l'array de base qui contient les heures [pour l'affichage] et tout fonctionne

    Par contre, il faut utiliser le formulaire que j'ai mis justement pour y avoir les index

Discussions similaires

  1. Gestion planning salle par heure
    Par polemos dans le forum Modélisation
    Réponses: 5
    Dernier message: 21/01/2010, 20h12
  2. graphique heure par heure
    Par loric92 dans le forum Access
    Réponses: 1
    Dernier message: 09/02/2007, 17h26
  3. [VBA] Mettre au premier plan par VBA?
    Par Caroline1 dans le forum Access
    Réponses: 9
    Dernier message: 02/05/2006, 22h49
  4. [HTML][checkbox] valider par défault
    Par hutchuck dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 28/11/2005, 11h44
  5. Réponses: 9
    Dernier message: 12/01/2005, 17h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo