Comment ajouter un select a mon panier

Fermé
flexi2202 Messages postés 3798 Date d'inscription lundi 14 mars 2011 Statut Membre Dernière intervention 3 mai 2024 - Modifié le 22 janv. 2022 à 11:20
flexi2202 Messages postés 3798 Date d'inscription lundi 14 mars 2011 Statut Membre Dernière intervention 3 mai 2024 - 15 févr. 2022 à 11:46
bonjour a tous

cela fait un petit moment que je cherche comment je pourrais modifier mon code pour ajouter un select avec des quantités par exemple 1/2/3/4/5 a chacun de mes articles

Pour l'instant lorsque je clic sur ajouter il y a un article qui vient s'ajouter a mon panier

Mais je souhaiterais que l utilisateur puisse choisir un nombre de 1 a 5 et ensuite les ajouter au panier

J'ai donc malgré mes faibles connaissances nouvelles en javascript tenté de modifier le code et surtout de le comprendre

j'ai donc décortiqué le code du mieux que je pouvais

Pour l'instant j'en suis au stade que lorsque je clic sur le bouton ajouter au panier 2 articles s'ajoutent au lieu et place de la quantité que j'ai sélectionné dans le select

voici donc le code avec quelques modifications

// ne pas modifier la suite sauf si vous désirez modifier le code

//on definit la varaible MonPanier 
var MonPanier = (function(){
panier = [];
function Item(nom, prix, quantite) {
this.nom = nom;
this.prix = prix;
this.quantite = quantite;
}

//on sauve le panier 
function savepanier(){
sessionStorage.setItem('MonPanier', JSON.stringify(panier));
}

//on lit le panier 
function loadpanier(){
panier = JSON.parse(sessionStorage.getItem('MonPanier'));
}
if (sessionStorage.getItem("MonPanier") != null) {
loadpanier();
}

//variable objet 
var obj = {};

// on ajoute un article au panier cette partie nous interesse 
obj.ajouter_produit_dans_panier = function(nom, prix, quantite) {
for(var item in panier) {
  if(panier[item].nom === nom) {
//panier[item].quantite ++ ; ancien code 
panier[item].quantite ;
savepanier();
return;
  }
}
var item = new Item(nom, prix, quantite);
panier.push(item);
savepanier();
}

//cette partie nous interesse aussi puisqu elle traite la quantite
obj.setquantiteForItem = function(nom, quantite) {
for(var i in panier) {
  if (panier[i].nom === nom) {
panier[i].quantite = quantite;
break;
  }
}
};

//pour enlever un article 
obj.enlever_produit_de_panier = function(nom) {
  for(var item in panier) {
if(panier[item].nom === nom) {
  panier[item].quantite --;
  if(panier[item].quantite === 0) {
panier.splice(item, 1);
  }
  break;
}
}
savepanier();
}

//pour enlever tous les objets des panier 
obj.enlever_produit_de_panier_tous = function(nom) {
for(var item in panier) {
  if(panier[item].nom === nom) {
panier.splice(item, 1);
break;
  }
}
savepanier();
}

//objet qui vide le panier 
obj.clearpanier = function(){
panier = [];
savepanier();
}

//cet objet est le total de la quantite nous interesse aussi
obj.totalquantite = function(){
var totalquantite = 0;
for(var item in panier) {
  totalquantite += panier[item].quantite;
}
return totalquantite;
}

//cet objet est le total du panier 
obj.totalpanier = function(){
var totalpanier = 0;
for(var item in panier) {
  totalpanier += panier[item].prix * panier[item].quantite;
}
return Number(totalpanier.toFixed(2));
}

//cet abjet list le panier 
obj.listpanier = function(){
var panierCopy = [];
for(i in panier) {
  item = panier[i];
  itemCopy = {};
  for(p in item) {
itemCopy[p] = item[p];
  }
  itemCopy.total = Number(item.prix * item.quantite).toFixed(2);
  panierCopy.push(itemCopy)
}
return panierCopy;
}

return obj;
})();

//cette partie est celle qui est execute lorsque on clic sur le bouton ajouter au panier avec la class ajouter-panier
$('.ajouter-panier').click(function(event) {
  event.preventDefault(); 
  var nom_option = "";
  var prix_option = 0;
 // partie que j'ai supprimer qui ne me sert a rien
  //var option_checkbox = $(this).data('checkbox');
// if (option_checkbox != "") {
 // var checkboxes = document.getElementsByClassName(option_checkbox);
 // for(var i = 0; i < checkboxes.length; i++) {
 //   if (checkboxes[i].checked == true) {
 //    var nom_option = nom_option + " (" + $(checkboxes[i]).data('nom') +")";
 //    var prix_option = prix_option + Number($(checkboxes[i]).data('prix'));
 //   }
 // }
// }  
  //if ($(this).data('select')) 
 // {
// var nom = $(this).data('nom') + " (" + document.getElementById(""+$(this).data('select')+"").value + ")" + //nom_option;
 // }
   var nom = $(this).data('nom');
  var prix = Number($(this).data('prix')) + prix_option;
  var quantite =$(this).data('select');//nouvelle variable qui a un rapport direct avec la data-select
    MonPanier.ajouter_produit_dans_panier(nom, prix,quantite);
 //MonPanier.ajouter_produit_dans_panier(nom, prix,1); ancien code 
 console.log(quantite );// le resultat est de deux
  afficherpanier();
});

$('.clear-panier').click(function(){
  MonPanier.clearpanier();
  afficherpanier();
});



et le code html
     <div class="row mt-3">
<div class="col-md-4">
<p>Produit 02 (15.00 €)</p>
</div>
<div class="col-md-2">
<select class="form-control" id="01">
 <option value="1">1</option>
 <option value="2">2</option>
 <option value="3">3</option>
 <option value="4">4</option>
 <option value="5">5</option>
 </select>
</div>
<div class="col-md-6 text-end">
<a style="cursor:pointer;" data-nom="Produit 02" data-prix="15.00" data-select="01" class="btn btn-primary ajouter-panier">ajouter au panier</a>
</div>
</div>
A voir également:

3 réponses

Salut,
quelques remarques pour t'aider:
ce code n'est pas très organisé.
Par exemple tu crée un objet MonPanier qui contient tout le reste dans une fonction anonyme qui n'est pas utilisable.

var MonPanier = ( function(){
panier = [];

La parenthèse après le "= " indique que l'ensemble est interne donc rien ne peut en sortir sauf ce qui est renvoyé.

Pour créer un objet il existe plusieurs façon de faire, un objet est un paradigme(principe?) de programmation qui regroupe des éléments par thématique et peut ensuite être utilisé.
Bon pour créer un objet plusieurs façons de faire:

Avec Object.create qui est l'ancienne façon de faire qui n'est plus vraiment d'actualité.
Elle permet toutefois l'écriture (dite) prototypale( en utilisant le prototype) et de comprendre cette notion si besoin.

En écriture littérale. Le texte et non une fonction est utilisée pour créer un objet et ses propriétés(nom et valeurs pour le nom de l'objet).
C'est d'ailleurs cette méthode qui est employée ici avec la variable obj

var obj={}

va créer un objet vide.
On peut ensuite lui ajouter des attributs(le nom) et ses valeurs.
obj.maValeur = 3.14//-- ajoute l'attribut mavaleur à l'objet obj

obj.envoiMaValeur= function(){
 console.log(this.mavaleur)//-- le this fait référence à obj ici 
 return this.maValeur
}

voir aussi comment fonctionne les portées d'une variable, elle n'existent que
dans le contexte de leur utilisation(dans une fonction si elle sont crées dans une fonction, dans un objet si elle sont crées dans l'objet... dans les accolades d'u if si elle sont crées dans ...etc
AINSI ON NE PEUT PAS OBTENIR DE L'EXTERIEUR QUELQUE CHOSE QUI EST A L'INTERIEUR D'UNE VARAIBLE, FUNCTION, OBJECT etc...


D'où l'utilisation de return qui permet de renvoyer une valeur, dans l'exemple c'est obj.maValeur (même si obj.maValeur revient au même mais c'est pour un exemple simple du principe).

Bref sans aller plus loin c'est une question d'organisation et de réfléchir au fonctionnement du programme avant d'écrire. De lister les valeurs à utiliser ,
par principe toutes les variables sont mises au début pour les voir d'un coup ce qui simplifie la vie quand on veut/doit utiliser chaque brique ensemble.

Aussi autant se passer de JQuery et le sélecteur du lien pour l'événement gagnerait à être une id plutôt qu'une classe. Une ID est unique, une classe peut être multiple. Cela permet d'éviter des erreurs et d'affirmer un principe(il n'y a qu'un bouton pour le même événement) ce qui le rend plus clair et lisible(donc avec une classe réutilisable pour faire plusieurs boutons).

Essayer de faire l'objet directement dans l'écriture littérale puis de l'utiliser.

Par exemple:
var Panier ={
  listeContenu=[],
 ajouterUnContenu:function(monContenu){
   this.listeConteu.push(monContenu)
 },
 afficherListeContenu=function(){
   console.log(this.listeContenu.toString())//-- utiliser la console c'est la base
 },
obtenirContenu(index){
 return this.listeContenu[idx]
 }

}

var panierTest=Panier()
panierTest.ajouterUnContenu('fraise')
alert(panierTest.obtenirContenu())


Un dernier détail important. Un tableau n'est pas le mieux pour stocker plusieurs valeurs, en tout cas si on veut les utiliser facilement car imbriquer des tableaux peut devenir un peu complexe pour pas grand chose.

On peut par exemple utiliser un objet.
var Contenu=function(nom, nombre, prix){
//-- UNE fonction est utilisée pour créer ET RENVOYER l'objet grâce à return
var temporaire = {
  nom:nom,
  quantite:nombre,
  tarif:prix
}
return temporaire
}


Et donc:
var Panier ={
  listeContenu=[],

 ajouterArticle:function(nom, prix, qte){
 this.listeContenu.push( Contenu(nom, qte, prix) )
 },
obtenirArticle:function(index){
 return this.listeContenu[index]
 },
 obtenirPrixUnitaire(index){
 return this.obtenirObjetContenu(index).tarif
 },
obtenirPrixTotal(index){
return this.obtenirPrixUnitaire(index)*this.listeContenu[index].quantite
}
}

var panierClient=Panier()
panierClient.ajouterArticle('fraise 500gr', 10, 3)
console.log( 'Il y a'+
panierClient.listeContenu[0].quantite+
' de l'article '+
+panierClient.listeContenu[0].nom+
' pour un total de '+
panierClient.obtenirPrixTotal(0)+
'€ ')


0
erratum:
2 erreurs d'avoir écrit vite que la console vous aura indiqué si vous tester le code.

il y a un '+' en trop à la ligne 23(celui du début de la ligne) du dernier exemple de script.

il manque '=function' pour les méthodes de l'objet Panier ligne 10
obtenirPrixUnitaire=function(index)

et ligne 13
obtenirPrixTotal=function(index)


J'ai tapé un peu vite et n'ai pas testé le script.
0
bonjour
waouhhh un vrai cours
un immense merci pour toutes ces explications , ces détails
Je vais devoir relire out cela a tête bien reposée

Mais c'est vrai que tout cela est une question de logique
A partir du moment que l'on connait le langage et que l 'on soit passionné

Ce code est un code que j'ai trouvé et que j'essaye de modifier pour le mettre un peu a ma sauce

En ce qui concerne ce select l'auteur du code l'a modifie et adapter pour finir entre temps

Mais je vais m'inspirer de tes corrections pour essayer de corriger le code que j'ai trouvé dés que j'aurais corriger plusieurs petits dysfonctionnement au niveau de mon site

Car je ne suis ni programmeur , ni un acharné
Je préfère la pêche comme passion

encore un immense merci pour cette aide
0
Si vous faites un programme vous êtes un programmeur.
Si vous jouez de la guitare vous êtes guitariste.
Si vous pêchez vous êtes pêcheur.
Rien n'empêche d'avoir plusieurs passions sauf peut-être dans la vie de couple mais c'est autre chose.
Mais effectivement il faut du travail/de la pratique pour apprendre à jouer de la guitare, pêcher ou faire des programmes. Je n'ai pêché qu'une fois et j'ai attrapé qu'un coup de soleil.

La réponse importante c'est que vous devez avant de penser à une quelconque programmation réfléchir en amont et comprendre ce que vous voulez faire aussi bien que comment le faire.
Si je mets une canne à pêche dans l'eau sans hameçon ou un hameçon sans appât j'aurais peu de chance d'attraper un poisson.
Pour un programme si vous ne détaillez pas les étapes unes à unes(surtout au début après ça devient plus facile avec la pratique, la pêche aussi je suppose et la guitare aussi) et ne connaissez pas bien les outils et la logique derrière vous n'arriverez à rien...

Et tout le monde peut apprendre, condition essentielle pour arriver à réussir quelque chose.
0
flexi2202 Messages postés 3798 Date d'inscription lundi 14 mars 2011 Statut Membre Dernière intervention 3 mai 2024 187
15 févr. 2022 à 11:46
Bonjour
désolé du retard de ma réponse
Mais j'étais plonge au plus profond de on code qui pour la plupart d'entre vous ne serais qu'un apéro
J'essaye de le comprendre et de le modifier pour le faire ressembler a ce que je désire

Mais comme tu dis tout est une question d apprentissage et de s'en donner les moyens
Mais souvent avec l'âge ce que l'on apprends ce jour sera oublie dans 2 semaines
Sauf si on le refais chaque jour et encore ...

Mais si on veux comparer la pêche et la programmation
Lorsque je vais pêcher je sais par ou je dois commencer et comment je vais commencer suivant une suite logique
Je peux très bien prendre du poisson te refiler ma canne et tu ne prendras rien ....

C'est normal puisque je connais le cours d'eau , je connais mon matériel , et je connais ma routine

En programmation c'est la même chose , lorsque on connaît les codes , les routines , les astuces et surtout le langage tout va tout seul
Par contre laisse moi dans un programme et demande moi de modifier un truc
il va me falloir des heures pour y arriver
Alors que pour certaines personnes cela se calcule en secondes

Comme tu dis et je dis il faut s'en donner les moyens et tout dépend du but
si tu viens pêcher avec moi 1 semaine je ne vais pas commencer a te montrer tout de A a Z
je vais te placer a un endroit ou tu prendras du poisson avec ne canne et une bonne ligne
puisque de toute façon tu ne reviendras plus

ben moi en programmation c'est pareil
Ce n'est pas pour réaliser 22 sites ....juste un seul
0