Salut tout le monde,

J'ai suivi le tutoriel de Grafikart que j'ai un peu repris et ajouter quelque truc. J'ai notamment un peu "améliorer" la fonction de recalcule des stocks lorsqu'on choisit combien on veut d'article.
Et la il y a un problème que je n'arrive pas à résoudre, si jamais j'ai 4 articles en stock et que l'on m'en commande 5 cela affiche 5 dans le input côté client mais du côté de ma BDD ca me met -1 ...

Vous l'aurez compris je cherche un petit bout de code qui me permet de dire si jamais du coté BDD c'est inférieur à 0 ca ne passe pas, mais j'y arrive pas :/

Le problème se situe au niveau du elseif, peut etre que je fais fausse route avec cette idée, si quelqu'un propose autre chose je suis également preneur !

Voici le bout de code :

<?php 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];
                if($new_quantity == $_SESSION'panier']$product_id]){
                    return $_SESSION'panier']$product_id];
                }else{

                    // Si la nouvelle quantité est une chaine de caractère correspondante à un entier positif
                    if(preg_match('/^[0-9]+$/', $new_quantity)){
                        foreach(yield::getStock($product_id) as $stock){
                            $current_stock = $stock->stock;
                        }
                        // Si la quantité est égale à 0, on supprime le produit du panier
                        if($new_quantity == '0') {
                            foreach(yield::getStock($product_id) as $stock){
                                $new_stock = $stock->stock + $_SESSION'panier']$product_id];
                            }
                            yield::setStock($product_id, $new_stock);
                            unset($_SESSION'panier']$product_id]);
                        }elseif($current_stock < 0 ){
                            // LE PROBLEME SE SITUE ICI
                        }
                        // Sinon on modifie la quantité dans le panier
                        else{
                            foreach(yield::getStock($product_id) as $stock){
                                $rifeStock = $stock->stock;

                                if($_SESSION'panier']$product_id] < $new_quantity){
                                    $new_stock = $rifeStock - ($new_quantity - $_SESSION'panier']$product_id]);
                                }else{
                                    $new_stock = $rifeStock + ($_SESSION'panier']$product_id] - $new_quantity);
                                }
                            }
                            yield::setStock($product_id, $new_stock);
                            $_SESSION'panier']$product_id] = $new_quantity;
                        }
                    }
                }
            }

        }

    } ?>

J'espère que quelqu'un pourra m'aider .. Merci ;)

13 réponses


Babou
Auteur

UP ...

Salut,

Premièrement, je ne suis pas sur si c'est une erreur, mais dans :

foreach(yield::getStock($product_id) as $stock){
    $current_stock = $stock->stock;
}

Sois tu veux créer un tableau de stock courrante dans $current_stock, auquel cas tu devrais avoir quelque chose comme :

$current_stock = array();
foreach(yield::getStock($product_id) as $stock){
    $current_stock$product_id] = $stock->stock;
}

Sinon je ne comprends pas trop l'algo (je dois avouer que j'ai lu rapidement :S )

Ma compréhension de ton algo m'échappe encore plus, lorsqu'on arrive a ceci:

// Si la quantité est égale à 0, on supprime le produit du panier
                        if($new_quantity == '0') {
                            foreach(yield::getStock($product_id) as $stock){
                                $new_stock = $stock->stock + $_SESSION'panier']$product_id];
                            }
                            yield::setStock($product_id, $new_stock);
                            unset($_SESSION'panier']$product_id]);
                        }elseif($current_stock < 0 ){
                            // LE PROBLEME SE SITUE ICI
                        }
                        // Sinon on modifie la quantité dans le panier
                        else{ ...

Ici, le premier if regarde si il y a une quantité égal à 0. J'aurais fait ma condition en demandant si $new_quantity > 0. Ainsi, à l'intérieur de ce premier if se retrouvait ton second if, if($current_stock$product_id] < 0). Quelque chose comme :

si quantité commandé est supérieur à 0 alors
  si le stock courant du produit X est inférieur à la quantité commandé
    avertir le client qu'il n'y a pas assez de produit
  sinon
    blablabla

J'espère que cela t'aidera un peu.

Babou
Auteur

Salut tout d'abord merci de ton aide, j'ai un peu modifié le code mais cela ne marche toujours pas, voici ce que j'ai fais :

<?php
if($new_quantity > '0') {

    if($current_stock < '0'){
        return false;
    }else{
    foreach(yield::getStock($product_id) as $stock){
        $rifeStock = $stock->stock;

        if($_SESSION'panier']$product_id] < $new_quantity){
        $new_stock = $rifeStock - ($new_quantity - $_SESSION'panier']$product_id]);
        }else{
        $new_stock = $rifeStock + ($_SESSION'panier']$product_id] - $new_quantity);
        }
    }
    yield::setStock($product_id, $new_stock);
    $_SESSION'panier']$product_id] = $new_quantity;
}
?>

J'ai mis un return false car je ne sais pas quoi mettre d'autre à vrai dire.. J'ai un peu de mal je ne sais pas trop comment faire, si tu pouvais m'éclairer, merci :)

J'ai moi même utilisé le tutoriel pour faire un panier puis j'ai amélioré et rajouter quelques fonctions sympa dont celle de la gestion du stock ;) .
Mais je ne sais pas si je te la passe... tu as été sage ?

Bon aller d'accord voilà:

if( $_SESSION'panier']$product[0]->id] < $product[0]->stock){
                          $products = $this->Session->add($product[0]->id,$product[0]->stock);}

Donc en gros je vérifie que la quantité de produit sélectionné est inférieure à la quantité de produits en stock $product étant un objet contenant les informations sur mon produit.
Si la quantité sélectionné est inférieure alors j'ajoute bien plus un au panier sinon je ne fais rien. Tu peux bien sûr adapter par rapport au tutoriel avec l'input mais personnellement je fonctionne avec un petit + et - qui me permet d'enlever ou ajouter un article et une petit poubelle pour supprimer le produit du panier.

Et dans la fonction add du composants Session:

/**
        * Ajoute un produit à la Session.
        **/
           public function add($product_id,$stock){
            if($_SESSION'panier']$product_id] <= $stock){
           if(isset( $_SESSION'panier']$product_id])){
           $_SESSION'panier']$product_id]++;
           }else{
           $_SESSION'panier']$product_id] = 1;
           }}
           }

Donc en gros si le nombre d'article dans le panier est inférieur ou égale au stock disponible j'incrémente sinon la valeur est égale à 1.
J'espère que ça t'auras été utile ;).

Babou
Auteur

Salut Xtr3me, en réalité cela ne m'a pas beaucoup aidé, j'ai eu du mal à adapter ton code au mien par conséquent je suis passé par un autre moyen !

Merci quand même pour ta réponse qui était tout de même intéressante :)

En effet j'ai modulé pas mal des parties de ce tutoriel pour l'adapter à mes besoins ce qui fait qu'il faut peut être en refaire une adaptation sur d'autres écosystème.

Par contre ta classe statique yield elle contient quoi exactement ?

Babou
Auteur

Elle contient toutes les fonctions dont j'ai besoin pour traiter mes produits ! (affichage, suppression, ajout, modif, etc..)

Ne sais pas, je viens de lire tout ça !

Babou
Auteur

Pardon triey ?

Ok d'où le nom yield pour gestion ^^ .
Et pourquoi avoir mis le code avec les balises php ?
En tout cas normalement si la fonction getStock te permet de récupérer le stock du produit comme son nom le suggère alors tu pourrais faire ceci:

$stock = yield::getStock($product_id);
if( $_SESSION'panier']$product[0]->id] < $stock){
      $products = $this->Session->add($product[0]->id,$stock);}

Et mettre dans ta fonction ajout une incrémentation que si le stock est suffisant. Enfin tout dépend de comment tu as réorganisé le tout.
Je pense je vais faire comme toi et faire une classe statique pour les fonctions de panier plutôt que d'intégrer ça dans le controller principal etc...

Babou
Auteur

En réalité j'ai d'abord fait cela, j'ai comparé la nouvelle quantité à mon stock, je te laisse voir le bout de code :

$new_quantity correspond à $_POST'panier']'quantity']$product_id] donc à la quantité entrée dans l'input et $current_stock correspond au stock dans la BDD.

<?php
if($new_quantity > $current_stock){
    $_SESSION'panier']$product_id] = $current_stock;
    yield::setStock($product_id, 0);
}
?>

Ok on a donc bien la même chose mais tu as recrée une variable nouvelle quantité à partir de la quantité de produit désiré.
Moi la quantité de produit désiré est stocké dans la Session et c'est ce qui est dans la Session qui est directement comparé au stock actuel.
Mis à part ça je trouve que tu t'es bien cassé la tête sur ton code.

Babou
Auteur

Oui c'est vrai que je me suis un peu embêté sur mon code.. Je vais essayé de passer par un autre moyen avec les listes déroulantes ce sera beaucoup plus simple.