[php/js] Récupere 2 valeurs d'un select

Discussion dans 'Web, design' créé par Amco, 15 Novembre 2007.

Statut de la discussion:
Fermée.
  1. Offline
    Amco ex membre
    Hello, je suis oqp a réaliser une liste avec des choix à l'utilisateur.

    Cette liste, propose du matériel, qui a un certain prix.

    Je met donc dans mon

    <select:colere:option value="PRIX">NOM</option>

    Avec un petit script, j'affiche la somme total des select.

    Mais le problème est : Je voudrais récuperer le PRIX ainsi que le NOM dans une autre page (ok2.php). Mais je vois pas trop comment on sait récuperer dans un select 2 valeurs :-(


    Code:
     
    <script language="JavaScript" type="text/javascript">
    function sum_elements(){
    var somme=0;
    var result = document.getElementById('somme');
    for(var i = 1; i<=2; i++){
    	 var element = document.getElementById('el_'+i);
    	 if(element.value!='' && !isNaN(element.value)){
    		 somme += parseInt(element.value);
    	 }
    }
    result.value = somme;
    }
    </script> 
    <form method="post" action="ok2.php">
    <select name="el_1[]" id="el_1" onChange="sum_elements();">
    <option selected value="0">---Menu 1---</option>
    <option value="[color=orange]100[/color]">[color=orange]Choix_1_1[/color]</option>
    <option value="[color=orange]200[/color]">[color=orange]Choix_1_2[/color]</option>
    </select>
    <br /> 
    <select name="el_2" id="el_2" onChange="sum_elements();">
    <option selected value="0">---Menu 2---</option>
    <option value="[color=orange]100[/color]">[color=orange]Choix_2_1[/color]</option>
    <option value="[color=orange]200[/color]">[color=orange]Choix_2_2[/color]</option>
    </select>
    Somme : <input class="total" id="somme" name="somme" type="text">
    <br />
    <input type="submit" name="total" value="Voir mon choix"/>
     
    </form>
    
    Merci à ceux qui pourront m'aider
    Amco, 15 Novembre 2007
    #1
  2. Offline
    II phl II Touriste
    Tu ne peux pas directement récupérer le NOM.
    Seul ce qui est dans value="XX" est transmis, donc le PRIX.

    Pour ce que tu veux faire, y a au moins 2 solutions qui me viennent directement à l'esprit, une bonne et une mauvaise :p

    1) La mauvaise :
    Utiliser des champs cachés pour transmettre le nom des produits choisis.
    Donc mettre un <input type="hidden" name="hid1" value="" />
    Ensuite, avec du JS tu remplis la value du champ caché en fonction de ce qui est choisi dans la liste déroulante. Tu pourras ainsi récupérer le NOM.

    2) La bonne :
    Utiliser une base de données.
    Plutôt que de jouer avec des PRIX et NOM dans le code, tu joues uniquement avec un numéro d'article. Et dans la BDD, à ce n° d'article est associé un nom, un prix, des caractéristiques, etc.. que tu peux appeler à tout moment.
    Tu pourras facilement faire toutes sortes d'opérations, comme notamment la somme des produits choisis.

    3) Pour la route :
    Tu peux aussi utiliser des n° d'articles et stocker les informations relatives à ces articles dans la page courante, en JS ou en PHP peu importe. Tu fais les traitements on the fly et tu transmets les résultats à ok2.php
    II phl II, 15 Novembre 2007
    #2
  3. Offline
    ozilrit Touriste
    4) La très très mauvaise :
    Se fier au total calculé sur base de données entrées par l'utilisateur.

    Qu'adviendrait-il si je modifiais le formulaire pour y insérer des prix dérisoires ?



    Voici une base (les exemples sont idiots, j'en conviens) :
    Code:
    <?php
    //Groupe de produits #1
    $produits [ 0 ] [ 0 ] [ 'nom' ] = 'Pomme' ;
    $produits [ 0 ] [ 0 ] [ 'prix' ] = 0.5 ;
    $produits [ 0 ] [ 1 ] [ 'nom' ] = 'Poire' ;
    $produits [ 0 ] [ 1 ] [ 'prix' ] = 0.6 ;
    $produits [ 0 ] [ 2 ] [ 'nom' ] = 'Scoubidoubidou-whaaaa' ;
    $produits [ 0 ] [ 2 ] [ 'prix' ] = 1 ;
    
    //Groupe de produits #2
    $produits [ 1 ] [ 0 ] [ 'nom' ] = 'Train' ;
    $produits [ 1 ] [ 0 ] [ 'prix' ] = 200 ;
    $produits [ 1 ] [ 1 ] [ 'nom' ] = 'Voiture' ;
    $produits [ 1 ] [ 1 ] [ 'prix' ] = 100 ;
    $produits [ 1 ] [ 2 ] [ 'nom' ] = 'Avion' ;
    $produits [ 1 ] [ 2 ] [ 'prix' ] = 500 ;
    
    //Traitement du panier.
    if (isset ( $_POST [ 'produits' ] )) {
    	foreach ( $_POST [ 'produits' ] as $k => $v ) {
    		if (is_numeric ( $v [ 'id' ] ) && array_key_exists ( $v [ 'id' ], $produits [ $k ] )) {
    			$total += $produits [ $k ] [ $v [ 'id' ] ] [ 'prix' ] ;
    			$retour .= '<li>'.$produits [ $k ] [ $v [ 'id' ] ] [ 'nom' ] . ' (' . $produits [ $k ] [ $v [ 'id' ] ] [ 'prix' ] . ')</li>' ;
    		}
    	}
    	echo ('Vous avez sélectionné ce(s) produit(s) : <ul>' .$retour.'</ul>Le total est de '.(0+$total).' ¤.') ;
    }
    
    //Affichage des produits.
    echo ('<form method="post" action="/">') ;
    foreach ( $produits as $k => $v ) {
    	echo ('<select name="produits[' . $k . '][id]">') ;
    	foreach ( $v as $y => $z )
    		echo ('<option value=' . $y . '>' . $z [ 'nom' ] . ' (' . $z [ 'prix' ] . ')</option>') ;
    	echo ('</select>') ;
    }
    echo ('<input type="submit" /></form>') ;
    
    //Félicitation, vous avez été jusqu'au bout. La réponse à votre prochaine
    //question est AJAX ou la validation du formulaire. En admettant qu'un nombre
    //croissant d'algorithmes devront être traités lors d'un achat, je vous 
    //conseille la validation.
    ?>
    
    ozilrit, 16 Novembre 2007
    #3
  4. Offline
    Amco ex membre
    Merci tout d'abord de m'avoir répondu.

    Oui j'ai pensé à faire en fonction de l'id unique d'un article à partir d'une base de données... Mais le truc c'est que j'aimerais faire une sorte de calcul "en direct" en fonction des articles sélectionnés.


    Je vais donner un exemple, pour y voir plus clair :
    http://www.microcity.be/pccarte/new.php

    Donc on choisi les articles, et à côté il y'a la somme totale.
    -> Ca ok je l'ai avec mon code.

    Mais j'aimerais donc que lorsqu'on clique sur mon Submit, récuperer le nom du produit ainsi que le prix.


    Fin, je veux avoir le même résultat que le lien là, mais le JS et moi, ca fait 2 :-(

    Je vois pas trop comment faire :-'

    Je crois que c'est la "mauvaise" méthode qu'ils utilisent lol
    Amco, 16 Novembre 2007
    #4
  5. Offline
    Bartdude Touriste
    Ca peut se faire, soit en forcant un submit de la page à chaque changement dans le select (ou via un bouton "calcul intermédiaire", qui oblige un clic au visiteur), soit via Ajax, qui te permet d'échanger des données avec ton serveur sans faire de reload de la page.

    Cette dernière solution est de loin la meilleure dans ton cas, à combiner évidemment avec la solution numéro 2...les identifiants de tes produits doivent bien rester des identifiants.
    Bartdude, 16 Novembre 2007
    #5
  6. Offline
    II phl II Touriste
    Clairement !
    La meilleure solution est :
    - une base de données contenant prix et nom
    - une interface avec de l'ajax qui va rechercher les prix des articles choisis par l'utilisateur et en faire la somme.
    II phl II, 17 Novembre 2007
    #6
  7. Offline
    ozilrit Touriste
    Non, c'est pire.
    ozilrit, 18 Novembre 2007
    #7
  8. Offline
    Soulsight Touriste
    l'ajax serai la solution idéale en effet ... mais si tu n'as pas envie , tu peux faire comme "avant" :

    générer un array§javascript en fct de ce qu'il y avait dans la DB ( donc tu sélectionnais les articles en début de page via SQL )
    Soulsight, 22 Novembre 2007
    #8
Statut de la discussion:
Fermée.