Salut tout le monde,
Voila j'ai un petit soucis, j'ai suivi le tutoriel de grafikart mais j'ai remarqué que lorsqu'on modifie la quantité dans la partie panier avec des lettres cela fait tout beugé, j'ai essayé d'ajouter au code une condition du type if(is_int()) mais cela ne marche pas.. Quand je dis que cela fait tout beugé, j'entend par la que le prix et les quantités se remettent à zéro, mais le produit s'affiche toujours dans le panier.
Voila le code de la fonction recalc de panier.class.php :
<?php
public function recalc(){
foreach($_SESSION'panier'] as $product_id => $quantity){
if(isset($_POST'panier']'quantity']$product_id])){
$_SESSION'panier']$product_id] = $_POST'panier']'quantity']$product_id];
}
}
}
?>
Si quelqu'un a une idée de comment arranger le problème, merci !
Bon j'ai réfléchis un petit coup, et voilà, je pense, le meilleur système pour faire ce que tu veux ;)
// Permet de recalculer les quantités des produits déjà existants dans le panier
public function recalc(){
// On parcours tout les produits du panier
foreach($_SESSION'panier'] as $product_id => $quantity) {
// Si une nouvelle quantité correspond au produit courant du panier
if(isset($_POST'panier']'quantity']$product_id])) {
$new_quantity = $_POST'panier']'quantity']$product_id];
// Si la nouvelle quantité est une chaine de caractère correspondante à un entier positif
if(preg_match('/^[0-9]+$/', $new_quantity)) {
// Si la quantité est égale à 0, on supprime le produit du panier
if($new_quantity == '0') {
unset($_SESSION'panier']$product_id]);
}
// Sinon on modifie la quantité dans la panier
else {
$_SESSION'panier']$product_id] = $new_quantity;
}
}
}
}
}
On est obliger de passer par un système de preg_match, car un nombre entré dans un champs 'input' de type 'text' d'un formulaire est en faite une chaine de caractère correspondant au nombre et pas le nombre en lui même.
la fonction 'intval' n'était pas la bonne idée car si la chaine de caractère n'est pas un nombre elle le convertis en un 0 et deviens donc un nombre.
Testé et approuvé ;)
Non cela change absolument rien, et même pire lorsque je met is_int() je ne peux même plus modifier !
Voila le code que j'obtient :
<?php
public function recalc(){
foreach($_SESSION'panier'] as $product_id => $quantity){
if(isset($_POST'panier']'quantity']$product_id])){
if(is_int($_POST'panier']'quantity']$product_id])){
$_SESSION'panier']$product_id] = $_POST'panier']'quantity']$product_id];
}
}
}
}
Une idée ?
Voila ce que j'obtient en mettant le var_dump avant le foreach :
array(1) { "panier"]=> array(1) { "quantity"]=> array(1) { [1]=> string(1) "3" } } }
Et ba voilà on à la réponse ;)
on voit que $_POST'panier']'quantity'][1] contient un chaine de caractère "3" et non le nombre 3
fait donc plutôt un if(is_int(intval($_POST'panier']'quantity']$product_id])))
Ah oui en effet cela marche beaucoup mieux !
Cependant, j'aimerai que si on entre le mot "chien" dans le input et qu'on valide le formulaire alors il s'affiche la valeur précédente dans le formulaire, un genre de retour en arrière, mais je ne vois pas comment faire puisque la valeur "chien" est deja enregistré dans le $_SESSION donc aucun retour en arrière possible, si ?
Non justement le mot chien reste dans l'input et le total se remet à 0..
Je n'y comprend rien..
Alors enfaite j'aimerai que lorsqu'on rentre des lettres dans le input ça m'affiche un message d'erreur ou quelque chose dans le type ou alors ça ne le prend pas en compte et ça fait comme si l'on n'avait rien écris.
Parce que là lorsque je tape des lettres ça met le compteur des prix à 0 mais dan sel panier mon article est toujours visible sauf que la quantité vaut "chien" ( c'est le mot que j'ai tapé ). Or j'aimerai que la quantité revienne à la quantité précédente ou alors à 1.