boucles imbriquées et affichage des valeurs cochées (checkbox)

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : boucles imbriquées et affichage des valeurs cochées (checkbox)

par pak77 » 08 nov. 2007, 18:58

Voilà j'ai suivi un premier conseil que je ne comprennais pas très bien et fini par comprendre
le fonctionnement de foreach. Je voulais essayer d'éviter mais je pense qu'au final c'est
la seule solution. Merci à vous, j'ai fait 2 boucles de foreach() plutôt que for()
foreach($_SESSION['panier']['id'] as $key => $lignes){  
    blabla...
    foreach($_SESSION['panier']['garniture'][$key] as $key2 => $lignes2){ 
         blabla...
    }
}
Désolée j'avais oublié de cloturer le sujet, trop satisfaite de ce résultat. Merci

par pak77 » 05 nov. 2007, 11:36

Et tu me suggères quoi pour faire cette modification?
$_SESSION['panier']['id'] = array(); 
$_SESSION['panier']['pain'] = array(); 
$_SESSION['panier']['sand'] = array(); 
$_SESSION['panier']['quantite'] = array(); 
modifier mes variables de session mais comment

par Berzemus » 05 nov. 2007, 11:26

print_r sert à afficher un tableau, pour une simple chaîne c'est mieux d'uiliser echo.

Je reverrais la façon dont est composé ton tableau..

A ce que je vois, le tien est composé comme ceci:

[id] => id1, id2, id3
[quantité] => q1, q2, q3
[prix] => p1, p2, p3
etc..

C'est horrible.

Esasye d'adopter une structure comme ceci:

[1] => id, quantité, prix, etc..
[2] => id, quantité, prix, etc..
[3] => id, quantité, prix, etc..

Ainsi, id, quantité et prix seront de simples chaînes, et une autre élément garnitures sera un tableau, beaucoup plus facile à manier.
Ton tableau gagnera largement en lisibilité.

boucles imbriquées?!?

par pak77 » 05 nov. 2007, 10:56

Bonjour, je constate que le prob doit venir de mes boucles.. surtout la première.
Si je commande une baguette avec 5 garnitures, il en affichera qu'une seule au départ, lors de l'ajout d'une seconde, une deuxième garniture sera affiché à la première baguette.. donc si $i=0 il me donne une garniture si $i=1, j'en ai deux; $i=2 j'en aurai trois. pourquoi $j est égale à $i
<?php
$nb_art = count($_SESSION['panier']['total']); 
for($i = 0; $i < $nb_art; $i++) { 
	  echo "<tr>";
		$id = $i;
		$id2 = $i+1;
		echo ("<td width='30' align='right' class='desc' bgcolor=#F8E8CC>".$id2."</td>");
		echo ('<input type="hidden" name="ref_article" value="'.$id.'">'); 
		echo ("<td width='10' align='right' class='desc'>&nbsp;</td>");
		echo ("<td width='30' align='center'>".$_SESSION['panier']['quantite'][$i]."</td> ");
		echo ("<td width='10' align='right' class='desc'>&nbsp;</td>");
		echo ("<td width='270'>".$_SESSION['panier']['sand'][$i]."</td>");
		echo ("<td width='70' align='right'>".$_SESSION['panier']['prix'][$i]." €</td>");
		echo ("<td width='70' align='right'>".number_format($_SESSION['panier']['total'][$i],2)." €</td>");
		echo ("<td width='80' align='center'><a href='commande.php?supprimer=oui&ref_article=".$id."'>supprimer</a></td>"); 
	  echo "</tr>";
	  echo ("<tr>");
		echo ("<td bgcolor=#F8E8CC>&nbsp;</td>");
		echo ("<td colspan=3>&nbsp;</td>");
		echo ("<td width='400' colspan=4 class='desc'>");
		  $nb_arti = count($_SESSION['panier']['garniture']);
		  for($j = 0; $j < $nb_arti; $j++) { 
			print_r ($_SESSION['panier']['garniture'][$i][$j]);
			echo ("&nbsp;"); 
		  }
		echo ("</td>");
		echo ("<td>&nbsp;</td>"); 
	  echo ("</tr>");
	  echo ("<td colspan='9' height='1' bgcolor='#CC6600'><img src='../images/spacer.gif' width='1' height='1'></td>");
} 
	  echo ("<tr bgcolor=#F8E8CC>");
		echo ("<td align='right' colspan='6'>Total de la commande : </td>");
		echo ("<td>&nbsp;</td>");
		echo ("<td align='right'>".number_format(montant_panier($montant),2)."&nbsp;€</td>");
		echo ("<td>&nbsp;</td>");
	  echo ("</tr>");
?> 
Donc j'ai suipprimé $i de print_r ($_SESSION['panier']['garniture'][$j]);
mais là j'ai tout mais en ARRAY

Code : Tout sélectionner

Array ( [0] => beurre [1] => salade [2] => tomates [3] => moutarde [4] => oeufs ) Array ( [0] => beurre )
et avec print_r ($_SESSION['panier']['garniture'][''][$j]);
je n'en vois aucune.

Si vous avez une solution pour les boucles imbriquées, merci d'avance.

par pak77 » 04 nov. 2007, 14:13

Désolée j'ai voulu réduire le script,
j'ai bien écrit
$nb_art = count($_SESSION['panier']['total']);  
for($i = 0; $i < $nb_art; $i++) {  
  $nb_arti = count($_SESSION['panier']['garniture']);
  for($j = 0; $j < $nb_arti; $j++) { 
     print_r ($_SESSION['panier']['garniture'][$i][$j]);
     echo ("&nbsp;"); 
  }
}
Toutes les garnitures finiront pas s'afficher s'il ajoute des baguettes mais c'est bien trompeur
que ça ne s'affiche pas dès le début.

Merci

par Berzemus » 04 nov. 2007, 13:55

C'est bien dans ce script qu'il y a un problême alors:
$nb_art = count($_SESSION['panier']['total']); 
for($i = 0; $i < $nb_art; $i++) { 
  $nb_arti = count($_SESSION['panier'][garn]);
  for($j = 0; $j < $nb_arti; $j++) { 
    print_r ($_SESSION['panier'][garn][$i][$j]);
    echo ("&nbsp;"); 
  }
} 
Il ne faudrait pas remplacer garn par "garniture" ?

par pak77 » 04 nov. 2007, 13:37

En gros j'ai fait comme le script de ce forum "quelques tutos basiques..."
mais j'ai un troisième niveau à mon panier..
function ajout($select) { 
    $ajout = false; 
  if(!isset($_SESSION['panier'])) { 
    $_SESSION['panier'] = array(); 
    $_SESSION['panier']['id'] = array(); 
    $_SESSION['panier']['sand'] = array(); 
    $_SESSION['panier']['quantite'] = array(); 
    $_SESSION['panier']['prix'] = array(); 
    $_SESSION['panier']['total'] = array(); 
    $_SESSION['panier']['garniture'] = array(); 
  } 
$select = array(); 
$select['id'] = $_GET['id_article']; 
$select['sand'] = $_GET['nom']; 
$select['quantite'] = $_GET['quantite']; 
$select['prix'] = $_GET['prix']; 
$select['total'] = ($_GET['prix'] * $_GET['quantite']); 
$select['garniture'] = $_GET['garniture']; 
         if(!verif_panier($select['id'])) { 
	array_push($_SESSION['panier']['id'],$select['id']); 
	array_push($_SESSION['panier']['sand'],$select['sand']); 
	array_push($_SESSION['panier']['quantite'],$select['quantite']); 
	array_push($_SESSION['panier']['prix'],$select['prix']); 
	array_push($_SESSION['panier']['total'],$select['total']); 
	array_push($_SESSION['panier']['garniture'],$select['garniture']); 
           $ajout = true; 
        } 
     } 
    return $ajout; 
} 
Donc $nb_art compte le nombre d'article (en l'occurence baguette)
et $nb_arti les garnitures voulues.

Alors une première page où on a les choix de baguette, s'affiche une seconde page avec le prix, la quantité désirée et le checkbox des garnitures. On ajoute et hop une page commande où saffiche le panier et où je constate le prob de garnitures qui ne s'affichent pas. Pourant si je fais printr ($_SESSION);

Code : Tout sélectionner

Array ( [panier] => Array ( [id] => Array ( [0] => 19 ) [sand] => Array ( [0] => Le Liegeois ) [quantite] => Array ( [0] => 2 ) [prix] => Array ( [0] => 3.00 ) [total] => Array ( [0] => 6 ) [garniture] => Array ( [0] => Array ( [0] => beurre [1] => salade [2] => tomates ) ) ) )
Mais comme je disais une seule s'affiche et les autres s'afficheront qu'en ajoutant d'autre baguette :(

par Berzemus » 04 nov. 2007, 13:13

salut,

Il faudrait peut-être mieux détailler ce que tu fais..

Qu'est-ce que tu fais avec $select['garniture'], et qu'est-ce qui se trouve dans $_SESSION['panier'], et comment est-ce généré ?

Bref, plus de détails sur ton script, et on pourra mieux te conseiller.

boucles imbriquées et affichage des valeurs cochées (checkbo

par pak77 » 04 nov. 2007, 13:00

Bonjour, j'ai un petit problème pour récupérer les valeurs sélectionnées par l'utilisateur.
J'ai une page de formulaire avec le code suivant pour les checkbox

Code : Tout sélectionner

<tr><td><input type="checkbox" name="garn[]" value="beurre">&nbsp;&nbsp;beurre</td></tr> <tr><td><input type="checkbox" name="garn[]" value="salade">&nbsp;&nbsp;salade</td></tr> <tr><td><input type="checkbox" name="garn[]" value="tomates">&nbsp;&nbsp;tomates</td></tr> <tr><td><input type="checkbox" name="garn[]" value="mayonnaise">&nbsp;&nbsp;mayonnaise</td></tr>
que je récupère dans un panier avec (la garniture étant au troisième niveau du panier)
$select['garniture'] = $_GET['garniture'];
qui est affiché dans une page de commande
$nb_art = count($_SESSION['panier']['total']); 
for($i = 0; $i < $nb_art; $i++) { 
  $nb_arti = count($_SESSION['panier'][garn]);
  for($j = 0; $j < $nb_arti; $j++) { 
    print_r ($_SESSION['panier'][garn][$i][$j]);
    echo ("&nbsp;"); 
  }
}
Si toutes les cases sont cochés lors du premier affichage de la page commande, qu'un seul sera affiché. Lors du second affichage (après ajout d'un autre article), il en aura deux.. au troisième affichage, trois.. etc etc

P.S. je dois obligatoirement ajouter un article au panier pour que les garnitures inaffichées s'affichent.
Donc on commande :
baguette jambon avec beurre, salade, mayo et quand on ajoute au panier, ça affiche que baguette jambon avec beurre.
On ajoute une seconde baguette fromage avec rien. Ca affiche
baguette jambon avec beurre, salade
baguette fromage

Je ne comprends pas que si plusieurs sont sélectionnés qu'ils ne s'affichent pas tous du premier coup.

Si quelqu'un a une idée. Merci de m'en faire part.