PHP - Panier/Caddi virtuel en SESSION

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 18 déc. 2018 à 17:38
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 26 mars 2019 à 16:48
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/102874-php-panier-caddi-virtuel-en-session

j ai beau cherche je ne comprends pas , désolé de vous avoir dérangé
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344 > pparies
26 mars 2019 à 16:48
Comme je te l'ai indiqué... c'est simplement de l'utilisation / manipulation d'array associatif
Si tu ne sais pas ce que c'est ni comment ça marche... et bien... commence par te former la dessus.
C'est un minimum de connaitre les différents types de variables et comment les manipuler lorsque l'on apprend un langage.
Une fois que tu auras compris ça... tu verras comment fonctionne le code.
désolé, je suis pas un expert, et loins de la, et je m y remet doucement,
la seule chose que je remarque c est
$_SESSION['panier'][$id_produit] qui me parait pas juste mais bon
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344 > pparies
22 mars 2019 à 12:56
Ben si...
C'est la clé qui permet de tester si le produit est déjà dans le panier ou non
Et donc de pouvoir mettre à jour les quantités ou le supprimer si besoin...
vous pouvez m expliquer comme ca, après j ai compris et j arreterais de vous embeter
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344 > pparies
22 mars 2019 à 11:34
C'est de la manipulation d'array associatif ... le truc de base du php....
Regarde la fonction add
public function addProduct($id_produit,$libelle_produit,$qte=1,$prix_unitaire_produit=0){
    if($qte > 0 ){
      $_SESSION['panier'][$id_produit] = array('id_produit'=>$id_produit
                                                ,'produit'=>$libelle_produit
                                                ,'qte'=>$qte
                                                ,'prix_unitaire'=>$prix_unitaire_produit
                                                );
j ai bien fait le session_start(); sans le if
 Contenu du panier :
Array
(
    [190308005] => Array
        (
            [id_produit] => 190308005
            [produit] => RPLEIntelA-52184
            [qte] => 1
            [prix_unitaire] => 250.8
            [prix_Total] => 250.8
        )

)

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344 > pparies
22 mars 2019 à 10:41
Heu...ben...oui... C'est bien ça...
Et c'est normal....
Ça n'a aucun rapport avec l'id de session...

<?php
/**
*  FICHIER : cart.class.php
*
*/
class cart{
  
  /**
  * Constructeur de la class
  */
  function __construct(){
    // Démarrage des sessions si pas déjà démarrées
    $this->initCart();
  }
  
  /**
  *Initialisation du panier
  */
  public function initCart(){
    $_SESSION['panier'] = array(); 
  }
  
  /**
  * Retourne le contenu du panier
  */
  public function getList(){
    return !empty($_SESSION['panier']) ? $_SESSION['panier'] : NULL;
  }
  
  /**
  * Ajout d'un produit au panier
  */
  public function addProduct($id_produit,$libelle_produit,$qte=1,$prix_unitaire_produit=0){
    if($qte > 0 ){
      $_SESSION['panier'][$id_produit] = array('id_produit'=>$id_produit
                                                ,'produit'=>$libelle_produit
                                                ,'qte'=>$qte
                                                ,'prix_unitaire'=>$prix_unitaire_produit
                                                ); 
      $this->updateTotalPriceProduct($id_produit);
    }else{
      return "ERREUR : Vous ne pouvez pas ajouter un produit sans quantité..."; 
    }
  }
  
  private function updateTotalPriceProduct($id_produit){
    if(isset($_SESSION['panier'][$id_produit])){
      $_SESSION['panier'][$id_produit]['prix_Total'] = $_SESSION['panier'][$id_produit]['qte'] * $_SESSION['panier'][$id_produit]['prix_unitaire'];
    }
  }
  
  /**
  * Modifie la quantité d'une produit dans le panier
  */
  public function updateQteProduct($id_produit,$qte=0){
    if(isset($_SESSION['panier'][$id_produit])){
      $_SESSION['panier'][$id_produit]['qte'] = $qte;
      $this->updateTotalPriceProduct($id_produit);
    }else{
      return "ERREUR : produit non présent dans le panier"; 
    }
  }
  
  /**
  * Supprime une produit du panier
  */
  public function removeProduct($id_produit){
    if(isset($_SESSION['panier'][$id_produit])){
      unset($_SESSION['panier'][$id_produit]);
    }
  }
  
  /**
  * Retourne le nombre de produits dans le panier
  */
  public function getNbProductsInCart(){
    $panier = !empty( $_SESSION['panier'] ) ? $_SESSION['panier'] : NULL;
    $nb = 0;
    $panier = !empty( $_SESSION['panier'] ) ? $_SESSION['panier'] : NULL;
    if(!empty($panier)){
      foreach($panier as $P){ 
        $nb += $P['qte'];
      }
    }
    return $nb;
  }
  
  public function getTotalPriceCart(){
    $total = 0;
    $panier = !empty( $_SESSION['panier'] ) ? $_SESSION['panier'] : NULL;
    if(!empty($panier)){
      foreach($panier as $P){ 
        $total += $P['prix_Total'];
      }
    }
    return $total;
  }
  
}

<?php

if (session_status() == PHP_SESSION_NONE) {
        session_start();
}

require_once "cart.class.php";

$oPanier = new cart();

?>

<!DOCTYPE html>
<html>
<head>

	<meta charset="utf-8" />
	<link rel="stylesheet" href="css/styles.css" />
	<!--<link rel="stylesheet" media="screen and (max-width: 1280px)" href="css/1280.css" /> Pour ceux qui ont une résolution inférieure à 1280px -->
	<title>NoteBook d'occasion</title>
</head>
<body>

<!-- Entête -->
<?php include("includes/entete.php"); ?>

<!-- Menu principal -->
<?php include("includes/menu_principal.php"); ?>
<!-- Bloc page principal -->
<section>

<p><center><h1>Choisissez la taille de l'écran</h1></center></p>


<!-- Menu des catalogues -->

<?php include("includes/menu_o_notebook.php"); ?>

<!-- Liste des produits -->
		<div id="produits">
<?php
try
{
	// On se connecte à MySQL
	$bdd = new PDO('mysql:host=localhost;dbname=informatique_occasion;charset=utf8', 'gontierc', 'Macfly59');
}
catch(Exception $e)
{
	// En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
}
			// le produit

// On récupère tout le contenu de la table ordinateurs portables
$reponse = $bdd->query('SELECT * FROM ordinateurs_portables ORDER BY tarif_ht');

// On affiche chaque entrée une à une
while ($donnees = $reponse->fetch())
{
?>

			<div class="produit">
				
							<div class="image">
								<?php echo "<img src='".$donnees['img']."' />";?>
							</div>

							<div class="ref">
								<p><strong><?php echo $donnees['ref']; ?></strong></p>
							</div>


							
							<div class="designation">
								<p><?php echo $donnees['designation']; ?></p>
							</div>
							
							<div class="qte">
								<p>Quantité : 	<?php echo $donnees['qte']; ?></p>
							</div>

							<div class="tarif">
									<?php	
										$marge = 100;
										$tva = 1.2;
										$prixht = $donnees['tarif_ht'];
										$ht_tva = $marge + $prixht;
										$prix = $ht_tva * $tva;
										?>
									<p><?php echo $prix; ?> €</p>

							</div>

							<a href="addpanier.php?id=<?php echo $donnees['id']; ?>&ref=<?php echo $donnees['ref']; ?>&prix=<?php echo $prix; ?>"> Ajouter</a>
						

								

			</div>
<?php
}

$reponse->closeCursor(); // Termine le traitement de la requête

?>
		</div>

</section>

<!-- Pied de page -->
<footer>
	<p><center>Copyright 2009-2019 - CG INFORMATIQUE 24 - L'Informatique Zen et Confortable</center></p>
</footer>


</body>
</html>
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
21 mars 2019 à 19:07
il prends en ID de session l id de l'article

Quelle version de PHP utilises tu ?
As tu un session_start ailleurs dans ton code ? Si oui.. retire celui qui se trouve dans le contruct de la class cart

Si ton souci persiste... merci de nous coller ton code complet ainsi qu'un print_r des variables $_GET et $_SESSION

NB: Pour poster ton code correctement, merci de le faire en utilisant les balises de code.
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
<?php

 //Affichage des erreurs PHP ( A mettre au début de tes scripts PHP )
 error_reporting(E_ALL);
 ini_set('display_errors', TRUE);
 ini_set('display_startup_errors', TRUE);

 //on inclus la class qui permet de gérer le panier
 // require_once "chemin/vers/le/fichier/cart.class.php";

 require_once "cart.class.php";



 //Récuperation de valeur URL

 $id = $_GET['id'];
 $ref = $_GET['ref'];
 $prix = $_GET['prix'];

 $oPanier->addProduct($id,$ref,1,$prix);

 $contenu_panier = $oPanier->getList();
 echo "<pre> Contenu du panier :<br>";
 print_r($contenu_panier );
 echo "</pre>";


?>

edit : ajout des balises de code

j ai pas mis le : $oPanier = new cart(); car quand je le met ca cree bien un panier mais je ne peux ajouter 2 articles dedans, il prends en ID de session l id de l'article
Bonjour, deja merci pour ce code qui m aide beaucoup.

J essaie de l appliquer a mon site avec plusieurs page de produit, et en faisant un ajout par une page de traitement en récuperant les info par un $_GET.

Mais, quand je fais $oPanier->addProduct($id,$ref,1,$prix); (ce sont les noms de mes variables), mon traitement a une erreur car oPanier n est pas défini :
Notice: Undefined variable: oPanier in /var/www/html/test/addpanier.php on line 21

Fatal error: Uncaught Error: Call to a member function addProduct() on null in /var/www/html/test/addpanier.php:21 Stack trace: #0 {main} thrown in /var/www/html/test/addpanier.php on line 21

Pourriez vous m aider s il vous plait, merci
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344 > pparies
21 mars 2019 à 17:58
Bonjour,

Sans voir ton code... difficile de te répondre...
Mais .. dans ton fichier addpanier.php as tu bien fais le require de la class et instancié la variable oPanier ?
// require_once "chemin/vers/le/fichier/cart.class.php";
require_once "cart.class.php";
//on initialise l'objet panier :
$oPanier = new cart();
Rejoignez-nous