PHP - Panier/Caddi virtuel en SESSION

Soyez le premier à donner votre avis sur cette source.

Vue 4 903 fois - Téléchargée 1 648 fois

Description

Bonjour,

Suite à une demande sur le forum,
voici une class php permettant de gérer un panier (ou caddi) en variables de session.
- Le fichier index.php ne sert que d'exemple d'utilisation.
- La gestion du panier se fait via la class cart (fichier cart.class.php)

la class "cart" contient les fonctions permettant de :
- Initialiser un panier
- Ajouter des produits au panier
- Retirer des produits du panier
- Modifier la quantité d'un produit dans le panier
- Avoir le nombre de produit total dans le panier
- Avoir le montant total du panier


cart.class.php

 <?php
/**
*  FICHIER : cart.class.php
*
*/
class cart{
  
  /**
  * Constructeur de la class
  */
  function __construct(){
    // Démarrage des sessions si pas déjà démarrées
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
    $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;
  }
  
}
 
 



index.php (exemples d'utilisation )

<?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);

// Démarrage des sessions si pas déjà démarrées
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

//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";

//on initialise l'objet panier :
$oPanier = new cart();


//maintenant on peut ajouter des produits au panier
echo "<br><hr><br> On ajoute deux produits au panier";
$oPanier->addProduct(1,'produit 1',1,10);
$oPanier->addProduct(654,'produit xx',1,99.5);


//on affiche le nombre de produits dans le pannier
$nbProducts = $oPanier->getNbProductsInCart();
echo "<br>Nombre de produits : ". $nbProducts;

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

//on affiche le montant total du panier
$total = $oPanier->getTotalPriceCart();
echo "<br>Total panier : ". $total ;


// on modifie la quantité du premier produit
echo "<br><hr><br> On modifie la quantité du premier produit : nouvelle quantité = 35 ";
$oPanier->updateQteProduct(1,35);

//on re-affiche le nombre de produits dans le pannier
$nbProducts = $oPanier->getNbProductsInCart();
echo "<br>Nombre de produits : ". $nbProducts;

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

//on re-affiche le montant total du panier
$total = $oPanier->getTotalPriceCart();
echo "<br>Total panier : ". $total ;


// On retire le produit dont l'id est : 654
echo "<br><hr><br>On retire le produit dont l'id est : 654" ;
$oPanier->removeProduct(654);
//on re-affiche le contenu du panier 
$contenu_panier = $oPanier->getList();
echo "<pre> Contenu du panier :<br>";
print_r($contenu_panier );
echo "</pre>";

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

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
26514
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 octobre 2019
316 > pparies -
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();
<?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
jordane45
Messages postés
26514
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 octobre 2019
316 -
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

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>

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.