Panier d'achat le célèbre cas d'ecole !
Hello !
Voila je voudrais faire un panier d'achat mais en objet !
j'ai déjà commencer par faire une class Product classique.
Class Product
class Product {   private $id;   private $name;   private $describe;   private $photo;   private $price;   private $quantity;     /**    * Constructor    *     * @access public    * @param string $name    * @param string $describe    * @param string $photo    * @param float  $price    *     */   public function __construct($id,$name,$describe,$photo,$price)   {     $this->id     = $id;     $this->name   = $name;     $this->describe = $describe;     $this->photo   = $photo;     $this->price   = $price;   }     /**    * Set id product    *     * @access public    * @param int $id    * @return void    *     */   public function setId($id)   {     $this->id = $id;   }     /**    * Return the id product    *     * @access public    * @return int id    *     */   public function getId()   {     return $this->id;   }     public function addItem()   {     $this->quantity += 1;   }     /**    * Set the name product    *     * @access public    * @param string $name    * @return void    *     */   public function setName($name)   {     $this->name = $name;   }     /**    * Return the name product    *     * @access public    * @return string name    *     */   public function getName()   {     return $this->name;   }     /**    * Set a describe product    *     * @access public    * @param string $describe    *     */   public function setDescribe($describe)   {     $this->describe = $describe;   }     /**    * Return the description of product    *     * @access public    * @return string describe    *     */   public function getDescribe()   {     return $this->describe;   }     /**    * Set a photo product    *     * @access public    * @param string $photo    * @return void    *     */   public function setPhoto($photo)   {     $this->photo = $photo;   }     /**    * Return a photo product    *     * @access public    * @return string photo    *     */   public function getPhoto()   {     return $this->photo;   }     /**    * Set the price product    *     * @access public    * @param float $price    * @return void    *     */   public function setPrice($price)   {     $this->price = $price;   }     /**    * Return the price product    *     * @access public    * @return float price    *     */   public function getPrice()   {     return $this->price;   }  }?>
et la class Cart
Class Cart
class Cart{   private $content;  private $total;  private $quantity = 0;    /**   * Construct   *    */  public function __construct()  {    session_start();     if(!isset($_SESSION['cart']))    {      $_SESSION['cart'] = array();      $this->content = &$_SESSION['cart'];    }  }    /**   * Add Product to cart   *    *    */  public function addProduct(Product $product)  {    $this->content[] = $product;    $_SESSION['cart'] = $this->content;  }    public function getAllItems()  {    return $this->content;  }   public function getQty()  {    return $this->quantity;  }  }?>
que penses tu de ce debut ?
et mon souci c'est que j'arrive pas à assigné la quantité à un produit !
merci pour ton aide Emacs
Réponses apportées à cette discussion
J'ai oublié de préciser que j'utilise directement la session directement dedans pour l'exercice mais je vais créer une classe Session comme tu me l'as conseiller auparavent !
Pour associé la quantité à un produit je pense qu'il faut faire un tableau.
array(
'casserole' => 2
...
);
Voilà bonne chance je ne peux pas trop t'aider plus car l'objet c'est pas ma tasse de thé!!
en effet c'est que je veux faire !
ca doit faire un truc comme
$_SESSION['cart'] = array("produit" => "quantity";
mais quand je fais $this->content [] = $product;
ca me met qu'un produit dans le tableau mais je ne sais pas comment aujouter la quantié au produit
je peux pas faire $this->content[$product] = +1; par exemple ca marche pas !
j'ai essayer $this->content[$product][$quantity] = +1;
c'est pas bon non plus !
j'ai créer un attribut private $quantity mais je vois pas trop comment le gérer dans le tableau !
Ok je crois que tu dois faire
$quantite_actuelle = $this->content[$product];
$new_quantite = $quantite_actuelle++;
$this->content[$product] = $new_quantite;
Essaie cela!!!
re ! merci pour l'astuce
en faite j'ai essayé ta methode et il me met un warnning:
**Warning: Illegal offset type in .....Cart.php on line 34 **
je suis sur que c'est un truc bete en plus !
de plus je dois verifier si un produit n'existe pas déjà dans le panier !
si il exist je met +1 sinon j'ajoute de 1
Pour vérifiersi un produit n'existe pas dans le panier tu fais :
http://fr.php.net/manual/fr/function.array-key-exists.php
Après pour l'erreur donne plus de détail !plz
et bien j'ai fais ça:
class Cart{   private $product;  private $total;  private $quantity = 0;    /**   * Construct   *    */  public function __construct()  {    session_start();     if(!isset($_SESSION['cart']))    {      $_SESSION['cart'] = array();      $this->content = &$_SESSION['cart'];    }  }    /**   * Add Product to cart   *    *    */  public function addProduct(Product $product,$quantity = 10)  {    $quantity_actuelle = $this->content[$product];    $new_quantity = $quantity_actuelle++;    $this->content[$product] = $new_quantity;  }}
puis je fais
include('classes/Product.php'); include('classes/Cart.php');   $product  = new Product('1','XML','Apprendre le XML facile','coverXML.jpg','15.60'); $product2 = new Product('2','Linux','Admin Linux pour les debutants','coverLinux.jpg','12.80'); $product3 = new Product('3','Linux','Admin Linux avancé','coverLinux.jpg','12.80');  $cart = new Cart();  $cart->addProduct($product); $cart->addProduct($product2); $cart->addProduct($product3);   echo "Quantité pour un produit: <b></b>"; echo '<br />'; echo "Quantité total de tous les produits: <b></b>"; echo '<br /><br />';  $cart->getTab();
et l'erreur est :
Warning: Illegal offset type in C:\xampp\htdocs\cart\classes\Cart.php on line **36 **
Warning: Illegal offset type in C:\xampp\htdocs\cart\classes\Cart.php on line 34****Warning: Illegal offset type in C:\xampp\htdocs\cart\classes\Cart.php on line 36****Warning: Illegal offset type in C:\xampp\htdocs\cart\classes\Cart.php on line 34****Warning: Illegal offset type in C:\xampp\htdocs\cart\classes\Cart.php on line 36
Fait vor ta classe Product !
class Product {   private $id;   private $name;   private $describe;   private $photo;   private $price;     /**    * Constructor    *     * @access public    * @param string $name    * @param string $describe    * @param string $photo    * @param float  $price    *     */   public function __construct($id,$name,$describe,$photo,$price)   {     $this->id     = $id;     $this->name   = $name;     $this->describe = $describe;     $this->photo   = $photo;     $this->price   = $price;   }     /**    * Set id product    *     * @access public    * @param int $id    * @return void    *     */   public function setId($id)   {     $this->id = $id;   }     /**    * Return the id product    *     * @access public    * @return int id    *     */   public function getId()   {     return $this->id;   }     /**    * Set the name product    *     * @access public    * @param string $name    * @return void    *     */   public function setName($name)   {     $this->name = $name;   }     /**    * Return the name product    *     * @access public    * @return string name    *     */   public function getName()   {     return $this->name;   }     /**    * Set a describe product    *     * @access public    * @param string $describe    *     */   public function setDescribe($describe)   {     $this->describe = $describe;   }     /**    * Return the description of product    *     * @access public    * @return string describe    *     */   public function getDescribe()   {     return $this->describe;   }     /**    * Set a photo product    *     * @access public    * @param string $photo    * @return void    *     */   public function setPhoto($photo)   {     $this->photo = $photo;   }     /**    * Return a photo product    *     * @access public    * @return string photo    *     */   public function getPhoto()   {     return $this->photo;   }     /**    * Set the price product    *     * @access public    * @param float $price    * @return void    *     */   public function setPrice($price)   {     $this->price = $price;   }     /**    * Return the price product    *     * @access public    * @return float price    *     */   public function getPrice()   {     return $this->price;   }  }
Essaie cela
$cart->addProduct($product->getName());
 $cart->addProduct($product2->getName());
 $cart->addProduct($product3->getName());
Ou sinon met une méthode __tostring dans ta classe product ;) !!
en faite je met toujours une method __soString dans mes classes la je l'ai pas fini !
en faite j'avais penser à cette methode en mettant juste l'id la quantité, et le nom
mais je trouvais ca plus logique de mettre $cart->addProduct(Product $product)
tu pense que c'est le faite que j'ai pas mis la mehode toString qu'il me génère un warning ?
J'en suis sur!
j'ai mis une method to string dans la class poduct
public function __toString() {   $str  = '';   $str .= $this->id."<br />\n";   $str .= $this->name."<br />\n";   $str .= $this->describe."<br />\n";   $str .= $this->photo."<br />\n";   $str .= $this->price."<br />\n"; }
la j'ai toujours l'erreur ! moi perso je pense que l'erreur bien du tableau et la quantité
y'a quelque chose qui va pas mais je vois pas
par contre ca marche mieux quand je fais $cart->addProduct($product->getName());
mais j'aurais voulu employé ma méthode addProduct(Product $product)
je suis sur que c'est possible !
Bien sur que sa marche avec $product->getName() ...
Si tu veux que sa marche avec addProduct(Product $product)
Tu dois mettre
public function __toString()
 {
return $this->name; }
Car la cl'é de ton tableau doit juste contenir le nom du produit et ne peux pas contenir un objet.
Met en résolu si c'est bon ;)
ok je vois ou tu voulais en venir !
j'avais pas capté l'histoire !
en effet c'est le fais que je met un objet comme clé !
et si je fais :
public function addProduct(Product $product){  $quantity_actuelle = $this->content[$product->getName()];  $new_quantity = $quantity_actuelle++;  $this->content[$product] = $new_quantity;}
ca peux m'eviter la tostring !
donc en faite ca marche mais mais j'ai pas la quantité !
public function addProduct(Product $product){  $quantity_actuelle = $this->content[$product->getName()];  $new_quantity = $quantity_actuelle++;  $this->content[$product->getName()] = $new_quantity;}
ca affiche
array {
[XML] =>
[Linux] =>
}
Ok c'est pas parce que ta quantité n'est pas initialisée?
Essaie
public function addProduct(Product $product)
{
  $quantity_actuelle = $this->content[$product->getName()];
  if($quantity_actuelle == NULL)//ou is_null ;)
  $quantity_actuelle = 0;
  $new_quantity = $quantity_actuelle++;
  $this->content[$product->getName()] = $new_quantity;
}
Oulah vous cherchez loin dis donc, il y'a beaucoup plus simple. Regardez ceci par exemple :
<?php class Product{  protected $id = null;  protected $name = null;} class ShoppingCart{  protected $products = array();  protected $cart     = array();   /**   * Add a product to the shopping cart   *   * @param Product $product The product   * @param int $quantity The quantity   */  public function addProduct(Product $product, $quantity = 1)  {    if ($quantity <= 0)    {      throw new Exception('The quantity must be a strict positive value');    }     if (!$this->hasProduct($product))    {      $this->setProduct($product);    }     $this->setQuantity($product, $quantity)  }   public function setProduct(Product $product)  {    $this->products[$product->getId()] = $product;    $this->cart[$product->getId()] = 0;  }   public function setQuantity(Product $product, $quantity)  {    $this->cart[$product->getId()] += (int) $quantity;  }   /**   * Returns wether or not the shopping cart has the product   *   * @param Product $product The product   * @return boolean   */  public function hasProduct(Product $product)  {    return isset($this->products[$product->getId()]);  }}
Ce qui donne à l'utilisation :
<?php $product1 = new Product();$product1->setId(3);$product1->setName('Article 1'); $product2 = new Product();$product2->setId(78);$product2->setName('Article 2'); $product3 = new Product();$product3->setId(12);$product3->setName('Article 3'); $shoppingCart = new ShoppingCart();$shoppingCart->addProduct($product1, 8);$shoppingCart->addProduct($product2, 2);$shoppingCart->addProduct($product3, 19);
Dans l'idée, il faut que tu implémentes le session storage pour mettre en session le tableau $cart qui contient les couples product_id => quantity.
++
Hugo.
ca initialise le compteur à 0 mais ca n'incremente pas !
normale me dira tu il faut peut etre que j'ajoute un produit identique ?
et ne pourrais ton pas créer un attribut de class genre private $quantity;
et gérer la quantité par ce biais ? ca me semble mieux en objet !
je vais tester mais avant je voudrais finir ta method et l'adapté à la mienne ensuite
ok d'accord j'ai rien dis lol
bon mais ca m'auras bien aider quand meme !
merci à Saturn 1 et Emacs !
je met pas encore résolut on c'est jamais !