Panier d'achat le célèbre cas d'ecole !

Rechercher

Panier d'achat le célèbre cas d'ecole !

Par Vini  -  20 reponses  -  Le 22/02/2009 15:37  -  Editer  - 

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

Par Vini  -  Le 22/02/2009 15:41  -  Haut de page  - 

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 !

 
Par saturn1  -  Le 22/02/2009 17:38  -  Haut de page  - 

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é!!

 
Par Vini  -  Le 22/02/2009 18:15  -  Haut de page  - 

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 !

 
Par saturn1  -  Le 22/02/2009 19:18  -  Haut de page  - 

Ok je crois que tu dois faire

$quantite_actuelle = $this->content[$product];

$new_quantite = $quantite_actuelle++;

$this->content[$product] = $new_quantite;

 

 

Essaie cela!!!

 
Par Vini  -  Le 22/02/2009 21:07  -  Haut de page  - 

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

 
Par saturn1  -  Le 22/02/2009 21:26  -  Haut de page  - 

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

 
Par Vini  -  Le 22/02/2009 21:33  -  Haut de page  - 

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

 
Par saturn1  -  Le 22/02/2009 21:43  -  Haut de page  - 

Fait vor ta classe Product !

 
Par Vini  -  Le 22/02/2009 21:45  -  Haut de page  - 
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;   }  }
 
Par saturn1  -  Le 22/02/2009 21:47  -  Haut de page  - 

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

 
Par Vini  -  Le 22/02/2009 21:54  -  Haut de page  - 

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 ?

 
Par saturn1  -  Le 22/02/2009 21:55  -  Haut de page  - 

J'en suis sur!

 
Par Vini  -  Le 22/02/2009 22:07  -  Haut de page  - 

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 !

 
Par saturn1  -  Le 22/02/2009 22:10  -  Haut de page  - 

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

 
Par Vini  -  Le 22/02/2009 22:20  -  Haut de page  - 

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 !

 
Par Vini  -  Le 22/02/2009 22:26  -  Haut de page  - 

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] =>

}

 
Par saturn1  -  Le 22/02/2009 22:28  -  Haut de page  - 

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;
}

 

 
Par Emacs  -  Le 22/02/2009 22:36  -  Haut de page  - 

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.

 
Par Vini  -  Le 22/02/2009 22:37  -  Haut de page  - 

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

 
Par Vini  -  Le 22/02/2009 22:39  -  Haut de page  - 

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 !

 

 

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |