TUTORIELS 
Gestion d'un caddie en PHP

Page 1 | 2

Réalisation pas à pas d'un "panier d'achats", brique indispensable de tout site de commerce électronique.
 (3 novembre 2003)
 

Définition des actions
Lors de l'utilisation d'un caddie, l'utilisateur à quelques commandes de base : ajouter un produit dans le caddie (utilisé pendant le parcours du catalogue), retirer un produit de la commande (utilisé lors de l'affichage final), actualiser le caddie (idem, affichage final - pour les clients qui voudraient ajouter ou enlever des produits) et enfin, valider la commande. Chacune de ses commandes fera l'objet d'un script au sein de notre application.

1) Ajouter
Nous partons du principe que nous sommes dans le catalogue, et que plusieurs produits sont affichés. L'affichage des produits est bien entendu dynamique (selon la recherche ou la rubrique), et n'est pas abordé par cet article - nous vous recommandons la lecture de notre article sur l'utilisation de l'Objet dans PHP.

Nos produits sont présentés ainsi :

Produit
Prix
Quantité
PremierProduit
127
AutreProduit
230
UnBonProduit
450
UnProduitPasCher
12

On veut que toute l'interaction se fasse à partir du lien situé sous le texte Ajouter: quand on le clique. On veut de plus que les références du produit de ce champ (son id et la quantité souhaitée) soient ajoutées à notre variable $liste[][], et que le catalogue s'affiche à nouveau, à la même page, avec la valeur des quantités mises à jour. Ce lien renvoie donc sur la même page catalogue.php.

Le code PHP gérant l'ajout prendra cette forme :

if ($_GET['ajout'] == "AJOUT")
  {
  $_SESSION['achats'][] = array (
    "id" => $_GET['id'],
    "qte" => $_GET['qte']
    );
  }

Le lien Ajouter correspondra donc à :
catalogue.php?ajout="AJOUT"&id=<?=$row['id'];?>&qte=<?=$qte123456;?>

...c'est à dire, après compilation par PHP, donnerait :
catalogue.php?ajout="AJOUT"&id=123456&qte=3

2) Supprimer
Nous travaillons maintenant dans notre caddie (caddie.php). Il se présente ainsi:

Produit
Prix
Quantité
Total
PremierProduit
127
381
UnBonProduit
450
2250
Prix total
8 produit(s)
2631

Nous laissons les calculs et affichages des totaux, qui ne font qu'utiliser les même méthodes que pour l'affichage du catalogue, l'arithmétique en plus. L'affichage des quantités dans le menu déroulant est intelligemment géré par l'utilisation de "selected".

for ($i=0; $i < count($_SESSION['achats']); $i++)
  {
// code MySQL allant chercher les informations pour chaque produit
// en fonction de $_SESSION['achats'][$i]['id']
  ?>
  <select name="qte<?=$i"?>">
    <option value="1"
      <?=($_SESSION['achats'][$i]['qte'] == 1 ? "SELECTED" : null;?>
    </option>
    <option value="12"
      <?=($_SESSION['achats'][$i]['qte'] == 2 ? "SELECTED" : null;?>
<!-- etc. -->
    </option>
  </select>
  <?}

Nous travaillons toujours avec nos variables de session : pour supprimer un élément de $_SESSION['achats'], il nous faut la parcourir, à la recherche de l'id du produit à supprimer. Notre lien Mettre A Jour sera de la forme suivante :

caddie.php?retirer=RETIRER&id_produit=<?=row['id'];?>

...c'est à dire...

caddie.php?retirer=RETIRER&id_produit=123456

Nous ferons cela à l'aide d'une boucle for et de la fonction array_splice(), qui permet d'effacer une portion d'un tableau :

if ($_GET['retirer'] == "RETIRER")
  {
  for ($i=0; $i < count($_SESSION['achats']; $i++)
    {
    if ($i == $_GET['id_produit'] )
      {
      array_splice($_SESSION['achats'], $i, 1);
      }
    }
  }

3) Mettre à jour
Sur le même modèle que Supprimer : on charge la même page, en mettant simplement à jour les valeurs de session...

Discutez en sur les forums

4) Valider
Cette dernière commande renvoi la page d'affichage final, où l'utilisateur ne peut plus modifier sa liste d'achats, ni revenir en arrière. Les valeurs sont sauvées dans la base MySQL, sur le schéma suivant :

$req = "INSERT INTO commandes
    (id_client, date, total, etat)
    VALUES (xborderie, " date(); . " , " . $_GET['total'] . ", "En cours...");"

mysql_query($req);
$commande_id = mysql_insert_id();

for ($i=0; $i < count($_SESSION['achats']; $i++)
  {
  $req2 = "INSERT INTO achats
    (id_produit,id_commande,quantite,prix_total)
    VALUES (" . $_SESSION['achats'][$i]['id'] . "," . $commande_id . " . "," $_SESSION['achats'][$i]['qte'] . "," . $_SESSION['achats'][$i]['qte'] * $_SESSION['achats'][$i]['prix'] . ";";
  mysql_query($req2);
  }

Page 1 | 2

 
[ Xavier BorderieJDNet]
 
Accueil | Haut de page