Memoire Session

Eléphanteau du PHP | 18 Messages

25 mars 2008, 13:01

Je viens de créer une boutique en ligne et plus particulièrement un page comande express, les revendeur peuvent avoir accés à la liste des collections et cocher les produits qu'il veulent avant de cliquer sur viosionner la commande et envoyer un mail avec la commande passée.

J'ai donc plusieurs page concernant des collections differentes (colelction homme, femme, enfants...etc).
Chaque pages sont contituées de la liste des produits de la collection en question avec pour chacun, une checkbox et les couleurs et tailles les concernants.

Se que je voudrais faire, c'est choisir ces produits dans une collection, mettre en memoire session les produit coché lorsqu'on clique sur le lien d'une autre collection.
Se qui permetterai de passer d'une collection à l'autre en gardant en memoire tous les produits déjà selectionnés.

Comment je peux faire ca, j'ai vu comment fonctionne la mise en mémoire dans la session d'une variable, mais il faut valider un fomulaire pour faire la mise en memoire non?

Je laisse une de mes pages colelction pour montrer comment est formé ma page:

Code : Tout sélectionner

<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN"> <html <?php echo HTML_PARAMS; ?>> <head> <meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>"> <title><?php echo TITLE; ?></title> <base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>"> <link rel="stylesheet" type="text/css" href="stylesheet.css"> </head> <body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0"> <tr> <td width="720"> <table border="0" cellpadding="0" cellspacing="0"> <!-- header //--> <?php require(DIR_WS_INCLUDES . 'header.php'); ?> <!-- header_eof //--> </table> </td> </tr> <tr> <td width="720"> <!-- body //--> <table align="center" border="0" width="720" cellspacing="0" cellpadding="0"> <tr> <!-- body_text //--> <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td><table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td align="center" class="pageHeading" height="18" width="200"><?php echo HEADING_TITLE; ?></td> <td class="pageheadingFonce" height="18" width="520"></td> </tr> </table></td> </tr> <tr> <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '3'); ?></td> </tr> <tr> <td><table border="0" width="100%" cellspacing="0" cellpadding="2"> <tr> <td class="main"><?php echo TEXT_INFORMATION; ?></td> </tr> </table></td> </tr> <tr> <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '3'); ?></td> </tr> <tr> <td> <?php echo tep_draw_form('directbuy', tep_href_link(FILENAME_DIRECTBUY_CONFIRM), 'post'); ?> <table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td colspan="6"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td class="main" align="center" width="178" height="25"><a class="directbuy" href="directbuy_femme.php" title="Collection Femme">Collection Femme</a></td> <td width="3" height="15"></td> <td class="main" align="center" width="178" height="25"><a class="directbuy" href="directbuy_homme.php" title="Collection Homme">Collection Homme</a></td> <td width="3" height="15"></td> <td class="main" align="center" width="178" height="25"><a class="directbuy" href="directbuy_enfant.php" title="Collection Enfant">Collection Enfant</a></td> <td width="3" height="15"></td> <td class="main" align="center" width="178" height="25"><a class="directbuy" href="directbuy_accessoire.php" title="Collection Accessoires">Accessoires</a></td> </tr> </table> </td> </tr> <tr> <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '3'); ?></td> </tr> <tr> <td class="main" colspan="6" height="10"></td> </tr> <tr> <td class="titre_directbuy" colspan="6" height="25" align="center">COLLECTION HOMME</td> </tr> <tr> <td class="main" colspan="6" height="10"></td> </tr> <tr> <td class="main" align="center"><?php echo DIRECTBUY_CHECK; ?></td> <td class="main" align="center"><?php echo DIRECTBUY_REF; ?></td> <td class="main" align="center"><?php echo DIRECTBUY_PRODUCT; ?></td> <td class="main" align="center"><?php echo DIRECTBUY_COLOR; ?></td> <td class="main" align="center"><?php echo DIRECTBUY_SIZE; ?></td> <td class="main" align="center"><?php echo DIRECTBUY_QUANTITY; ?></td> </tr> <tr> <td class="main" colspan="6" height="10"></td> </tr> <?php $request = tep_db_query("SELECT c.parent_id, pd.products_id, pd.products_name, p.products_ref, p.products_price, s.specials_new_products_price, taille.products_options_values_id, couleur.products_options_values_id, couleur.products_options_values_name AS couleur, taille.products_options_values_name AS taille, pa.options_values_price, ( pa.options_values_price + p.products_price ) AS final_price, (pa.options_values_price + s.specials_new_products_price ) AS final_price_promo FROM products_stock ps, products_description pd LEFT JOIN specials s USING(products_id), products_options_values couleur, products_options_values taille, products_attributes pa, products p, products_to_categories p2c, categories c WHERE pd.products_id = ps.products_id AND pd.products_id = pa.products_id AND pd.products_id = p.products_id AND p2c.products_id = pd.products_id AND p2c.categories_id = c.categories_id AND c.parent_id = 2 AND SUBSTRING( ps.products_stock_attributes FROM 3 FOR 2 ) = couleur.products_options_values_id AND SUBSTRING( ps.products_stock_attributes FROM 8 FOR 2 ) = taille.products_options_values_id AND pa.options_values_id = taille.products_options_values_id ORDER BY pd.products_name, couleur.products_options_values_id, taille.products_options_values_id "); while($data = mysql_fetch_assoc($request)) { if ($data['final_price_promo'] == '') { $final_price = $data['final_price']; } else { $final_price = $data['final_price_promo']; } echo '<tr> <td class="directbuy" width="90" align="center"><input type="checkbox" name="select[]" value="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '-' . $data['products_name'] . '-' . $data['taille'] . '-' . $data['couleur'] . '-' . $final_price . '" /></td> <td class="directbuy_ref" width="50">' . $data['products_ref'] . '</td> <td class="directbuy_nom" width="260">' . $data['products_name'] . '</td> <td class="directbuy" width="130" align="center">' . $data['couleur'] . '</td> <td class="directbuy" width="90" align="center">' .$data['taille'] . '</td> <td class="directbuy_check" width="100" align="center"><input class="quantite" type="text" name="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '" /></td> </tr>'; } ?> <tr> <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '3'); ?></td> </tr> </table> </td> </tr> <tr> <td><table border="0" width="100%" cellspacing="0" cellpadding="0" class="infoBox"> <tr class="infoBoxContents"> <td><table border="0" width="100%" cellspacing="0" cellpadding="2"> <tr> <td width="10" class="main"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> <td class="main" align="right"><?php echo tep_image_submit('button_visionner_commande.gif', IMAGE_BUTTON_VISIONNER_COMMANDE); ?></td> <td width="10" class="main"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> </tr> </table></form></td> </tr> </table></td> </tr> </table></td> <!-- body_text_eof //--> <!-- body_eof //--> </td> </tr> <tr> <td height="3"></td> </tr> <tr> <td width="720"> <table border="0" cellpadding="0" cellspacing="0"> <!-- footer //--> <?php require(DIR_WS_INCLUDES . 'footer.php'); ?> <!-- footer_eof //--> </table> </td> </tr> </body> </html> <?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>

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

25 mars 2008, 13:54

Effectivement, il faut bien à un moment donné informer les serveur des produits sélectionner pour qu'il puisse les stocker en session :)

Le plus simple est effectivement un bouton permettant de valider le formulaire et envoyant la liste des cases cochées au serveur.
Pour un confort de l'utilisateur, tu peux faire cela grace à du javascript (via Ajax) en soumettant le formulaire sans recharger la page.

Sinon, il te faut, lorsque l'utilisateur change de collection, envoyer les données sélectionnées (à priori via l'url, ce qui n'est pas terrible puisque limité en taille) et profiter de l'appel au serveur pour enregistrer les données avant le chargement de l'autre page...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 18 Messages

25 mars 2008, 14:13

merci pour ta reponsde, aurais-tu une idee en ajax pour valider un formulaire sans recharger la page?

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

25 mars 2008, 14:57

Euh.... oui... bien sur... il te suffit de soumettre le formulaire avec ajax, sans recharger la page... mais curieusement, j'ai l'impression que ce n'est pas la réponse que tu attendais :roll:

Peut être faudrait-il commencer par regarder ce qu'est Ajax et comment ça fonctionne, le reste devrait te venir naturellement :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 18 Messages

26 mars 2008, 13:39

Après quelques essai, il me faudrais quelque renseignements sur la methode que tu m'a conseillé:

J'ai fais ceci en debut d'une de mes pages pour les essais:

Code : Tout sélectionner

if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else if (window.ActiveXObject) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } //envoyer les donnees au server xhr.open('POST', 'http://www.mon_site.fr/mon_fichier.php', true); xhr.setRequestHeader("Content-Type", "text/html; charset="CHARSET);



Mais de cette façon rien ne s'affiche.
Pourant si j'ai bien compris la je soumets le formulaire qui est contenu dans mon_fichier.php non??

Eléphanteau du PHP | 18 Messages

27 mars 2008, 17:36

J'ai trouver comment gérer la validation du formulaire en l'envoie sur la page suivante qui me convient (utilisation d'une fonction javascript).

Mais j'ai un autre petit problème de debutant,
lorsque je choisis des produit dans ma liste, et que je clique par exemple sur visionner ma commande je suis redirigé sur un récapitulatif de ma commande, la variable qui à été envoyé est sous forme de tableau je les récupère donc de la sorte:

Code : Tout sélectionner

$prix_total=0; foreach ( $_POST["select"] AS $value ){ $data = explode("-", $value); if ((!empty($_POST[$data[0]])) && ($_POST[$data[0]] != 0)) { $prix= $data[4] * $_POST[$data[0]]; $prix_total += $prix; $prix_unitaire= sprintf("%01.2f", $data[4]); echo '<tr> <td class="main"> <table border="0" cellpadding="0" cellspacing="0"> <tr><td class="main" height="10" width="100%"></td></tr> <tr><td class="main_bold" width="720">' . tep_draw_separator('pixel_trans.gif', '10', '1') . '-&nbsp;' . $data[1] . '<input type="hidden" name="select[]" value="'. $data[1] . '-' . $_POST[$data[0]] . '-' . $data[3] . '-' . $data[2] . '-' . $prix_unitaire . '-' . $prix . '-' . $prix_total . '" /></td></tr> <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Quantité : ' . $_POST[$data[0]] . '</td></tr> <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Couleur : ' . $data[3] . '</td></tr> <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Taille : ' . $data[2] . '</td></tr> <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Prix unitaire : ' . $prix_unitaire . ' Euros</td></tr> <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Sous-total : ' . $prix . ' Euros</td></tr> </table> </td> </tr>'; } }

Mes produits s'affiche comme il faut ya pas de soucis.
Mais, lorsque je veut rentrer les variables du tableau dans la session, je n'arrive pas à lui donner tout les nom, je récupère toujours le dernier éléments du tableau...

Il faudrais que puisse rentrer les variable encore sous forme de tableau dans la session, possible ca???

J'ai essayer ceci:

Code : Tout sélectionner

$prix_total=0; foreach ( $_POST["select"] AS $value ){ $data = explode("-", $value); if ((!empty($_POST[$data[0]])) && ($_POST[$data[0]] != 0)) { $prix= $data[4] * $_POST[$data[0]]; $prix_total += $prix; $prix_unitaire= sprintf("%01.2f", $data[4]); echo '<tr> <td class="main"> <table border="0" cellpadding="0" cellspacing="0"> <tr><td class="main" height="10" width="100%"></td></tr> <tr><td class="main_bold" width="720">' . tep_draw_separator('pixel_trans.gif', '10', '1') . '-&nbsp;' . $data[1] . '<input type="hidden" name="select[]" value="'. $data[1] . '-' . $_POST[$data[0]] . '-' . $data[3] . '-' . $data[2] . '-' . $prix_unitaire . '-' . $prix . '-' . $prix_total . '" /></td></tr> <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Quantité : ' . $_POST[$data[0]] . '</td></tr> <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Couleur : ' . $data[3] . '</td></tr> <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Taille : ' . $data[2] . '</td></tr> <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Prix unitaire : ' . $prix_unitaire . ' Euros</td></tr> <tr><td class="main" width="720">' . tep_draw_separator('pixel_trans.gif', '30', '1') . 'Sous-total : ' . $prix . ' Euros</td></tr> </table> </td> </tr>'; //mise en memoire session $nom = $data[1]; $quantite = $_POST[$data[0]]; session_register("nom"); session_register("quantite"); } }

Mais cela ne fonctionne pas il me prend toujours le dernier élément du tableau.[/code]

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

27 mars 2008, 17:53

C'est normal, à chaque itération de ta boucle, tu écrases la valeur de $nom et $quantite dans ta session, du coup au final tu n'obtiens que la dernière valeur. Au lieu de simple variable il te faudrait un tableau pour chacune de ces deux valeurs, ainsi au lieu d'écraser la variable, tu pourrais compléter le tableau :
$nom[] = $data[1]; 
$quantite[] = $_POST[$data[0]];   

session_register("nom"); 
session_register("quantite"); 
A noter qu'il est préférable d'utiliser la variable $_SESSION plutôt que le session_register() (cela permet également d'éviter la confusion entre une éventuelle variable $nom dans ton script et celle qui devrait être en session) :
$_SESSION['nom'][] = $data[1]; 
$_SESSION['quantite'][] = $_POST[$data[0]];   
Tu peux également stocker directement le résultat du $_POST dans ta session, sans passer par la boucle :
$_SESSION["select"] = $_POST["select"];
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 18 Messages

27 mars 2008, 18:17

Yes cool merci.
J'ai encore beaucoup avec les tableau...

Je vais essayer avec:
$_SESSION["select"] = $_POST["select"];
Juste qu'avec cette syntaxe je récupère comment les differents élèments du tableau? par:
$_SESSION[$data[0]]
$_SESSION[$data[1]]
...

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

27 mars 2008, 18:20

Bah non, en fait tu copies le contenu du tableau $_POST["select"] dans le tableau $_SESSION["select"], donc pour récupérer les données dans le tableau, il te suffit de procéder comme avec le premier :
foreach ( $_SESSION["select"] AS  $value ){ // ton $_POST ici devient un $_SESSION et le tour est joué :)
   $data = explode("-", $value);    
  ...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 18 Messages

27 mars 2008, 19:07

ok ok merci beaucoup de ton aide Ryle, je vais pouvoir avancer.

Je ne mets pas encore de "RESOLU" sur le poste si jamais j'ai quelques question encore

Edit: Tu vois encore besoin de renseignements...

J'ai donc essayer avec le
$request = tep_db_query("SELECT c.parent_id, pd.products_id, pd.products_name, p.products_ref, p.products_price, s.specials_new_products_price, taille.products_options_values_id, couleur.products_options_values_id, couleur.products_options_values_name AS couleur, taille.products_options_values_name AS taille, pa.options_values_price, (
pa.options_values_price + p.products_price ) AS final_price, (pa.options_values_price + s.specials_new_products_price ) AS final_price_promo
FROM products_stock ps, products_description pd LEFT JOIN specials s USING(products_id), products_options_values couleur, products_options_values taille, products_attributes pa, products p, products_to_categories p2c, categories c
WHERE pd.products_id = ps.products_id
AND pd.products_id = pa.products_id
AND pd.products_id = p.products_id
AND p2c.products_id = pd.products_id
AND p2c.categories_id = c.categories_id
AND c.parent_id = 4
AND SUBSTRING( ps.products_stock_attributes FROM 3 FOR 2 ) = couleur.products_options_values_id
AND SUBSTRING( ps.products_stock_attributes FROM 8 FOR 2 ) = taille.products_options_values_id
AND pa.options_values_id = taille.products_options_values_id
ORDER BY pd.products_name, couleur.products_options_values_id, taille.products_options_values_id ");
				
while($data = mysql_fetch_assoc($request)) 
  { 
			if ($data['final_price_promo'] == '') {
				$final_price = $data['final_price'];
			} else { 
				$final_price = $data['final_price_promo'];
			}
			
			foreach ($_SESSION["select"] AS  $value ){
			$data_table = explode("-", $value);
				
				if(($data_table[1] == $data['products_name']) && ($data_table[3] == $data['couleur']) && ($data_table[2] == $data['taille'])) {
					$check = ' checked="checked"';
					$quantite = 'value="' . $_SESSION[$data_table[0]] . '" ';
				} else {
					$check = '';
					$quantite = '';
				}
			
			
			echo '<tr>
			<td class="directbuy" width="90" align="center"><input type="checkbox" name="select[]" value="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '-' . $data['products_name'] . '-' . $data['taille'] . '-' . $data['couleur'] . '-' . $final_price . '"' . $check . ' /></td>
            <td class="directbuy_ref" width="50">' . $data['products_ref'] . '</td>
			<td class="directbuy_nom" width="260">' . $data['products_name'] . '</td>
			<td class="directbuy" width="130" align="center">' . $data['couleur'] . '</td>
			<td class="directbuy" width="90" align="center">' .$data['taille'] . '</td>
			<td class="directbuy_check" width="100" align="center"><input class="quantite" type="text" name="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '" ' . $quantite . ' /></td>
			</tr>';
			
			}
	}
Malheureusement, il me rajoute à chaque fois une ligne... j'ai alors essayer avec
$_SESSION['nom'][] = $data[1];  
$_SESSION['quantite'][] = $_POST[$data[0]]; 
$_SESSION['couleur'][] = $data[3];  
$_SESSION['taille'][] = $data[2];
j'ai donc ce code dans la page ou j'ai besoin des variable dans SESSION:

Code : Tout sélectionner

$request = tep_db_query("SELECT c.parent_id, pd.products_id, pd.products_name, p.products_ref, p.products_price, s.specials_new_products_price, taille.products_options_values_id, couleur.products_options_values_id, couleur.products_options_values_name AS couleur, taille.products_options_values_name AS taille, pa.options_values_price, ( pa.options_values_price + p.products_price ) AS final_price, (pa.options_values_price + s.specials_new_products_price ) AS final_price_promo FROM products_stock ps, products_description pd LEFT JOIN specials s USING(products_id), products_options_values couleur, products_options_values taille, products_attributes pa, products p, products_to_categories p2c, categories c WHERE pd.products_id = ps.products_id AND pd.products_id = pa.products_id AND pd.products_id = p.products_id AND p2c.products_id = pd.products_id AND p2c.categories_id = c.categories_id AND c.parent_id = 4 AND SUBSTRING( ps.products_stock_attributes FROM 3 FOR 2 ) = couleur.products_options_values_id AND SUBSTRING( ps.products_stock_attributes FROM 8 FOR 2 ) = taille.products_options_values_id AND pa.options_values_id = taille.products_options_values_id ORDER BY pd.products_name, couleur.products_options_values_id, taille.products_options_values_id "); while($data = mysql_fetch_assoc($request)) { if ($data['final_price_promo'] == '') { $final_price = $data['final_price']; } else { $final_price = $data['final_price_promo']; } if(($_SESSION['nom'] == $data['products_name']) && ($_SESSION['couleur'] == $data['couleur']) && ($_SESSION['taille'] == $data['taille'])) { $check = ' checked="checked"'; $quantite = 'value="' . $_SESSION['quantite'] . '" '; } else { $check = ''; $quantite = ''; } echo '<tr> <td class="directbuy" width="90" align="center"><input type="checkbox" name="select[]" value="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '-' . $data['products_name'] . '-' . $data['taille'] . '-' . $data['couleur'] . '-' . $final_price . '"' . $check . ' /></td> <td class="directbuy_ref" width="50">' . $data['products_ref'] . '</td> <td class="directbuy_nom" width="260">' . $data['products_name'] . '</td> <td class="directbuy" width="130" align="center">' . $data['couleur'] . '</td> <td class="directbuy" width="90" align="center">' .$data['taille'] . '</td> <td class="directbuy_check" width="100" align="center"><input class="quantite" type="text" name="p' . $data['products_id'] . 'c' . $data['couleur'] . 't' . $data['taille'] . '" ' . $quantite . ' /></td> </tr>'; }
Mais la ca ne récupère pas la variable je dois zapper quelque chose...

Bon j'ai essayer pas mal de truc mais rien à faire... j'ai toujours le doublons.
Si possible, encore un petit coup de pouce serai le bienvenue... je suis dans une partie que je maitrise pas du tout :?

Petit nouveau ! | 1 Messages

28 mars 2008, 18:25

Cette solution m'interresse :D , je suis en train de gerer des formulaire en multipage.
Par contre je suis dans le même cas que toi impossible de te repondre. :cry:

Eléphanteau du PHP | 18 Messages

31 mars 2008, 10:38

Personne aurait une petite idée, j'ai galéré pas mal de temps dans le week end la dessu mais pas réussi à trouver une solution :cry: , je suis pas loin de finir cette command express mais il me faudrais 2-3 derniers coup de pouce... :?