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

JavaScript Discussion :

Calcul et mise à jour automatique des champs


Sujet :

JavaScript

  1. #1
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut Calcul et mise à jour automatique des champs
    Bonjour à tous,

    J’essaie d'actualiser le prix de mon panier suivant le format sélectionné.

    Nom : capture-forum.png
Affichages : 3096
Taille : 12,3 Ko

    Pour cela je souhaite que l'on puisse sélectionné le format dans une balise SELECT. Je récupère la liste des OPTION via ma BDD. Affichage de la liste OK.
    Maintenant je souhaite rafraîchir la page au clic sur l'OPTION de format sélectionné, garder la sélection afin de pouvoir modifier le prix. Et là ça bloque, je ne sais comment faire. Difficulté supplémentaire : Un select pour chaque ligne de produit.

    Quelqu'un pourrait-il m'offrir son aide ?

    Mon SELECT :


    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
     
    <?php
    if(isset($_GET['selecteur[$product->id;]']))
    {
        $selecteur=$_GET['selecteur[$product->id;]'];
     
     
    }
    else
    {
        echo "rIEN!";
    }
    ?>
     
    <select id="myprice[<?= $product->id; ?>]" class="price" name="selecteur[<?= $product->id; ?>]">
     
    <?php $formats = $DB->query("SELECT * FROM produits"); ?>
    				<?php foreach ( $formats as $format ): ?>
    				<option value="<?= $format->prix; ?>" <?php if($selecteur == $format->prix) echo"selected" ?> ><?= $format->format_name; ?> - <?= $format->prix; ?>0 €</option>
    				<?php endforeach ?>    
        </select>
     
    <input type="text" value="ICI J'AFFICHE LA VALUE DU FORMAT SELECTIONNE"/>
    [EDIT:2016/04/16] : Discussion renommée et déplacée dans le forum javascript.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    est ce que vous avez un formulaire HTML dans votre page ?
    la 1re chose à faire est d'afficher le contenu de $_GET après l'envoi du formulaire pour voir ce que vous obtenez comme informations

  3. #3
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Oui c'est bien dans un formulaire :

    Voici le code complet :

    Ma page s'appelle panier.php et c'est celle-ci qui doit être rechargé après clic sur un OPTION.
    J'aimerai que le premier élèment de cette liste soit par défaut et qu'elle fasse aparaitre un SELECTED uniquement si cette liste est modifié.
    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
    		<span class="price">
     
    			<?php
    			if(isset($_POST["format[$product->id]"])){
    			$selected = print 'selected';
     
    			}else{
    			$selected= print '';
    			}
    			?>
     
    <? print $_GET['format[$product->id]'];?>
    				<form method="POST" action="panier.php">
    					<select id="myprice[<?= $product->id; ?>]" class="price" name="format[<?= $product->id; ?>]" onChange='parent.location="javascript:location.reload()"'>
     
     
    					<?php $formats = $DB->query("SELECT * FROM produits"); ?>
    					<?php foreach ( $formats as $format ): ?>
     
    					<option value="<?= $format->prix; ?>" <?php $selected; ?>><?= $format->format_name; ?> - <?= $format->prix; ?>0 €</option>
     
     
    					<?php endforeach ?>
     
    					</select>
    					</form>
    			<input size="1" type="text" name="tariformat[<?= $product->id; ?>]" value="<?= $_POST['format[$product->id]']; ?>">
     
    		</span>
    Le $_GET ne me renvoie aucune valeur...

  4. #4
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Je ne souhaite pas cliquer sur un bouton SUBMIT pour actualiser la donnée.
    Le clic sur le OPTION me rafraîchit la page.

    Est-il possible d'utiliser un système de SESSION ou de COOKIE pour actualiser la donné dans le SELECT, c'est à dire placer SELECTED sur l'OPTION sélectionné ?
    Mon but est de récupérer la valeur dans un DIV. Cette valeur me servira pour actualiser le montant de mon panier suivant l'option sélectionné.

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    je parlais du tableau $_GET de façon globale pour vérifier que l'élément que vous cherchez est bien dedans.

    de plus si vous envoyez le formulaire avec "method=POST", c'est le tableau $_POST qu'il faut regarder.

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    Je ne souhaite pas cliquer sur un bouton SUBMIT pour actualiser la donnée.
    Le clic sur le OPTION me rafraîchit la page.
    cela fait deux fois que je relis la discussion et je dois admettre que cela n'est pas très clair pour moi !

    Dans un premier temps ton soucis n'est-il que de vouloir mettre à jour les différents champs présents dans ta page ?

  7. #7
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    @NOSMOKING -> Je n'ai pas de bouton SUBMIT dans le formulaire. L'action de rafraichissement doit se faire quand on a fait le choix dans la liste déroulante (Voir photos). Les choix dans la liste déroulante sont des formats d'impression.

    L'action qui j'aimerai en suive serait d'affecter le selected="selected" à l'OPTION validé dans la liste déroulante. Afin que je puisse récupérer la VALUE de l'OPTION pour recalculer mon tarif.

    @MATHIEU -> Le $_GET était une suggestion. Je souhaite juste affecté un SELECTED sur l'option choisie après rafraîchissement de la page et récupérer sa valeur. Lors de l'arrivée sur la page panier il n'y a aucune valeur POST a récupéré. Pour celà que je me demandais si je ne pouvais pas faire qqchose avec les SESSIONS ou COOKIES... ?!?

    Voici le code complet de ma page panier.php

    Ma liste déroulante se trouve dans le <SPAN="PRICE">

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    <?php
    session_start();
    if (!isset($_SESSION['login'])) {
            header ('Location: album_connexion.php');
    }
    ?> 
    <?php require 'panier/header_panier.php'; ?>
     
    <?php 
    $album=$_SESSION['login'];
     ?>
     
    <div class="checkout">
    	<div class="title">
    		<div class="wrap">
    		<h2 class="first">Votre panier</h2>
    		</div>
    	</div>
     
     
     
    	<form method="post" action="panier.php">
    	<div class="table">
    		<div class="wrap">
     
    			<div class="rowtitle">
    				<span class="name">Photo n°</span>
    				<span class="price">Format</span>
    				<span class="quantity">Quantité</span>
    				<span class="subtotal">Prix Total</span>
    				<span class="action">Supprimer</span>
    			</div>
     
    			<?php
                            $ids = array_keys($_SESSION['panier']);
                            if(empty($ids)){
                                    $products = array();
                            }else{
                                    $products = $DB->query('SELECT * FROM images WHERE id IN ('.implode(',',$ids).')');
                            }
                            foreach($products as $product):
                            ?>
    			<div class="row">
    				<a href="#" class="img"> <img src="administration/images/<?= print $album; ?>/<?= $product->thumbnail_image; ?>" height="53"></a>
    				<span class="name"><?= $product->normal_name; ?></span>
     
     
     
     
     
    		<span class="price">
     
     
    			<?php
    			if(isset($_POST["format[$product->id]"])){
    			//si la liste a été "postée" c'est à dire choix fait
    			$format[$product->id]=$_POST['format[$product->id]'];
    			$selected = print 'selected';
     
    			}else{
    			$format[$product->id]=-1;
    			$selected= print '';
    			}
    			?>
     
     
    <? print $_GET['format[$product->id]'];?>
    				<form method="POST" action="panier.php">
    					<select id="myprice[<?= $product->id; ?>]" class="price" name="format[<?= $product->id; ?>]" onChange='parent.location="javascript:location.reload()"'>
     
     
    					<?php $formats = $DB->query("SELECT * FROM produits"); ?>
    					<?php foreach ( $formats as $format ): ?>
     
    					<option class="selection" value="<?= $format->prix; ?>" <?php $selected; ?>><?= $format->format_name; ?> - <?= $format->prix; ?>0 €</option>
     
     
    					<?php endforeach ?>
     
    					</select>
    					</form>
    			<input size="1" type="text" name="tariformat[<?= $product->id; ?>]" value="format[<?= $product->prix; ?>]">
     
    		</span>
     
     
     
    				<span class="quantity">		
     
     
    <span class="sup"><a style="border: 1px solid #960018;margin: 10px; padding:3px;" href="panier.php?supProd=<?= $product->id; ?>">-</a></span>
    <span id="countprod" ><?= $_SESSION['panier'][$product->id]; ?></span>
    <span class="ajout"><a style="border: 1px solid #960018;margin: 10px; padding:3px;" href="panier.php?ajoutProd=<?= $product->id; ?>">+</a></span>
     
     
     
     
    <input type="hidden" name="panier[quantity][<?= $product->id; ?>]" value="<?= $_SESSION['panier'][$product->id]; ?>">
     
    				</span>
     
     
     
     
     
    				<span class="subtotal" name="subtotal[<?= $_SESSION['panier'][$product->id]; ?>]" id="sousprodtotal"><?= number_format($product->price * $_SESSION['panier'][$product->id],2,',',' '); ?> €</span>
    				<span class="action">
    					<a href="panier.php?delPanier=<?= $product->id; ?>" class="del"><img src="panier/img/del.png"></a>
    				</span>
    			</div>
     
     
    			<?php endforeach; ?>
     
     
    			<div class="rowtotal">
    				Article(s) : 	<span id="count"><?= $panier->count(); ?></span><br>
    				Dont TVA : <span> <span id="tva"><?= number_format($panier->total() * 1.196 - $panier->total(),2,',',' '); ?></span>  € </span><br>
    				Grand Total : <span><span id="total"><?= number_format($panier->total() ,2,',',' '); ?></span> € </span>
     
    			<input type="submit" value="Recalculer">
    <a href="album.php"  class="flatbtn-blu hidemodal">Modifier</a>
    <a href="#"  class="flatbtn-blu hidemodal">Continuer</a>
    		</div>
    	</div>
    	</form>
    </div>
    <br><br>
     
     
     
          <div class="clear"></div>
    <?php require 'inc/footer.inc.php'; ?>

  8. #8
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    Bonjour,cela fait deux fois que je relis la discussion et je dois admettre que cela n'est pas très clair pour moi !

    Dans un premier temps ton soucis n'est-il que de vouloir mettre à jour les différents champs présents dans ta page ?
    Oui c'est bien ça. Modifier mon prix suivant le format d'impression sélectionné. Pour cela (à mon sens) je dois affecter un SELECTED sur l'OPTION du format dans le menu déroulant fin de récupérer sa valeur..

    C'est tout con mais je butte vraiment

  9. #9
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Si j'ai bien tout compris ton problème n'a rien à voir avec Ajax/php mais est juste un soucis de mise à jour de champ dans ton « formulaire » en fonction des changements des valeurs de tes contrôles.

    Merci de confirmer, dans ce cas il faudrait revoir l'approche complète coté client dans un premier temps.

  10. #10
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    J'ai du mal à saisir ce qui semble incompréhensible dans mon explication. Mais oui c'est ça !

  11. #11
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut Calcul et mise à jour automatique des champs
    Tu mets un PHP dans le titre, tu postes dans le forum Ajax, tu parles de « Maintenant je souhaite rafraîchir la page au clic sur » alors qu'en fait cela n'a rien à voir avec tout cela, voilà ce qui est « incompréhensible dans mon explication ».

    Nous allons donc voir comment faire un Calcul et mise à jour automatique des champs.

    Structure HTML utilisée
    Partons de la structure HTML suivante :
    Code html : 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
    <div id="facture">
      <p class="entete">
        <span>Format</span>
        <span>Prix U</span>
        <span>Quantité</span>
        <span>Prix total</span>
      </p>
     
      <p class="ligne">
        <span>
          <select name="prix[]">
            <option>Choix</option>
            <option value="1.5">Petit modèle</option>
            <option value="2.5">Moyen modèle</option>
            <option value="3.5">Grand modèle</option>
            <option value="5">Modèle XXXL</option>
          </select>
        </span>
        <span class="info-prix"></span>
        <span>
          <button class="btn_moins">-</button>
          <input  name="quantite[]">
          <button class="btn_plus">+</button>
        </span>
        <span class="total-ligne"></span>
      </p>
    </div>
    Chaque ligne de calcul est mise dans un conteneur, ici un <p>, pour que les contrôles associés soient facilement récupérables.
    Une ligne est ajoutée pour recevoir l'affichage du total des totaux.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <p>
      <span>Total :</span>
      <span id="total"></span>
    </p>

    Analyse interaction
    Nous avons :
    • un <select name="prix[]"> sur lequel on place un « écouteur », onchange, qui déclenche un calcul de la ligne au changement de sélection en faisant appel à une fonction que l'on appellera calculLigne ;
    • un <input name="quantite[]"> sur lequel on place un « écouteur », onkeyup, qui déclenche une mise à jour du champ, test sur saisie, en faisant appel à une fonction que l'on appellera majQuantite. Cette fonction fait elle même un appel à la fonction calculLigne pour demander le calcul de la ligne ;
    • deux <button class="btn_???">, un pour l'incrémentation et un pour la décrémentation de la quantité, qui utilisent la fonction majQuantite en passant en paramètre l'incrément à appliquer, +1/-1.

    Pour afficher le total des totaux il nous faut également une fonction qui va parcours les lignes pour en faire la somme et l'afficher, nous l'appellerons calculTotal. Cette fonction sera appelée par la fonction calculLigne, ainsi à chaque modification le total des totaux sera mis à jour.

    Définition des fonctions
    Pour chaque fonction, à l'exception de calculTotal, on passera en paramètre le « parent », en l’occurrence le <p class="ligne">, pour pouvoir retrouver les contrôles associés devant être manipulés et renseignés.

    Dans toutes les fonctions la récupération des éléments ce fait via leur name ou leur class.

    • calculTotal()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function calculTotal(){
      var total = 0;
      // récup. des champs de contrôle
      var oParent = document.getElementById('facture');
      var oTotaux = oParent.querySelectorAll('.total-ligne');
      var i, nb = oTotaux.length;
      // calcul super total
      for( i = 0 ; i < nb; i += 1){
        total += parseFloat( oTotaux[i].textContent);
      }
      // affectation de la valeur
      document.getElementById('total').textContent = total.toFixed(2);
    • calculLigne( parent)
    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
    /**
    * Calcul suivant les éléments de la ligne et met à jour les champs d'affichage
    * @param {Object} parent - conteneur de la ligne de calcul
    */
    function calculLigne( parent){
      // récup. des champs de contrôle
      var oPrix        = parent.querySelector('[name ^=prix]');
      var oQuantite    = parent.querySelector('[name ^=quant]');
      var oTxtPrix     = parent.querySelector('.info-prix');
      var oTxtTotal    = parent.querySelector('.total-ligne');
      // récup. et calcul des valeurs
      var prixUnitaire = parseFloat( oPrix.value) || 0;
      var quantite     = parseFloat( oQuantite.value) || 0;
      var total        = prixUnitaire * quantite;
      // affectation des valeurs
      oTxtPrix.textContent  = prixUnitaire.toFixed(2);
      oTxtTotal.textContent = total.toFixed(2);
      // demande mise à jour total
      calculTotal();
    }
    • majQuantite( parent, inc)
    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
    /**
    * Met à jour le champ quantité et demande le calcul sur la ligne
    * @param {Object} parent - conteneur de la ligne de calcul
    * @param {Number} inc - incrément à appliquer : +1, 0, -1
    */
    function majQuantite( parent, inc){
      var oElem = parent.querySelector('[name ^=quant]');
      var val   = parseInt( oElem.value || 0, 10) +inc;
      // test aux bornes
      if( val < 0){
        val = 0;
      }
      if( val > 100){
        val = 100;
      }
      // affectaion valeur
      oElem.value = val;
      // force le recalcul de la ligne
      calculLigne( parent);
    }
    Déclaration des événements
    Nous allons opter pour une fonction unique d'affectation des événements afin que celle-ci soit appellable lors de la création d'une nouvelle ligne, fonction que l'on appellera addEventLigne.

    Nous passerons en paramètre à cette fonction la référence au conteneur de la ligne, comme pour les autres fonctions d'ailleurs.
    • addEventLigne( parent)
    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
    /**
    * Affectation des événements sur les contrôles de la ligne
    * @param {Object} parent - conteneur de la ligne de calcul
    */
    function addEventLigne( parent){
      // récup. <select>
      var oElem = parent.querySelector('[name ^=prix]');
      oElem.onchange = function(){
          calculLigne( parent);
        };
      // récup. des <button>
      oElem = parent.querySelector('.btn_plus');
      oElem.onclick = function(){
          majQuantite( parent, 1);
        };
      oElem = parent.querySelector('.btn_moins');
      oElem.onclick = function(){
          majQuantite( parent, -1);
        };
      // récup. <input> quantité
      oElem = parent.querySelector('[name ^=quant]');
      oElem.onkeyup = function(){
          if( !isNaN( parseInt( this.value, 10))){
            majQuantite( parent, 0);
          }
          else{
            this.value = 0;
          }
        };
      // mise à jour des champs
      calculLigne( parent);
    }
    Initialisation
    Il ne reste plus qu'à initialiser les différents éléments, l'initialisation étant à faire après chargement du DOM et à chaque création/ajout d'une nouvelle ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // initialisation
    var oElems = document.querySelectorAll('p.ligne'),
        i, nb = oElems.length;
    for( i = 0 ; i < nb; i += 1){
        addEventLigne( oElems[i]);
    }
    Exemple à tester et à analyser
    Code html : 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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="utf-8">
    <title>Calcul et mise à jour automatique des champs</title>
    <meta name="Author" content="NoSmoking">
    <style>
    html, body {
      margin: 0;
      padding: 0;
      font: 1em/1.5 Verdana,sans-serif;
      background: #fff;
    }
    #main {
      margin: 0 auto;
      max-width: 60em;
      border-top: 1px solid transparent;
    }
    h1, h2, h3 {
      color: #069;
    }
    #facture {
      display: table;
    }  
    #facture p {
      display: table-row;
      line-height: 2em;
    }
    #facture p span {
      display: table-cell;
      border-right: 1px solid #ccc;
      border-bottom: 1px solid #ccc;
      border-left: 1px solid #ccc;
      text-align: center;
      line-height: 3em;
    }
    #facture p > span +span {
      border-left: 0 solid #ccc;
    }
    #facture p.entete {
      text-shadow: 1px 1px 0 #fff;
      background: #eee;
      background: linear-gradient(to bottom,transparent,rgba(0,0,0,0.2) ) repeat scroll 0 0 #EEE;
    }
    #facture .entete span {
      border-top: 1px solid #ccc;
    }
    #facture input,
    #facture select,
    #facture button {
      padding: .25;
      font-family: Verdana;
      font-size: .9em;
      line-height: 1.5em;
    }
    #facture select {
      width: 11em;
    }
    #facture select option:first-child {
      font-style: italic;
      color: #888;
    }
    #facture button {
      width: 2em;
    }
    #facture [name ^=quantite] {
      width: 2em;
    }
    .col_1 {
      min-width: 13em;
    }
    .col_2 {
      min-width: 4em;
    }
    .col_3 {
      min-width: 8em;
    }
    .col_4 {
      min-width: 10em;
    }
    #facture .info-prix {
      font-size: .8em;
      font-style: italic;
    }
    #facture .text-right {
      padding-right: .5em;
      text-align: right;
    }
    #total:after,
    .info-prix:after,
    .total-ligne:after {
      content: " €";
    }
    </style>
    </head>
    <body>
    <div id="main">
        <h1>Calcul et mise à jour automatique des champs</h1>
        <div id="facture">
          <p class="entete">
            <span class="col_1">Format</span>
            <span class="col_2">Prix U</span>
            <span class="col_3">Quantité</span>
            <span class="col_4">Prix total</span>
          </p>
     
          <p class="ligne">
            <span class="col_1">
              <select name="prix[]">
                <option>Choix</option>
                <option value="1.5">Petit modèle</option>
                <option value="2.5">Moyen modèle</option>
                <option value="3.5">Grand modèle</option>
                <option value="5">Modèle XXXL</option>
              </select>
            </span>
            <span class="col_2 info-prix"></span>
            <span class="col_3">
              <button class="btn_moins">-</button>
              <input  name="quantite[]">
              <button class="btn_plus">+</button>
            </span>
            <span class="col_4 total-ligne text-right"></span>
          </p>
     
          <p class="ligne">
            <span class="col_1">
              <select name="prix[]">
                <option>Choix</option>
                <option value="1.5">Petit modèle</option>
                <option value="2.5">Moyen modèle</option>
                <option value="3.5">Grand modèle</option>
                <option value="5">Modèle XXXL</option>
              </select>
            </span>
            <span class="col_2 info-prix"></span>
            <span class="col_3">
              <button class="btn_moins">-</button>
              <input  name="quantite[]">
              <button class="btn_plus">+</button>
            </span>
            <span class="col_4 total-ligne text-right"></span>
          </p>
     
          <p>
            <span></span>
            <span></span>
            <span>Total :</span>
            <span id="total" class="text-right"></span>
          </p>
        </div>
      </div> 
    </div>
    <script>
    function calculTotal(){
      var total = 0;
      // récup. des champs de contrôle
      var oParent = document.getElementById('facture');
      var oTotaux = oParent.querySelectorAll('.total-ligne');
      var i, nb = oTotaux.length;
      // calcul super total
      for( i = 0 ; i < nb; i += 1){
        total += parseFloat( oTotaux[i].textContent);
      }
      // affectation de la valeur
      document.getElementById('total').textContent = total.toFixed(2);
    }
    /**
    * Calcul suivant les éléments de la ligne et met à jour les champs d'affichage
    * @param {Object} parent - conteneur de la ligne de calcul
    */
    function calculLigne( parent){
      // récup. des champs de contrôle
      var oPrix        = parent.querySelector('[name ^=prix]');
      var oQuantite    = parent.querySelector('[name ^=quant]');
      var oTxtPrix     = parent.querySelector('.info-prix');
      var oTxtTotal    = parent.querySelector('.total-ligne');
      // récup. et calcul des valeurs
      var prixUnitaire = parseFloat( oPrix.value) || 0;
      var quantite     = parseFloat( oQuantite.value) || 0;
      var total        = prixUnitaire * quantite;
      // affectation des valeurs
      oTxtPrix.textContent  = prixUnitaire.toFixed(2);
      oTxtTotal.textContent = total.toFixed(2);
      // demande mise à jour total
      calculTotal();
    }
    /**
    * Met à jour le champ quantité et demande le calcul sur la ligne
    * @param {Object} parent - conteneur de la ligne de calcul
    * @param {Number} inc - incrément à appliquer : +1, 0, -1
    */
    function majQuantite( parent, inc){
      var oElem = parent.querySelector('[name ^=quant]');
      var val   = parseInt( oElem.value || 0, 10) +inc;
      // test aux bornes
      if( val < 0){
        val = 0;
      }
      if( val > 100){
        val = 100;
      }
      // affectaion valeur
      oElem.value = val;
      // force le recalcul de la ligne
      calculLigne( parent);
    }
    /**
    * Affectation des événements sur les contrôles de la ligne
    * @param {Object} parent - conteneur de la ligne de calcul
    */
    function addEventLigne( parent){
      // récup. <select>
      var oElem = parent.querySelector('[name ^=prix]');
      oElem.onchange = function(){
          calculLigne( parent);
        };
      // récup. des <button>
      oElem = parent.querySelector('.btn_plus');
      oElem.onclick = function(){
          majQuantite( parent, 1);
        };
      oElem = parent.querySelector('.btn_moins');
      oElem.onclick = function(){
          majQuantite( parent, -1);
        };
      // récup. <input> quantité
      oElem = parent.querySelector('[name ^=quant]');
      oElem.onkeyup = function(){
          if( !isNaN( parseInt( this.value, 10))){
            majQuantite( parent, 0);
          }
          else{
            this.value = 0;
          }
        };
      // mise à jour des champs
      calculLigne( parent);
    }
    // initialisation
    var oElems = document.querySelectorAll('P.ligne'),
        i, nb = oElems.length;
    for( i = 0 ; i < nb; i += 1){
        addEventLigne( oElems[i]);
    }
    </script>
    </body>
    </html>

    Voilou

  12. #12
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    @NOSMOKING !
    Ouaouh, ça c'est de la réponse!
    Je vais prendre le temps d'analyser tout ça dans l'a-m. A première vue je ne sais pas si cela va pouvoir solutionner mon problème. Sachant que le reste de ma structure fonctionne parfaitement, je ne souhaite pas là revoir pour un problème de récupération de valeur dans une liste déroulante.

    En tout les cas, un grand merci !! pour la qualité de cette réponse; Je vais comme tu me l'a suggéré prendre le temps d'analyser ça cette a-m et reviens vers toi !!

  13. #13
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    A la relecture je m’aperçois qu'il y a des petits détails améliorables
    Sachant que le reste de ma structure fonctionne parfaitement,...
    L'exemple n'est là que pour montrer comment les fonctions doivent s'enclencher les unes aux autres pour obtenir le résultat final, c'est cela qui est important.

    PS : Je renomme la discussion et je la déplace dans le forum javascript.

  14. #14
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Bonsoir NoSmoking !

    Merci encore une fois pour ce code simple et fonctionnel. Toutefois je reste heurté à un problème un peu similaire...
    C'est à dire que si je rafraîchis la page, les données de mes select sont perdus. J'aimerai que les valeurs reste si la page est rafraîchit.

    As-tu une méthode simple à me conseiller ? Du style mémoriser le SELECTED ...

    Ruddy

  15. #15
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Si la partie mise à jour des champs est réglé il serait préférable de solder cette discussion et d'en ouvrir une autre pour que celle ci reste claire et non ambigüe.

    C'est à dire que si je rafraîchis la page, les données de mes select sont perdus.
    Il te faudra bien préciser quelle action est à l'origine du rafraichissement de ta page et comment t'y prends tu, partiel/total, ce point est pour moi toujours aussi obscur.

    Peut être devrais tu lire également : Implémentation d'un panier en JavaScript et HTML5, on ne sais jamais.

  16. #16
    Candidat au Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    Nous allons donc voir comment faire un Calcul et mise à jour automatique des champs....
    Merci beaucoup NoSmoking, ton code est parfait et tes explications très claires.
    Je vais me permettre de récupérer ce code en te mettant en auteur bien sûr ;-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD-2010] Mise à jour automatique des champs dans entête/pied de page
    Par modus57 dans le forum VBA Word
    Réponses: 3
    Dernier message: 02/03/2015, 14h31
  2. [WD-MAC 2011] Mise à jour automatique des champs à l'ouverture
    Par Gilles38 dans le forum VBA Word
    Réponses: 3
    Dernier message: 26/01/2012, 07h56
  3. [AC-2000] Mise à jour automatique des champs d'une table
    Par Seric31 dans le forum Modélisation
    Réponses: 1
    Dernier message: 29/07/2010, 17h42
  4. Mise à jour automatique des champs d'un formulaire
    Par laurentSc dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/03/2010, 14h27
  5. Mise à jour automatique des champs d'un formulaire
    Par laurentSc dans le forum Langage
    Réponses: 2
    Dernier message: 14/03/2010, 22h27

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