PHPNET Assistance

Support et Entraide PHPNET => Forum de programmation => Discussion démarrée par: 3corbeaux le 29 mars 2004 à 00:23:30

Titre: Caddie Virtuel
Posté par: 3corbeaux le 29 mars 2004 à 00:23:30
Salut, salut,

J'espère que mon truc n'est pas trop compliqué.
J'ai adapté le code d'un magasin virtuel et ça marche plutôt bien.
Mais...
Il y a un mais :

1er problème : caddie s’affiche avec quantité = vide comme si ajout() ne fonctionnait pas bien. J’aimerai quantité = 1 par défaut

2ème problème : enleve() remet la quantité à vide mais n’enlève pas le produit du caddie.

Que faire ? Merci.


Le code, tout le code...

if (! isset($SESSION["caddie"])) {
   $SESSION["caddie"] = new Caddie;
}

**sur une page**

<a href=\"caddie_ajout.php?id= $ligne2[id].\">...</a>   ok

**caddie_ajout.php**

$SESSION["caddie"]->ajout($id, 1);      
$SESSION["caddie"]->nettoie();      
$SESSION["caddie"]->recalc_total();

**class_caddie**

class Caddie {
   var $articles;      
   var $total;      

   function Caddie() {
         $this->init();
   }

   function init() {
      $this->articles = array();
      $this->total = 0;
   }

   function ajout($produitid, $quantite) {      
         if (isset($produitid)) {
         if (! isset($this->articles[$produitid])) {
            $this->articles[$produitid] = 0;
         }
         $this->articles[$produitid] += $quantite;
      }
   }

   function place(&$produitid, $quantite) {      
         if (isset($produitid)) {
         $this->articles[$produitid] = (int) $quantite;
      }
   }

   function enleve($produitid) {         
         if (isset($produitid)) {
         unset($this->articles[$produitid]);
         }
   }

   function nettoie() {      
         foreach ($this->articles as $produitid => $quantite) {
         if ($quantite < 1 ) {
            unset($this->articles[$produitid]);
         }
      }
   }

   function compte_elements() {      
      $total = 0;
      foreach ($this->articles as $produitid => $quantite) {
         $total += $quantite;
      }

      return $total;
   }

   function recupere_produitid_list() {      
      $produitid_list = "";
      foreach ($this->articles as $produitid => $quantite) {
         $produitid_list .= ",'" . $produitid . "'";
      }
         return substr($produitid_list, 1);
   }

   function recalc_total() {         
      $this->total = 0;
      $in_clause = $this->recupere_produitid_list();
      if (empty($in_clause)) {
         return;
      }
      $qid = mysql_query("SELECT id, prix FROM catalogue WHERE id IN ($in_clause)");
      if ($qid) {
         if (mysql_num_rows($qid) > 0) {
            while ($produit = mysql_fetch_array($qid)) {
               $this->total += $this->articles[$produit["id"]] *  
$produit["prix"];
            }
         }
      }
   }
}

**fonctions**


function recupere_articles_caddie() {         
/* Retourne $qid de tous les éléments du caddie */

   global $SESSION;

   $in_clause = $SESSION["caddie"]->recupere_produitid_list();
   if (empty($in_clause)) {

      return false;
   }
   $requete = "SELECT id, nom, contenance, weight, prix FROM catalogue WHERE id IN ($in_clause)";
   return mysql_query($requete);
}

function maj_quantite(&$form) {      
/* Met à jour les quantités d'un article  */

   global $SESSION;

   foreach ($form["id"] as $i => $produitid) {
      $quantite = $form["quantite"][$i];
      $SESSION["caddie"]->place($produitid, $quantite);
   }
}


** caddie_affichage**


if (isset($func)) {
   switch ($func) {
      case "enleve" :
          $SESSION["caddie"]->enleve($id);   
         break;

      case "vide" :
         $SESSION["caddie"]->init();   
         break;

      case "recalc" :
         maj_quantite($HTTP_POST_VARS);   
         break;
      
         }

   $SESSION["caddie"]->nettoie();      
   $SESSION["caddie"]->recalc_total();      
}

$qid = recupere_articles_caddie();

...

include("caddie.php");


**caddie.php**

if ($qid) {

      if (mysql_num_rows($qid) > 0) {

         while ($prod = mysql_fetch_array($qid)) {
             $quantite = $SESSION["caddie"]->articles[$prod[id]];
            $total = $prod[prix] * $quantite/$fact;
                        
         ?>
         <tr>
   <input type="hidden" name="id[]" value="<?=$prod[id]?>">
   <td><?=$prod[nom]?></td>
   <td><?=$prod[contenance]?></td>
   <?$price=$prod[prix]/$fact ?>
   <td><? printf("%.2f", $price)  ?></td>
<td><input type="text" size="1" name="quantite[]" value="<?=$quantite?>"></td>
   <td><?=$dev ?></td>
   <td><? printf("%.2f", $total) ?></td>
   <td>[<a href="<?=$PHP_SELF?>?func=enleve&id=<?=$prod[id]?>"> Remove</a>]</td>
      <?$tot_weight=$prod[weight]*$quantite;
      $total_weight=$total_weight+$tot_weight;
      $SESSION["total_weight"]=$total_weight ?>
         </tr>
   <? } } } ?>


 
Titre: Caddie Virtuel
Posté par: Mystic` le 29 mars 2004 à 00:32:06
Salut,
A mon avis remplace :

**class_caddie**

class Caddie {
var $articles;
var $total;

function Caddie() {
$this->init();
}

function init() {
$this->articles = array();
$this->total = 0;
}

par :

**class_caddie**

class Caddie {
var $articles;
var $total;

function Caddie() {
$this->init();
}

function init() {
$this->articles = array();
$this->total = 1;
}

Je n'ais pas vraiment lu le code, j'ai juste ete logique, il se peux que ca ne soit pas du tout ca.

Jérém'


Edit :

Si apres que tu ais teste ca ne marche pas, reprends "$this->total = 0;" et essaie ca :
function ajout($produitid, $quantite) {
if (isset($produitid)) {
if (! isset($this->articles[$produitid])) {
$this->articles[$produitid] = 1;
}
$this->articles[$produitid] += $quantite;
}
}

Si malgre tout ca ne marche pas, et bien contact Maverick78 :).
Titre: Caddie Virtuel
Posté par: maverick78 le 29 mars 2004 à 00:45:13
gné  :blink:
jai rien fait moi  :ph34r:
demande a alex plutot il te filera une poche  :D  
Titre: Caddie Virtuel
Posté par: 3corbeaux le 29 mars 2004 à 01:08:02
Merci,

Mais j'avais déjà essayé ça.
J'y retourne...

 ;)  
Titre: Caddie Virtuel
Posté par: miiin le 30 mars 2004 à 21:40:54
J'ai eu ton mail!

mais ca me parait bien compliqué tout ca!  ;)
En ce qui me concerne, j'ai pas utilisé de classes donc sur ce coup, je peux pas t'aider! desolé!