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 !

15 réponses


Typhon
Réponse acceptée

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

Le if(is_int()) ne change absolument rien ?

Babou
Auteur

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 ?

Pas très normale tout ça, tu peux faire un var_dump de $_POST avant le foreach ?

Babou
Auteur

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

Babou
Auteur

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 ?

Babou
Auteur

UP..

Ba normalement ça doit le faire tout seul dès qu'il y à une actualisation.

Babou
Auteur

Non justement le mot chien reste dans l'input et le total se remet à 0..

Je n'y comprend rien..

Babou
Auteur

Toujours aucunes réponses ?

Babou
Auteur

J'ai vraiment besoin de cette réponse...

Je veux bien t'aider mais j'ai pas très bien compris exactement ce que tu voulais... :/

Babou
Auteur

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.

Babou
Auteur

Nickel ! Ca marche exactement comme ce que je voulais :)

Merci beaucoup beaucoup :D