Tableaux avec plusieurs quantité pour un même produit

Invité
Invité n'ayant pas de compte PHPfrance

02 janv. 2007, 21:42

Bonjour,

J'essais de faire un tableau dont pour un même produit il y a défférentes quantités. selon le choix des formats de panier d'emballage.

J'ai besoin d'aide pour construire mon tableau car je crois que je suis dans les patates.

De la façon dont je l'ai fait je vois que les produits et les quantités sont insérés au tableau.

Mais je suppose que ce n'est pas correct car je suis incapable de faire afficher le conteue de mon tableau.

Dans une pageprécédente l'utilisateur a choisi le nombre et format de panier d'emballage:
	if(!isset($_SESSION['panier_cadeaux']))
	{
  		$_SESSION['panier_cadeaux'] = array();
		$_SESSION['panier_cadeaux']['id_panier'] = array();
		$_SESSION['panier_cadeaux']['format_panier'] = array();
		$_SESSION['panier_cadeaux']['id_produit'] = array();
		$_SESSION['panier_cadeaux']['qte'] = array();
	}
		foreach($_POST["panier_cadeaux"] as $w)
		{
			if($_POST["nb_panier_".$w.""]>=1)
			{
			array_push($_SESSION["panier_cadeaux"]["id_panier"],$_POST["id_panier_".$w.""]);
			array_push($_SESSION["panier_cadeaux"]["format_panier"],$_POST["format_panier_".$w.""]);
			}
		}
Voici mon code qui construit mon tableau:
		foreach($_POST["id_produit"] as $id_produit)
		{
		array_push($_SESSION["panier_cadeaux"]["id_produit"],$_POST["id_produit_".$id_produit.""]);
		}
			if(in_array($_POST["id_produit_".$id_produit.""],$_SESSION['panier_cadeaux']["id_produit"]))
			{
				foreach($_POST["qte"] as $qte)
				{
				echo "".$qte."<br>";
				echo "".$id_produit."<br>";
				array_push($_SESSION["panier_cadeaux"]["qte"],$_POST["qte_".$qte.""]);
				}
			}
Voici le contenu du tableau avec var_dump($_SESSION["panier_cadeaux"]);

Code : Tout sélectionner

array(4) { ["id_panier"]=> array(2) { [0]=> string(1) "1" [1]=> string(1) "2" } ["format_panier"]=> array(2) { [0]=> string(12) "Moyen panier" [1]=> string(11) "Gros panier" } ["id_produit"]=> array(1) { [0]=> string(1) "2" } ["qte"]=> array(2) { [0]=> string(1) "3" [1]=> string(1) "9" } }
Voici comment j'essais d'afficher le contenu du tableau:
session_start();
$nb_produits = 0;
$nb_produits = count($_SESSION["panier_cadeaux"]);
for($y = 0; $y < $nb_produits; $y++)
{
echo "".$_SESSION["panier_cadeaux"]["id_produit"][$y]." ".$_SESSION["panier_cadeaux"]["format_panier"][$y]." ";
echo "".$_SESSION["panier_cadeaux"]["qte"][$y]."<br>";
}
J'obtiens le premier index sans erreur mais cette erreur ensuite:

Code : Tout sélectionner

Notice: Undefined offset: 1 in /home/webserver/savonnerie/web/panier_cadeaux4.php on line 7 Gros panier 9 Notice: Undefined offset: 2 in /home/webserver/savonnerie/web/panier_cadeaux4.php on line 7 Notice: Undefined offset: 2 in /home/webserver/savonnerie/web/panier_cadeaux4.php on line 7 Notice: Undefined offset: 2 in /home/webserver/savonnerie/web/panier_cadeaux4.php on line 9 Notice: Undefined offset: 3 in /home/webserver/savonnerie/web/panier_cadeaux4.php on line 7 Notice: Undefined offset: 3 in /home/webserver/savonnerie/web/panier_cadeaux4.php on line 7 Notice: Undefined offset: 3 in /home/webserver/savonnerie/web/panier_cadeaux4.php on line 9
Pouvez-vous m'aider SVP?

Merci!

Mammouth du PHP | 19672 Messages

02 janv. 2007, 22:13

Forcément, tu ne comptes pas le bon niveau de ton panier. Au lieu de :
$nb_produits = count($_SESSION["panier_cadeaux"]); 
Essaye avec :
$nb_produits = count($_SESSION["panier_cadeaux"]['id_panier']); 
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 331 Messages

03 janv. 2007, 01:20

Merci.

Là il n'y a plus de message d'erreur.

Mais, je n'obtiens pas le résultat approprié.

En utilisant l'exemple du contenu de var_dump($_SESSION["panier_cadeaux"]); de mon premier post.

J'ai 1 produit et 2 quantité.

Alors, la boucle ne s'exécute qu'une seule fois affichant le produit mais seulement le premier index de quantité.

Comment faire affiché les autres quantité du produit?

En espérant que tu peux m'aider encore.

Merci!

Eléphant du PHP | 331 Messages

03 janv. 2007, 06:22

Salut,

J'ai trouvé cette fonction sur phpdebutant.

Sa affiche tout mon tableau.

Je me rend alors compte que mon problème est que mon tableau est mal construit.

Je crois bien que je doivent créer un tableau multidimentionnel mais je n'y arrive pas correctement.

Plus bas il y a mon nouveau code pour mon tableau multidimentionnel.
function afficher_tableau($tableau) 
    {
    // on fait une boucle qui lit les éléments du tableau
    foreach ($tableau as $cle=>$valeur) 
        {
        // si l'un des éléments est lui même un tableau
        // alors on applique la fonction à ce tableau
        if(is_array($valeur)) 
            {
            // on affiche le nom de la clé et
            // le début d'une liste pour
            //  décaler le contenu vers la droite
            echo $cle.' : <ul>'; 
            
            // ici se réalise la récursivité
            // c'est à dire qu'on applique la fonction
            // à l'élément en cours car c'est lui aussi un tableau
            afficher_tableau($valeur); 
            
            // on ferme la liste
            echo '</ul>'; 
            }
        
        // si ce n'est pas un tableau
        // alors on affiche le contenu de l'élément
        else
            {
            echo $cle.' = '.$valeur.' <br>';  
            }
        } 
    } 
    

afficher_tableau($_SESSION["panier_cadeaux"]);
		foreach($_POST["id_produit"] as $id_produit)
		{
		array_push($_SESSION["panier_cadeaux"]["id_produit"],$_POST["id_produit_".$id_produit.""]);
			foreach($_POST["id_panier"] as $id_panier)
			{
			array_push($_SESSION["panier_cadeaux"]["id_produit"]['id_panier'],$_POST["id_panier_".$id_panier.""]);
			array_push($_SESSION["panier_cadeaux"]["id_produit"]['format_panier'],$_POST["format_panier_".$id_panier.""]);
			}
				foreach($_POST["qte"] as $qte)
				{
				array_push($_SESSION["panier_cadeaux"]['id_produit']['id_panier']["qte"],$_POST["qte_".$qte.""]);
				}
		}

Mammouth du PHP | 19672 Messages

03 janv. 2007, 09:44

Alors peut-être un tuto sur les paniers :?:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 331 Messages

03 janv. 2007, 17:10

Je connais bien ce tuto, je m'en suis servi pour faire le panier principale de mon site.

Là où est mon défi c'est que le client après avoir terminer de remplir le panier des produits qu'il désire (des savons artisanaux dans ce cas ci) il peut répartir ses produits dans de beaux paniers cadeaux en bois tressés.

3 format de panier, moyen , grand et très grand. Pour une même commande il peut choir plusieurs panier de format différent.

Ensuite, un formulaire apparait lui permettant de préciser le nombre de produits X, Y ou Z qu'il veut dans chacun des paniers.

Voici un liens vers mon site pour que tu vois bien, (si tu souhaite le voir bien sûr)

http://www.savonfermier.com

Essais d'ajouter un produit au panier, après avoir fait le choix de quantité tu verras un liens:

Cliquez ici pour choisir les panier cadeaux

Mammouth du PHP | 19672 Messages

03 janv. 2007, 23:32

Je vois.
Alors je serais tenté de penser qu'il y a un problème de modélisation : si pour une même commande je dois pouvoir répartir mes produits dans plusieurs paniers, dans la mesure où on a trois paniers possibles, je crois qu'il faudrait un formulaire intermédiaire avant le panier d'achat pour répartir les produits selon les paniers choisis.

Si je prends 5 savons d'une sorte et 3 d'une autre, ça tiendrait dans un seul panier moyen, mais si je veux deux petits paniers, il faudrait que j'aie un formulaire où je détermine quelle quantité de quel produit choisi je mets dans tel panier et ainsi de suite pour tous mes produits.

Ça veut dire qu'au niveau de ta variable de session, il doit y avoir une nouvelle répartition des produits.

Ce que je verrais, ce serait quelque chose du genre :
  1. panier de base : comme dans le tuto, les produits ne seront pas répartis dans les paniers cadeaux;
  2. Panier cadeau :
    • $_SESSION['pcadeau']['id_panier'][x]['id_produit']
    • $_SESSION['pcadeau']['id_panier'][x]['qte']
    • etc...
et au fur et à mesure que tu ajoutes un produit dans un panier cadeau, tu le retires du panier de base... ou encore tu gardes le panier de base en parallèle pour simplifier le calcul de la facture, mais le second te permet de gérer la répartition, d'autant que rien n'interdit l'achat d'un panier cadeau vide en plus de produits ?

Enfin ça demande réflexion, c'est certain, je manque de temps pour me pencher davantage dessus, mais l'idée générale devrait t'aiguiller un peu :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 331 Messages

04 janv. 2007, 05:37

Hummm ce n'est pas facile!

Je ne comprend pas comment bâtir ce tableau de panier cadeau.

Ton explication m'a éclairé un petit peu:

Code : Tout sélectionner

$_SESSION['pcadeau']['id_panier'][x]['id_produit']
Je comprend que [x] sa doit être un index tableau créer précédemment.

Pour les id_panier et quantite le nombre est variable selon le choix de l'utilisateur.

Ex.: Chaque champ de qhantité est accompagné d'un champ invisible qte[] qui me permet de compter tout mes champs avec un foreach.

Voici ce que j'ai essayé mais sa me marche pas.
		foreach($_POST["id_produit"] as $id_produit=>$valeur)
		{
			$_SESSION['panier_cadeaux']["id_produit"][$id_produit]['id_panier'] = array();
			foreach($_POST["id_produit"] as $id_produit)
			{
			array_push($_SESSION["panier_cadeaux"]["id_produit"],$_POST["id_produit_".$id_produit.""]);
			}
			foreach($_POST["id_panier"] as $id_panier)
				{
				$_SESSION['panier_cadeaux']["id_produit"][$id_produit]['id_panier'] = array();
				array_push($_SESSION["panier_cadeaux"]["id_produit"][$id_produit]["id_panier"],$_POST["id_panier_".$id_panier.""]);
				}			
		}

Mammouth du PHP | 19672 Messages

04 janv. 2007, 09:58

Ton explication m'a éclairé un petit peu:

Code : Tout sélectionner

$_SESSION['pcadeau']['id_panier'][x]['id_produit']
Je comprend que [x] sa doit être un index tableau créer précédemment.
C'est ça : mais en fait ça veut dire que tu dois gérer ton caddie indépendamment de la répartition dans les paniers cadeaux.

D'abord parce que les paniers cadeaux sont également des produits qui seront eux aussi facturés. Ça implique deux variables de session :
-1- le caddie
-2- la répartition dans les paniers si il y a des paniers cadeaux dans le caddie.

Le caddie sert à établir la facture détaillée;
La répartition va servir à l'expédition.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 991 Messages

04 janv. 2007, 12:02

j'ai deja developper un systeme equivalent pour afficher le conetnu j'utilise cette fonction :
function aff($panier_vide,$panier_supprimer)
{
        $count = count($_SESSION['achats']);
        if($count ==0)
        {
		$affichage = "0"; 
		$_SESSION['prix_total'] = 0;
                echo $panier_vide;
        }
        else
        {
		echo '<table border="0" width="100%">';
                for($i=0;$i<$count;$i++)
                {
                        $ref = $_SESSION['achats'][$i]['ref'];
                        $ref_1 = $_SESSION['achats'][$i]['ref_1'];
                        $prix = $_SESSION['achats'][$i]['prix'];
                        echo "<tr><td class='Content'>$ref_1</td><td class='Content'>$ref</td><td class='Content' width='10%'>$prix</td><td class='Content' width='20%'><a href='index.php?action=del&ref=$ref&prix=$prix'>".$panier_supprimer."</a></td></tr>";
                		$affichage = "1"; 
				}
		echo '</table>';
		
		
		}
}
pour ajouter un produit au panier :
function add($ref,$prix,$ref_1)
{
$_SESSION['achats'][] = array ("ref" => $ref,"prix" => $prix,"ref_1" => $ref_1);
	if (!isset($_SESSION['prix_total']))
		{
		$_SESSION['prix_total'] = 0;
		$_SESSION['prix_total'] = $_SESSION['prix_total'] + $prix;
		}
	else
		{
		$_SESSION['prix_total'] = $_SESSION['prix_total'] + $prix;
		}
}
voila bon je pense que cela ne correspond pas exactement a ton attente mais tu peux t'en servir de modele afin de l'adapter

thehawk
DevOps, Symfony4, Hoa