actualisation de champs calculés

Eléphanteau du PHP | 40 Messages

19 juin 2006, 17:14

Bonjour à tous,

Voilà j'utilise pour la première fois le javascript dans une de mes applications, pensant que c'est une bonne solution pour ce que je souhaite faire. En effet, le but de l'opération est d'afficher un article choisi par l'utilisateur avec le PU, le TTC, une quantité par défaut de 1 et le total. l'utilisateur doit pouvoir modifier la quantité, le PUHT et le PU TTC s'il le souhaite. Mon problème concerne certaines données qui ne s'actualisent pas en temps réel, et d'autres oui (je ne sais pas si je suis très clair là :P )

Le code pour comprendre un peu mieux :
<script language="javascript"><!--

var tva;

function doRound(x, places) {
  return Math.round(x * Math.pow(10, places)) / Math.pow(10, places);
}

function getTaxRate() {
  var tax_rates = new Array();
  tax_rates["2"] = 19.6;
  return tax_rates["2"];
}

function updateGross(tva) {
  var grossValue = document.forms["insert_product"].products_price.value;

  if (tva > 0) {
    grossValue = grossValue * ((tva / 100) + 1);
  }

  document.forms["insert_product"].products_price_gross.value = doRound(grossValue, 2);
}

function updateNet(tva) {

  var netValue = document.forms["insert_product"].products_price_gross.value;

  if (tva > 0) {
    netValue = netValue / ((tva / 100) + 1);
  }

  document.forms["insert_product"].products_price.value = doRound(netValue, 2);
}

function updateTotal() {
  var quantityValue = document.forms["insert_product"].quantite.value;
  var netValue = document.forms["insert_product"].products_price_gross.value;
  var totalValue = netValue * quantityValue;
  document.forms["insert_product"].total_ttc.value = doRound(totalValue, 2);
}

//--></script>
<?php


if(isset($_POST['ok_new_article']))
{
  $product_num = isset($_POST['product_num'])?trim($_POST['product_num']):"";
  
    $sql_list_article = "SELECT * FROM " . $tblpref . "article WHERE num = " . $product_num;
    $result_list_article = mysql_query($sql_list_article) or die('Erreur SQL !<br>'.$sql_list_article.'<br>'.mysql_error());
    while ( $data = mysql_fetch_array( $result_list_article))
    {
     $ref_new_product      = $data['ref'];
     $article_new_product  = $data['article'];
     $taux_tva_new_product = $data['taux_tva'];
     $prix_ht_new_product  = $data['prix_htva'];

     // affichage du formulaire pour modifier les prix et remises du produit à ajouter au devis
     ?>

     <table class="formulaire">
     <form name="insert_product" method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">
                   <tr>
                       <td class="form_libelle">ref</td>
                       <td class="form_libelle">libelle</td>
                       <td class="form_libelle">Qté</td>
                       <td class="form_libelle">Rem. (%)</td>
                       <td class="form_libelle">PU HT</td>
                       <td class="form_libelle">PU TTC</td>
                       <td class="form_libelle">Total TTC</td>
                   </tr>
                   <tr>
                       <td class="form_field"><?php echo $ref_new_product; ?></td>
                       <td class="form_field"><?php echo $article_new_product; ?></td>
                       <td class="form_field"><input type="text" value="1" name="quantite" size="3" onKeyUp="updateTotal(<?php echo $taux_tva_new_product; ?>)"></td>
                       <td class="form_field"><input type="text" name="remise" size="3"></td>
                       <td class="form_field"><input type="text" value="<?php echo $prix_ht_new_product; ?>" name="products_price" onKeyUp="updateGross(<?php echo $taux_tva_new_product; ?>)"></td>
                       <td class="form_field"><input type="text" name="products_price_gross" onKeyUp="updateNet()"></td>
                       <td class="form_field"><input type="text" name="total_ttc"></td>
                   </tr>
                   <tr>
                       <td class="submit" colspan="2"><input type="submit" name="ok_add_article" value="Ok"></td>
                   </tr>
      </table></form>
   <?php
    }
  }
}
Si je modifie mon PU TTC, le HT se met bien à jour, mais si je modifie ma quantité, le PU TTC ne s'actualise pas automatiquement.

De même, et là c'est plus gênant, quand j'affiche la page, mon PU HT s'affiche bien (puisqu'il vient de la base de donnée) mais j'aimerais que le PU TTC soit affiché aussi par défaut ainsi que le Total TTC. Bref, il serait bien que tous les champs soient déjà remplis (à l'exception de remise), tous les champs doivent donc être calculés, mis à part le PU HT qui lui est déjà stocké quelque part.

Si vous avez besoin d'explications, surtout n'hésitez pas !

Merci à vous d'avance pour vos conseils.

Bonne soirée,
JM

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 juin 2006, 10:16

Pour tes champs qui ne s'actuallisent pas correctement, la solution est simple, c'est parce que tu ne leurs demandes pas de s'actualiser ;)

Si tu modifies la qte, tu fais appel à la fonction updateTotal(<?php echo $taux_tva_new_product; ?>) (le paramètre ne sert à rien soit dit en passant, il n'est pas géré par la fonction)

Or, ta fonction updateTotal() ne met à jour que le champ total_ttc. Il te faut donc compléter cette fonction si tu veux qu'elle mette à jour d'autres champs également (tu peux faire appel à d'autres fonctions depuis celle-ci pour mettre à jour ton PU TTC, puis ton HT, etc.)

Pour les valeurs au chargement, tu peux soit simplement les renseigner en php en effectuant le calcul et en mettant le résultat dans les value="", soit faire appel aux fonctions de calcul javascript une fois que le formulaire est affiché (directement dans le code ou via l'attribut onLoad="" de la balise <body>) :
<script>
  function fonction1() {...} // déclaration des fonction
  function fonction2() {...}
  ...
</script>

<form>
  ... // formulaire
</form>

<script>
fonction2(); // appel aux fonctions dans l'ordre qui t'arrange
fonction1();
</script>

Eléphanteau du PHP | 40 Messages

20 juin 2006, 13:22

Bonjour Ryle et merci à toi pour ton aide :wink:

Effectivement, je me disais bien que je devais avoir encore fait des trucs de travers :oops:

Je crois que ça devrait fonctionner au vu de tes commentaires.

Je test ça ce soir et je viendrais clore le sujet si tout est ok.

Encore merci à toi et bonne journée :merci: