Affichage tableau à 2 dimensions (Catégories et Produits)

Résolu/Fermé
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013 - Modifié par rogers75017 le 2/03/2013 à 14:21
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013 - 3 mars 2013 à 23:25
Bonjour,
Je m'arrache les cheveux pour afficher un tableau.
J'aimerai qu'il soit classé par catégories, et que les catégories ne s'affichent que si un produits de cette catégorie est choisi.

Le tableau initial est complété depuis une base de donnée, dont voici le code choix produits.php :

<form method="post" action="founitures_recap.php">  

<div id="tableau">  
<table width="100%">  

<thead>  
<tr>  
<th scope="col">DOCUMENTS</th>  
<th scope="col">APERÇU</th>  
<th scope="col">CONDITIONNEMENT</th>  
<th scope="col">MAXI<br>AUTORISÉ</th>  
<th scope="col">QUANTITÉ<br>SOUHAITÉE</th>  
</tr>  
</thead>  

<tbody>  

<?php  
$nbr_cat = 0; //incrémente le nbr de catégories  
$nbr_fourni = 0; //incrémente le nbr de fournitures  

//On selectionne les categories  
while ($cat = mysql_fetch_array($fournitures_cat))    
{  
echo '<tr >  
<td colspan="5" class="fbleuclair" align="center">'.$cat['nom_fournit_cat'].'</td>  
</tr >';  

//On selectionne les fournitures de la categorie en cours  
$fournitures_liste_cat = mysql_query("SELECT * FROM fournitures_liste WHERE id_f_cat='".$cat['id_f_cat']."' AND online_f = 'on' ORDER BY id_f_cat ASC");  

 while($contenu = mysql_fetch_array($fournitures_liste_cat))  
 {  
 ?>  
    <tr >  
 <th scope="row" class="fblanc" align="left"><?php echo $contenu['nom_fournit']?></th>  
 <th scope="row" class="fblanc" align="center"><a href=""><img src="../images_fournitures/petites/<?php echo $contenu['image_f']?>" style="border: 1px solid #CCCCCC;"></a>   
 </th>  
 <th scope="row" class="fblanc" align="center"><?php echo $contenu['condit_f']?></th>  
 <th scope="row" class="forangeclair" align="center"><?php echo $contenu['max_cde_f']?></th>  
 <th scope="row" class="fvert" align="center">  
 <input name="qte_<?php echo $nbr_fourni ?>" type=text class="inptableautext" value="">   
 </th>  
 </tr>  
 </tbody>  
    <input type ="hidden" name ="nom_fournit_<?php echo $nbr_fourni ?>" value =" <?php echo $contenu['nom_fournit'] ?>">  
    <input type ="hidden" name ="image_f_<?php echo $nbr_fourni ?>" value =" <?php echo $contenu['image_f'] ?>">  
    <input type ="hidden" name ="condit_f_<?php echo $nbr_fourni ?>" value =" <?php echo $contenu['condit_f'] ?>">  
    <input type ="hidden" name ="max_cde_f_<?php echo $nbr_fourni ?>" value =" <?php echo $contenu['max_cde_f'] ?>">  
 <input type="hidden" name="catqt_<?php echo $nbr_fourni ?>" value="<?php echo $nbr_cat;?>">  
    <input type="hidden" name="categorie<?php echo $nbr_cat ?>" value="<?php echo $cat['nom_fournit_cat'];?>">  
 <?php   
 $nbr_fourni++;  
 }  
$nbr_cat++;  
}  
?>  
</table>  

<input type="hidden" name="nbr_cat" value="<?php echo $nbr_cat;?>">  
<input type="hidden" name="nbr_fourni" value="<?php echo $nbr_fourni;?>">  

<p align="center"><input type="submit" id="valider" name="submit_achat_fournitures" value=""></p>  

</form>


Je récupère le formulaire sur la page confirm.php avec le code suivant :
<form method="post" action="<?php $_SERVER['PHP_SELF'] ?> ">  

<div id="tableau">  
<table width="100%">  
<thead>  
<tr>  
<th scope="col">DOCUMENTS</th>  
<th scope="col">APERÇU</th>  
<th scope="col">CONDITIONNEMENT</th>  
<th scope="col">MAXI<br>AUTORISÉ</th>  
<th scope="col">QUANTITÉ<br>SOUHAITÉE</th>  
</tr>  
</thead>  
<?php  
$nbr_cat = $_POST['nbr_cat'];  
$nbr_fourni = $_POST['nbr_fourni'];  

  for ($nf=0; $nf < $nbr_fourni;$nf++) {  
  $cat_info[$nf] = array (  
  $catqt = $_POST['catqt_'.$nf],  
  $nom_categorie = $_POST['nom_categorie_'.$nf],  
  $nom_fournit = $_POST['nom_fournit_'.$nf],  
        $image_f = $_POST['image_f_'.$nf],  
        $condit_f = $_POST['condit_f_'.$nf],  
        $max_cde_f = $_POST['max_cde_f_'.$nf],  
   $qte = $_POST['qte_'.$nf]);  
    
  if ($qte <> '' ){  
    echo '<tr><td colspan="5" class="fbleuclair" align="center">'.$nom_categorie.'</td></tr >';  
    echo '<tr><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th></tr>';  
    }  
  }  

?>  
</table>  
<p align="center">  
<input type="submit" id="modifier" name="submit_modif_fournitures" value="">  
<input type="submit" id="confirmer" name="submit_confirm_fournitures" value="">  
</p>  

</div>  
</form>


J'aimerai que les différentes catégories n'apparaissent qu'une seule fois, et uniquement si un produit de la catégorie est choisi.
Je pense qu'il faudrait réaliser 2 boucles imbriquées (dans confirm.php, en remplacement), une pour afficher les catégories qui contiennent des produits sélectionnés dans le précédent tableau, et une seconde boucle pour afficher les produits eux-mêmes...

SAUF QUE JE NE SAIS PAS FAIRE CA ! :-(

Un sauveur, ici ???? :-))))
A voir également:

12 réponses

rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013
2 mars 2013 à 16:45
Un p'tit up...

Personne n'a d'idées ?
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 3/03/2013 à 14:44
salut, une solution, je n'ai pas testé il peut y avaoir des fautes de frappe, des oublis de ) ou autre:

<form method="post" action="founitures_recap.php">    
<div id="tableau">    
<table width="100%">    

<thead>    
<tr>    
<th scope="col">DOCUMENTS</th>    
<th scope="col">APERÇU</th>    
<th scope="col">CONDITIONNEMENT</th>    
<th scope="col">MAXI<br>AUTORISÉ</th>    
<th scope="col">QUANTITÉ<br>SOUHAITÉE</th>    
</tr>    
</thead>    

<tbody>    
<?php  
//On selectionne les categories    
while ($cat = mysql_fetch_array($fournitures_cat))      
{    
 echo '<tr >    
 <td colspan="5" class="fbleuclair" align="center">'.$cat['nom_fournit_cat'].'</td>    
 </tr >';    
 //On selectionne les fournitures de la categorie en cours    
 $fournitures_liste_cat = mysql_query("SELECT * FROM fournitures_liste WHERE id_f_cat='".$cat['id_f_cat']."' AND online_f = 'on' ORDER BY id_f_cat ASC");    

  while($contenu = mysql_fetch_array($fournitures_liste_cat))    
  {    
?>    
  <tr >    
   <th scope="row" class="fblanc" align="left"><?php echo $contenu['nom_fournit']?></th>    
   <th scope="row" class="fblanc" align="center"><a href=""><img src="../images_fournitures/petites/<?php echo $contenu['image_f']?>" style="border: 1px solid #CCCCCC;"></a>     
   </th>    
   <th scope="row" class="fblanc" align="center"><?php echo $contenu['condit_f']?></th>    
   <th scope="row" class="forangeclair" align="center"><?php echo $contenu['max_cde_f']?></th>    
   <th scope="row" class="fvert" align="center">    
   <?php  
   //on va mettre a l'input un name de la forme qte[][]  
   echo '<input name="qte['.$cat['nom_fournit_cat'].']['.$contenu['nom_fournit'].']" type=text class="inptableautext" value="" /> ';  
   ?>  
   </th>    
   </tr>    
       
   <?php  
   //idem pour les name des chanps cachés  
   echo ' <input type ="hidden" name ="nom_fournit_<?php echo $nbr_fourni ?>" value ="'.$contenu['nom_fournit'].'" />';    
   echo '<input type ="hidden" name ="image_f['.$cat['nom_fournit_cat'].']['.$contenu['nom_fournit'].']" value ="'.$contenu['image_f'].'" />';    
   echo '<input type ="hidden" name ="condit_f['.$cat['nom_fournit_cat'].']['.$contenu['nom_fournit'].']" value ="'.$contenu['condit_f'].'" /> ';   
   echo ' <input type ="hidden" name ="max_cde_f['.$cat['nom_fournit_cat'].']['.$contenu['nom_fournit'].']" value ="'.$contenu['max_cde_f'].'" />';        
  }    
}    
?>  
 </tbody>    
</table>    
<p align="center"><input type="submit" id="valider" name="submit_achat_fournitures" value="Valider" /></p>    

</form>  



Je récupère le formulaire sur la page confirm.php avec le code suivant :  

<form method="post" action="<?php $_SERVER['PHP_SELF'] ?> ">    

<div id="tableau">    
<table width="100%">    
<thead>    
<tr>    
<th scope="col">DOCUMENTS</th>    
<th scope="col">APERÇU</th>    
<th scope="col">CONDITIONNEMENT</th>    
<th scope="col">MAXI<br>AUTORISÉ</th>    
<th scope="col">QUANTITÉ<br>SOUHAITÉE</th>    
</tr>    
</thead>    
<?php   
//comme on a mis le name de l'input de la forme qte[cat][fourniture]   
//on recupère $_POST['qte'] sous la forme d'un array à deux dimensions contenant uniquement les valeurs rentrées  
//idem pour les champs cachés  
//il suffit parcourir l'array et de n'afficher que les cat ayant des fournitures  

if(sizeof($_POST['qte'])>0){  
 foreach($_POST['qte'] as $cat=>$fournitures){  
  //$cat est l'index premiere dimension de l'array, $fournitures est l'array deuxieme dimension  
  //il faut afficher la cat que si il y a des fourniture donc seulement si taille de l'array $founitures >0  
  if(sizeof($fournitures)>0){  
   //on affiche la cat  
    echo '<tr><td colspan="5" class="fbleuclair" align="center">'.$cat.'</td></tr >';   
   //on affiche les fournitures en parcourant l'array $fournitures  
   //et en utilisant les index de cet array pour lire les array des champs cachés  
   foreach($fournitures as $fourniture=>$value){  
    $nom_fournit = $_POST['nom_fourni'][$cat][$fourniture];    
    $image_f = $_POST['image_f'][$cat][$fourniture];    
    $condit_f = $_POST['condit_f'][$cat][$fourniture];    
    $max_cde_f = $_POST['max_cde_f'f][$cat][$fourniture];    
    $qte = $value;    
    echo '<tr><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th></tr>';    
   }  
  }  
 }  
}  

?>    
</table>    
<p align="center">    
<input type="submit" id="modifier" name="submit_modif_fournitures" value="Modifier" />    
<input type="submit" id="confirmer" name="submit_confirm_fournitures" value="Confirmer /">    
</p>    

</div>    
</form>  

0
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013
3 mars 2013 à 15:54
Merci pour cet espoir :-)
Depuis maintenant 4 jours, je m'acharne là-dessus sans vraiment me reposer... mais j'y pige absolument rien à ces boucles :-(

Je teste de suite :-))))))))
0
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013
Modifié par rogers75017 le 3/03/2013 à 17:07
Whouaou...
Merci d'avoir pris le temps de vérifier mon code, c'est hyper sympa :-)
Les commentaires que tu as rajouté reflètent la nature même du problème et la solution pour y remédier...
Mais ça ne fonctionne pas, snifffff :-(
Je me retrouve avec un tableau comportant toutes les catégories, et autant de lignes (vides) qu'il y a de produits dans chaque catégorie sans tenir compte de la valeur de l'input "qte".
Le principe que tu m'as donné est surement la marche à suivre (je ne connaissais pas "sizeof"). Je vais parcourir le code voir s'il n'y a pas quelques petites erreurs qui se seraient glissées :-)
0

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

Posez votre question
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013
3 mars 2013 à 17:38
Une petite erreur de frappe qui faisait que les lignes produits étaient vides :
$nom_fournit = $_POST['nom_fournit'][$cat][$fourniture];  

Il manquait un "t" à "$_POST['nom_fournit'][$cat][$fourniture];
Sauf qu'il ne tient toujours pas compte de la qte et affiche tout le tableau.
Ca progresse :-)
0
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013
3 mars 2013 à 18:01
Lorsque je fais un écho du sizeof($_POST['qte']), il me donne toujours la valeur "6" (qui correspond en fait au nombre de catégories) quel que soit le nombre de produits choisis, 0 ou plusieurs...
Je continue de creuser (et de ramer, lol).
0
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013
Modifié par rogers75017 le 3/03/2013 à 20:20
Merci Alain-42,

La page choix produits.php telle que tu l'a modifié est ok.
Il fallait effectivement associer aux input les valeurs "catégories" et "produits".
C'était ma première erreur.

Sauf que je n'arrive toujours pas à obtenir un tableau Catégories/Produits, à savoir n'afficher la catégorie que si un produit est commandé, et afficher le ou les produis commandés sous la catégorie concernée.
Bon, je lâche un peu pour ce soir, mais preneur de toutes idées :-(
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
3 mars 2013 à 21:49
bonsoir,

au début de la page confirm.php
mets:

<?php
echo '<pre>';
print_r($_POST['qte'];
echo '</pre>';
?>


tu auras un aperçu de l'array que tu reçiot
0
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013
Modifié par rogers75017 le 3/03/2013 à 22:10
Bonsoir Alain,

Effectivement, j'ai déjà testé le contenu de $_POST['qte'] avec un print_r.
$_POST['qte'] contient bien la catégorie, le produit et la quantité (grace à ton intervention) mais je n'arrive pas à comprendre la condition
if(sizeof($_POST['qte']) > 0){   
puisque sizeof($_POST['qte'] devrait déterminer l'affichage du tableau (si je suis bien le raisonnement), mais donne toujours 6 comme résultat, qu'on choisisse ou pas des produits.
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
3 mars 2013 à 22:18
if(sizeof($_POST['qte'])>0){
à ce niveau la ça sert seulement a conditionner la boucle suivante foreach

si cela ne pose pas de pb de confidentialité peux tu me faire une copie de ce que donne le print_r($_POST['qte']
0
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013
Modifié par rogers75017 le 3/03/2013 à 22:30
Bien sûr... aucun problème.
Voici ce que ça donne :
Array ( [documents administratifs] => Array ( [Charte des droits et libertés de la personne accueillie] => [Courrier explicatif du prélèvement automatique] => [Autorisation de Prélèvement] => [Affiche Carte vitale] => [Livret d'accueil unique SSR et EHPAD] => [Contrat d'engagement contre la douleur (SSR)] => [Dossier de vie sociale « Aloïs »] => [Support service Accompagnant] => [Affiche service Accompagnant] => [Carnet de fiche contact] => [Documentation établissement (plaquette commerciale)] => [Plaquette régionale Poitou-Charentes] => [Plaquette régionale Ile-de-France] => [Papier Paie] => [Papier Entête] => [Carte correspondance résidence] => ) [documents de soins et médicaux] => Array ( [Registre des Stupéfiants] => [Fiches de distribution Médicaments] => [Registre de Chutes (établissements n'ayant pas Mediris)] => [Registre de contention] => [Questionnaire Médical d'entrée] => [Armoire à pharmacie] => ) [certification de service et documents service juridique] => Array ( [Affiche « Charte des engagements de service » EHPAD] => [Affiche « Charte des engagements de service » Sanitaire] => [Affiche « Charte des droits et libertés »] => [Brochure droit des résidents en EHPAD] => [Classeur Bonnes Pratiques] => ) [cadeau de bienvenue] => Array ( [Parfum FRAGONARD Cerisier (Femme)] => [Parfum FRAGONARD Cologne (Homme)] => ) [divers] => Array ( [Carnet de commande] => [Carnet Demande Intervention Technique] => [Livret d'accueil Salariés + dépliants handicapés + incendie] => [Gestion des risques dans nos éts : définitions et outils] => [Badges] => [Plaque 'Interdiction de fumer'] => [Carnets de 100 Tickets Repas du personnel] => ) [outils] => Array ( [Cartographie des Déchets] => [Quiz Savoir Vivre - Savoir être en Sanitaire et médico-social] => [Quiz S'entraîner à la Bienveillance en Ets Sanitaire] => [Quiz gérantologique] => [Jeu des 7 familles] => 5 ) ) 

J'ai 6 catégories et 46 produits au total. Comme tu peux le voir, j'ai indiqué 5 ex sur le dernier produit (Jeu des 7 familles) dans l'input qte.
En fait, la variable $_POST['qte'] est nickel.
C'est le traitement qui suit qui me chagrine :-(
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
3 mars 2013 à 22:38
ok, je pensait que seuls les index de l'array contenant une valeur étaient postés

essaies comme ça:

page confirm.php avec le code suivant :  

<form method="post" action="<?php $_SERVER['PHP_SELF'] ?> ">    

<div id="tableau">    
<table width="100%">    
<thead>    
<tr>    
<th scope="col">DOCUMENTS</th>    
<th scope="col">APERÇU</th>    
<th scope="col">CONDITIONNEMENT</th>    
<th scope="col">MAXI<br>AUTORISÉ</th>    
<th scope="col">QUANTITÉ<br>SOUHAITÉE</th>    
</tr>    
</thead>    
<?php   
//comme on a mis le name de l'input de la forme qte[cat][fourniture]   
//on recupère $_POST['qte'] sous la forme d'un array à deux dimensions contenant uniquement les valeurs rentrées  
//idem pour les champs cachés  
//il suffit parcourir l'array et de n'afficher que les cat ayant des fournitures  

if(sizeof($_POST['qte'])>0){  
 foreach($_POST['qte'] as $cat=>$fournitures){  
  //$cat est l'index premiere dimension de l'array, $fournitures est l'array deuxieme dimension  
  //il faut afficher la cat que si il y a des fourniture donc seulement si la somme des valeurs est supérieure à 0
  if(array_sum($fournitures)>0){  
   //on affiche la cat  
    echo '<tr><td colspan="5" class="fbleuclair" align="center">'.$cat.'</td></tr >';   
   //on affiche les fournitures en parcourant l'array $fournitures  
   //et en utilisant les index de cet array pour lire les array des champs cachés  
   foreach($fournitures as $fourniture=>$value){
		if($value>0){
   
			$nom_fournit = $_POST['nom_fournit'][$cat][$fourniture];    
			$image_f = $_POST['image_f'][$cat][$fourniture];    
			$condit_f = $_POST['condit_f'][$cat][$fourniture];    
			$max_cde_f = $_POST['max_cde_f'f][$cat][$fourniture];    
			$qte = $value;    
			echo '<tr><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th><th scope="col">'.$nom_fournit.'</th></tr>';    
		}
	}  
  }  
 }  
}  

?>    
</table>    
<p align="center">    
<input type="submit" id="modifier" name="submit_modif_fournitures" value="Modifier" />    
<input type="submit" id="confirmer" name="submit_confirm_fournitures" value="Confirmer /">    
</p>    

</div>    
</form>  
0
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013
3 mars 2013 à 22:46
:-)))))))))))))))))))))))))))))))))))))))))))))))))))))

Ca maaaaaaaaarche, bon sang de bon sang !!!!!!!!!!

Bon, on se calme, j'ai vu qu'il y avait un petit souci quand on commande certains produits mais ça ne doit pas être trop grave.

Pfffffffffff !!!!!

Merci des milliards de fois :-)))))))))))))))
0
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013
Modifié par rogers75017 le 3/03/2013 à 22:50
C'est fini pour ce soir, j'ai trop mal au crane et je ferai tous les tests demain :-)
Je te souhaite une excellente soirée :-)
0
rogers75017 Messages postés 22 Date d'inscription samedi 2 mars 2013 Statut Membre Dernière intervention 3 mars 2013
Modifié par rogers75017 le 3/03/2013 à 23:38
Finalement, j'ai pas pu résisté et j'ai testé.
Certains noms de produits contenaient des doubles quotes, d'où quelques problèmes dans le tableau !
Mais ta correction est top de top.

Encore merci de t'être penché sur mon problème, c'est vraiment sympa.
J'espère pouvoir rendre le même service de temps en temps aux autres développeurs "en herbe" qui galèrent comme moi.

Je marque le post en RESOLUUUUUUUUUUU :-)

Bonne semaine :-)
0