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 !