[PHP] - Formulaire pour des commandes

Résolu/Fermé
patrice86 Messages postés 1380 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 17 décembre 2024 - 9 juin 2012 à 16:25
patrice86 Messages postés 1380 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 17 décembre 2024 - 11 juin 2012 à 13:56
Bonjour,

Je suis actuellement entrain de dvlp une application intranet.
Le principe de cette application est de pouvoir gérer les commandes des clients d'une entreprise.

Ainsi donc, je dois disposer d'un formulaire pour créer une nouvelle commande.
Or, une commande peut-être composée de 1,2,3,... produits différents. Ainsi, je ne vois pas comment effectuer mon formulaire.

Une fois cette commande valider, le formulaire doit insérer dans la table commandes un numéro de commande (auto-incrémenté) lier à une personnes. Puis il doit insérer dans la table composer le numéro de la commande ainsi que le numéro du ou des produits avec la quantité par produit.

Voici la base de données correspondantes. Nous n'avons besoin que des tables:
personnes, commandes, composer et produits.
Base de données => http://hpics.li/8cc09c8

Merci de votre aide, je suis perdu.
CDLT
Patrice


A voir également:

17 réponses

Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
11 juin 2012 à 13:18
effectivement on peut très bien mettre une liste déroulante pour les produits.

- soit on "stocke" cette liste dans un array en JS qui servira à la fonction crea_champ a générer la lise déroulante
- soit on fait un appel Ajax pour la faire générer par du php

les deux sont possibles

quels sont les champs input que tu veux mettre pour chaque produit ?

je t'ai envoyé un MP
1
aladin07 Messages postés 277 Date d'inscription vendredi 13 avril 2012 Statut Membre Dernière intervention 30 septembre 2012 30
9 juin 2012 à 16:43
Pardonne moi mais la façon dont vous avez posé le problème est identique à celle d'appel aux propositions freelance....
En plus vous n'avez pas vraiment fournit les informations essentiels, tout ce que vous avez fournit n'est autre que des details secondaires.
Votre problème, est-il un problème HTML? Comment créer un formulaire? Comment PHP insere les donnés dans la bdd?

C'est quoi le problème exactement?
0
patrice86 Messages postés 1380 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 17 décembre 2024 125
9 juin 2012 à 17:18
Le problème exactement consiste dans le fait que je ne vois pas comment créer ce genre de formulaire.


J'ai bien l'idée d'insérer une ligne à l'écran où l'utilisateur rentre le nombre de produit puis automatiquement sont générées des lignes avec les informations demandées mais derrière je n'arrive pas a récupérer les informations pour les stockées dans la bdd ou alors c'est très long (en code).

Donc ce que je recherche est une idée et/ou une solution pour résoudre ce problème.
0
aladin07 Messages postés 277 Date d'inscription vendredi 13 avril 2012 Statut Membre Dernière intervention 30 septembre 2012 30
9 juin 2012 à 17:39
Ce que j'aurais fait c'est:

1 - Ajouter un colonne dans commandes: personne_id qui contiendra le num_personne qui a fait la commande.

2 - Ajouter une colonne produits:(text) qui contiendra les num_pro

Alors dans le formulaire, afficher les produits (checkbox) pour chack produit checké il sera ajouté dans un text: ex: 12,335,775,31,14 ceci represente les produits séparés d'un virgule (pour les récupere on fait un explod();

le personne_id sert à reconnaitre la personne qui a fait cette commande.

Donc si on se connecte à la base, on retrouve les commandes, pour chaque commande on a la personne qui a fait la commande et les produits qu'elle a acheté
0

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

Posez votre question
patrice86 Messages postés 1380 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 17 décembre 2024 125
9 juin 2012 à 17:54
Le numéro de la personne se trouve déjà dans la table commande.

avec le MCD, on voit que ton idée n°2 n'est pas possible étant donné que la table concerner dispose du num de commande, du num produit et de la quantité.

Ex: commande, produit, qté => 1,1,2 1,2,1 1,3,5 ....

Hmmm l'idée de la Chekbox par contre n'est pas mauvaise du tout. Pas pratique par contre car je disposes de environ 70-80 produits =) mais c'est une solution que je vais étudier.
0
aladin07 Messages postés 277 Date d'inscription vendredi 13 avril 2012 Statut Membre Dernière intervention 30 septembre 2012 30
9 juin 2012 à 18:57
La solution pour toi c'est bien le javascript...

https://getbootstrap.com/2.3.2/#typeahead

Tu vois ce type de champ? Essaie d'écrire Te, Pe, c'est comme facebook, en ecrivant le nom apparait, à chaque fois que tu tape sur entrer un hidden input collect l'id du produit.

Les termes seront collectés de la base de donnés pour le champ.

C'est la meilleur solution je crois.
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
Modifié par Alain_42 le 9/06/2012 à 22:54
une solution:

tu cree un formulaire avec un seul champ produit, avec un bouton ajouter un produit
ce bouton en javascript (vas voir sur google ) rajoutes un nouveau champ produit
attention il faut que le name soit un array ex
name="champ_produit[]

lorsque le formulaire est posté il suffit de parcourir l'array $_POST['champ_produit']
pour avoir tous les champs produit

coté enr BDD il faut que dans ta table produit tu aie un liaison vers la table commandes par un champ id_commande

ainsi lorsque formulaire posté tu fais un INSERT de la commande dans la table commande, tu récupères l'id autoincrémenté et tu fais par une boucle sur les produits des INSERT dans la table produits avec l'id_commande associé

ensuite pour relire il suffit de faire un SELECT sur la table produit avec WHERE id_commande= .....
plus d'autres champs d'autres tables pour avoir les renseignements voulus
0
patrice86 Messages postés 1380 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 17 décembre 2024 125
10 juin 2012 à 11:16
je préfères l'idée de Alain_42.
Cependant, je ne sais pas comment le faire voila le problème et je dois l'avoir fini pour vendredi soir prochain ce problème....

Je comprends ton idée, j'étais parti sur ça à la base, mais c'est le fait de devoir récupérer les lignes une par une que je n'arrive pas à faire pour effectuer l'insertion dans la bdd. Je ne trouves pas la bonne boucle.
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
10 juin 2012 à 15:28
qqqs détails complémentaires:
<?php
if(isset($_POST['enregistrer'])){
	//connexion BDD
	//enr dans table commandes
	$query="INSERT INTO commandes .................."
	$insert=mysql_query($query);
	if($insert){
		$id_insert_cde=mysql_insert_id();
	}
	//boucle sur les produits
	for($p=0:$p<sizeof($_POST['lib_produit']);$p++){
		$lib_produit=mysql_real_escape_string($_POST['lib_produit'][$p];
		$prix_produit=mysql_real_escape_string($_POST['prix_produit'][$p];
		//etc...
		$query_p="INSERT INTO produits ........... $id_insert_cde .......$ref_produit....$qte_produit...";
		
	}


}



?>

// par exemple si ton formulaire generé grace à JS est de cette forme

produit 1 :<input type="texte" name="lib_produit[]" value="" />
<input type="texte" name="prix_produit[]" value="" /><br />
//ou tout autre champ
produit 2 :<input type="texte" name="lib_produit[]" value="" />
<input type="texte" name="prix_produit[]" value="" /><br />

....
 // OU 
 produit 1 :<input type="texte" name="lib_produit[0]" value="" />
<input type="texte" name="prix_produit[0]" value="" /><br />
//ou tout autre champ
produit 2 :<input type="texte" name="lib_produit[1]" value="" />
<input type="texte" name="prix_produit[1]" value="" /><br />
 

<input type="submit" name="enregistrer" value="Enregistrer" />
0
patrice86 Messages postés 1380 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 17 décembre 2024 125
10 juin 2012 à 16:13
J'ai trouvé une solution pour le formulaire.
J'utilise AJAX pour éxécuter un fichier .php qui affiche une ligne.

A chaque fois que je clique sur un bouton, une ligne apparait.
Or problème, la 1ére apparait bien en dessous mais après les autres lignes apparaissent l'une a côté de l'autre (pas pratique du tout !)

donc comment faire un saut de ligne dans mon js ?

Voici la ligne qui pose problème
document.getElementById('ajout').innerHTML += ajax.responseText;
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
10 juin 2012 à 16:55
pourquoi Ajax ?
Ajax permet d'aller chercher des infos sur le serveur, ce n'est pas nécessaire dans ton cas, ce ne sont que des codes html d' input

ci joint un exemple d'ajout de champ avec JS, ce code a juste un pb avec la partie suppression d'une ligne si on clique sur une croix autre que la dernière ligne (tu supprimes cette fonctionalité ??):

<html>
<head>
<title>Document sans nom</title>
<script language="javascript">
<!--
function create_champ(i){
var i2 = i + 1;
    document.getElementById('input_'+i).innerHTML = '<div id="champs_'+i+'"><tr><td>Période.'+i+'</td><td><input type="text" name="in['+i+']" id="in_'+i+'" maxlength="12" onClick="javacript:transpo('+i+')" /></td><td><input name="out['+i+']" id="out_'+i+'" type="text" maxlength="12"/></td><td><input name="prix['+i+']" id="prix_'+i+'" type="text"/></td><td><input type="button" value="X" onClick="javascript:supr_champ('+i+')"></td></tr></div>';
    document.getElementById('input_'+i).innerHTML += (i <= 100) ? '<span id="input_'+i2+'"><input class="input2" type="button" onClick="javascript:create_champ('+i2+')" value="Ajouter une période"></span>' : '';
    document.getElementById('in_'+i).value = document.getElementById('out_'+(i-1)).value;
    document.getElementById('nombre').value = i;
}

function supr_champ(i){
  var Parent;
  var Obj = document.getElementById ( 'input_'+i) ;
  if( Obj)      
    Parent = Obj.parentNode;      
    if( Parent)
      Parent.removeChild( Obj);
}

function transpo(i) {
    document.getElementById('in_'+i).value = document.getElementById('out_'+(i-1)).value;
}
-->
</script>
</head>
<body>
<form name="palala">
<table width="400">
    <tr>
        <th width="20%">Période</th>
        <th width="20%">Date de début</th>
        <th width="20%">Date de fin</th>
        <th width="20%">Prix</th>
        <th width="20%">Effacer</th>
    </tr>
    <tr>
        <td>Période.1</td>
        <td><input type="text" name="in[1]" id="in_1" maxlength="12" value="" /></td>
        <td><input type="text" name="out[1]" id="out_1" maxlength="12" value="" /></td>
        <td><input type="text" name="prix[1]" id="prix_1" maxlength="12" value="" / ></td>
        <td>-</td>
    </tr>
    <div id="champs_1"></div>
    <tr>
        <td colspan="5"><span id="input_2"><input name="button" type="button" class="input2" onClick="javascript:create_champ(2)" value="Ajouter une période"></span></td>
    </tr>
</table>
Nombre de champs : <input name="nombre" id="nombre" type="text" value="1" disabled size="3">
</form>
</body>
</html>
0
patrice86 Messages postés 1380 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 17 décembre 2024 125
Modifié par patrice86 le 10/06/2012 à 17:01
Ajax fonctionne parfaitement et je le comprends.
Je viens d'essayer de comprendre ton code mais trop 'lourd' si je puis dire. Je dois le présenter devant un jury, si je ne le maîtrise pas, je suis coincé.... :/

Avec ma fonction ajax, j'appel un fichier .php qui affiche mes lignes, après j'ai un soucis c'est que je n'arrives pas à les insérer l'une à côté de l'autre
Voir question ici: https://forums.commentcamarche.net/forum/affich-25353442-js-saut-de-ligne-impossible#p25353442

Ensuite, faudra que j'arrives à récupérer les valeurs une par une pour les insérer dans la table de la bdd (quel galère le web, vive le java)

Merci pour ton aide Alain ! mais malheureusement j'ai déjà trouvée un bout de solution =)
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
10 juin 2012 à 17:39
je ne suis toujours pas convaincu de l'utilité d'Ajax

mais bon essayes avec:

document.getElementById('ajout').value += '<br />'+ajax.responseText;


et quel est le code des input retournés par ajax ?
0
patrice86 Messages postés 1380 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 17 décembre 2024 125
10 juin 2012 à 17:43
Avec value, ça ne fonctionne pas. Je ne comprend pas pk
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
Modifié par Alain_42 le 10/06/2012 à 18:37
tiens je t'ai fait qq chose de plus simple, avec des commentaires, avec ça tu dois pouvoir donner toutes explications à ton jury, si besoin je peux te donner + d'infos:
pour plus d'infos sur JS et les table HTML vas voir cette page:
http://www.siteduzero.com/tutoriel-3-209615-maitriser-les-tableaux-html-avec-javascript.html

<html> 
<head> 
<title>Insertion de lignes en JS</title> 
<script type="text/javascript"> 
<!-- 
//init variable JS globale, elle conserve sa valeur entre chaque appel de la fonction 
//c a d après le premier appel elle va passer à 1 etc... 
i=0; 
function create_champ(){ 
 //on increment la variable globale i, numero de produit 
 i++;  
 // en JS on peut atteindre les elements de la page HTML par document.getElementById 
 // creation de l'objet tableau avec lequeml on va travailler 
    var obj_tableau=document.getElementById("tableau_produits");  
 //lecture des lignes du tableau actuel, JS le met dans un array 
 var arrayLignes = obj_tableau.rows; 
 //pour avoir le nombre de lignes, avec  .length on a la taille de l'array 
 var nbr_de_lignes=arrayLignes.length; 
 //on insere une nouvelle ligne de tableau juste avant celle contenant le bouton 
 var nouvelleLigne = obj_tableau.insertRow(nbr_de_lignes-1); 
 //ensuite on remplit chacune des cellules <td></td> du tableau avec les input 
 var colonne1=nouvelleLigne.insertCell(0); 
 colonne1.innerHTML="Produit "+i; 
 var colonne2=nouvelleLigne.insertCell(1); 
 colonne2.innerHTML='<input type="text" name="lib_produit['+i+']" value="" />'; 
 var colonne3=nouvelleLigne.insertCell(2); 
 colonne3.innerHTML='<input type="text" name="qte_produit['+i+']" value="" />'; 
 var colonne4=nouvelleLigne.insertCell(3); 
 colonne4.innerHTML='<input type="text" name="prix_produit['+i+']" value="" />'; 
 //tu peux rajouter des colonnes, modifier le name, mais garde sa forme name="lib_produit['+i+']" 
 //ainsi tu pourra facilement récuper par $_POST['lib_produit'] qui est un array, donc boucler pour insertiondans BDD 
} 
--> 
</script> 
</head> 
<body onload="javascript:create_champ();"> 
<!-- au chargement de la page on ajoute la premiere ligne produit --> 
<form name="form_ajaout_cde" method="post" action="" > 
<table width="800" id="tableau_produits" > 
    <tr> 
        <th>Produit</th> 
        <th>Libelle</th> 
        <th>Quantité</th> 
        <th>Prix</th> 
         
    </tr> 
    <tr> 
        <td colspan="4"> 
   <input name="button" type="button" class="input2" onClick="javascript:create_champ()" value="Ajouter une ligne produit"> 
  </td> 
    </tr> 
</table> 

</form> 
</body> 
</html>
0
patrice86 Messages postés 1380 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 17 décembre 2024 125
Modifié par patrice86 le 11/06/2012 à 11:56
beaucoup plus clair et j'ai compris =)
De plus, cela fonctionne très bien.

Seulement, a la place d'un input pour le libelle, il faudrait que j'ai une liste déroulante avec tout les produits. j'ai créer ceci dans un fichier .php, mais comment faire pour l'appeler lors de la création des lignes à la place du input ?

j'ai bien penser à faire une fonction en AJAX qui appelle le fichier puis d'appeler cette fonction dans ton code, mais ça ne fonctionne pas.
0
patrice86 Messages postés 1380 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 17 décembre 2024 125
11 juin 2012 à 13:56
Travail en MP et e-mail.

Je t'es envoyé les infos par message privé.
0