Bonjour a tous !

Je viens vers vous car je me prends la tete depuis quelques jours.
J'ai suivi le tuto pour la création d'un panier, tout fonctionne correctement !

Sauf que j'aimerais modifier deux, trois petites choses...
Par exemple j'essai de faire en sorte que je puisse choisir le nombre d'articles avant de l'ajouter au panier.

Je m'explique:

Actuellement, quand j'ajoute un produit dans le panier, je dois cliquer sur "ajouter au panier", si ej veux en mettre trois, je dois cliquer trois fois sur ce lien.

Ce que j'aimerais faire, c'est en cliquant sur un lien, augmenter le nombre d'article puis cliquer sur "ajouter au panier" et là mettre le nombre d'article que j'aurais mis, dans le panier.

Exemple:

<form method="post" action="ajout.php">
<input type="image" src="img/plus.png" class="plus_prod" onClick=" " />
<span id="count"> 0 </span>
<input type="image" src="img/moins.png" class="moins_prod" onClick=" " />
<input type="submit" class="add_panier" id="addPanier" href="addpanier.php?id=<?= $produit->id; ?>" value="Ajouter au panier" />
</form>

Je n'ai trouvé que cette methode...

Quand on click sur plus_prod, le chiffre de count augmente de un à chaques clicks, d'où le onClick
pareil pour le moins_prod qui lui en retire un
puis le submit qui lui enverra le tout au panier, le produit et le nombre de produit.

Merci d'avance si vous pouvez m'aider à trouver ces lignes à utiliser.
Bonne soirée.

6 réponses


TonyLight
Réponse acceptée

C'est normal, décortiquons ta méthode :

public function add($product_id){
    if(isset($_SESSION'panier']$product_id])){
        // Si le produit est déjà dans le panier, on lui attribut le nombre
        // de produit passé en POST, on ajoute pas...
        $_SESSION'panier']$product_id] = $_POST'nbr_art'];
    }else{
        // Si le produit n'est pas déjà dans le panier, on n'en met qu'un :
        $_SESSION'panier']$product_id] = 1;
    }
}

Il faudrait donc plutôt faire quelque chose du genre :

public function add($product_id){
    if(isset($_SESSION'panier']$product_id])){
        // J'ajoute à la quantité actuelle la valeur passée en POST
        $_SESSION'panier']$product_id] += $_POST'nbr_art'];
        // C'est pareil que $_SESSION'panier']$product_id] = $_SESSION'panier']$product_id] + $_POST'nbr_art'];
    }else{
        // Sinon je lui donne comme quantité de départ la valeur passée en POST :
        $_SESSION'panier']$product_id] = $_POST'nbr_art'];
    }
}

Cela dit , je trouve que ce n'est pas une très bonne manière de faire, et voici ce que je te propose :
D'un coté la classe :

// J'ajoute en paramètre la quantité, avec 1 par défaut pour être sûr.
public function add($product_id, $quantity = 1){
    if(isset($_SESSION'panier']$product_id])){
        $_SESSION'panier']$product_id] += $quantity;
    }else{
        $_SESSION'panier']$product_id] = $quantity;
    }
}

De l'autre ton traitement :

<?php
require 'require.php';
if(isset($_GET'id'])){
    $product = $DB->query('SELECT * FROM produits WHERE id=:id', array('id' => $_GET'id']));
    if(empty($product)){
        die("Ce produit n\'existe pas !");
    }
    // J'ajoute la valeur passée en POST dans ma méthode add :
    $panier->add($product[0]->id, $_POST'nbr_art']);
    echo 'Article dans le panier';
}else{
    echo 'Vous n\'avez sélectionné aucun produit';
}
?>

Mais, si je ne dis pas de bêtises (j'ai pas testé), les deux manières de faire fonctionnent...

J'espère que ça t'aidera :-)

Salut Nicolas. Je pense que tu t'y prends mal. D'abord, pourquoi un href dans ton input ? Le mieux pour reprendre ce que tu fais, c'est de mettre l'id du produit dans un input type hidden...

Ce n'est pas un span que tu dois augmenter ou réduire, mais un input type text, que tu peux ensuite styliser comme tu veux. De cette manière tu auras deux champs, un pour l'id à ajouter au panier, un second pour le nombre de produit...

Tu vois ce que je veux dire ? :-)

J'ai effectivement remplacer par un input type text, je sais pas pourquoi j'avais mis le span, surement les heures durants de recherches qui m'ont lobotomisés le cerveau xD

Après une bonne pause cette après-midi (oui il m'en fallait une ^^)
J'ai presque trouvé comment faire:

<form method="post" action="addpanier.php?id=<?= $produit->id; ?>">
    <input type="image" src="img/plus.png" class="plus_prod" onClick=" " />
    <input type="text" class="nbr_art" name="nbr_art" value="1" />
    <input type="image" src="img/moins.png" class="moins_prod" onClick=" " />
    <input type="submit" class="add_panier" id="addPanier" value="Ajouter au panier" />
</form>

Le traitement ->

public function add($product_id){
    if(isset($_SESSION'panier']$product_id])){
        $_SESSION'panier']$product_id] = $_POST'nbr_art'];
    }else{
        $_SESSION'panier']$product_id] = 1;
    }
}

<?php
require 'require.php';
if(isset($_GET'id'])){
    $product = $DB->query('SELECT * FROM produits WHERE id=:id', array('id' => $_GET'id']));
    if(empty($product)){
        die("Ce produit n\'existe pas !");
    }
    $panier->add($product[0]->id);
    echo 'Article dans le panier';
}else{
    echo 'Vous n\'avez sélectionné aucun produit';
}
?>

Effectivement cela fonctionne, seulement, quand je doit mettre un premier produit et que je veux en mettre 4 d'un coup cela ne fonctionne pas, je dois m'y prendre à deux fois.
La premiere je met le chiffre 4 et je clic sur add panier, ça m'en met un, je refais sur le meme produit et la j'ai un total de 4 et non de 5.

Une idée ?

Super !!

Ta dernière méthode fonctionne parfaitement et c'est vrai que cette méthode est vraiment plus propre !!

Une dernière question,
comment je peux modifier la valeurs du input text avec les input image plus et moins avec du javascript.
J'imagine qu'il faut mettre une ligne java apres onClick mais je ne trouve pas laquel.
As-tu une idée ?

Merci encore pour ton aide ;)

J'aurais surement fait quelque chose dans ce genre là :

<form method="post" action="addpanier.php?id=<?= $produit->id; ?>">
    <input type="image" src="img/plus.png" class="plus_prod" onClick="this.form.nbr_art<?= $produit->id; ?>.value = (parseInt(this.form.nbr_art<?= $produit->id; ?>.value) - 1); return false;" />
    <input type="text" class="nbr_art" name="nbr_art" value="1" id="nbr_art<?= $produit->id; ?>" />
    <input type="image" src="img/moins.png" class="moins_prod" onClick="this.form.nbr_art<?= $produit->id; ?>.value = (parseInt(this.form.nbr_art<?= $produit->id; ?>.value) + 1);return false;" />
    <input type="submit" class="add_panier" id="addPanier" value="Ajouter au panier" />
</form>

Super !! ça fonctionne parfaitement !!! Merci beaucoup !!