Factorisation de code

Eléphanteau du PHP | 23 Messages

19 mars 2020, 16:36

Bonjour à tous,

Je travail actuellement sur de la factorisation de code, exercice que je trouve particulièrement difficile, et je galère totalement. J'ai créer un petit script qui permet d'ajouter des produits dans un panier et de les supprimer. Le code fonctionne très bien, mais il n'est pas vraiment propre, et dans un soucis d'optimisation, je dois le transformer en une fonction. Mais je n'ai pas l'habitude de faire ça et je ne comprend pas comment je pourrais m'y prendre.

Voici le code en question :
if (isset($_POST) && !empty($_POST)) {

    $post = $_POST;

    if(!isset($action)){
        $tab = [$_POST["product_id"] . "a" => ["qt" => $_POST["qt"]]];

        if (existPanier($post, $panier)) {
            $index = $_POST["product_id"] . "a";
            unset($panier[$index]);
            $tab2 = array_merge($panier, $tab);
            $test = $ordersModel->addPanier($user->id,serialize($tab2));
            redirect("/commandes");
        } else {
            $tab2 = array_merge($panier, $tab);
            $test = $ordersModel->addPanier($user->id,serialize($tab2));
            redirect("/commandes");
        }
    }

    if(isset($_POST['delete_product'])) {

        if (existPanier($post,$panier)){
            $index = $_POST["product_id"] . "a";
            unset($panier[$index]);
            $test = $ordersModel->addPanier($user->id,serialize($panier));
            redirect("/commandes/panier");
        }
    }

}
Je ne comprend pas bien comment je dois m'y prendre pour simplifier tout ça étant donné que je fais déjà appel à des fonctions dans ce code, votre aide est la bienvenue ! Merci d'avance !

Avatar du membre
Mammouth du PHP | 1235 Messages

19 mars 2020, 17:10

Dur de t'aiguiller sur ce bout de code, on ne voit pas d'où vient $panier, comment il est initialisé, on ne voit pas d'où vient $action.

En tout cas je vois une redondance de code :
$tab2 = array_merge($panier, $tab);
$test = $ordersModel->addPanier($user->id,serialize($tab2));

Mais pourquoi n'as tu pas un code plus simple du genre :
// crée le panier si inexistant et retourne le panier
$panier = $ordersModel->getPanier($userId);

// ajoute le produit si non présent ou met à jour la quantité
$panier->addProduct($productId, $quantity);

// supprime le produit du panier
$panier->removeProduct($productId);

// met à jour le panier
$ordersModel->setPanier($userId, $panier);

A priori tu pourrais même faire directement :
$ordersModel->addProduct($userId, $productId, $quantity);
$ordersModel->removeProduct($userId, $productId);
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

Eléphanteau du PHP | 23 Messages

19 mars 2020, 17:19

En fait, je fais appel dans ce code à des fonctions qui sont dans mon Model et qui contiennent mes requêtes pour ajouter les produits dans le panier (addPanier) et pour afficher ce dernier (getUserPanier).

Je fais des vérifications dans le code, d'ou la redondance, et effectivement le simplifier. Je vais essayer, sur le modèle que tu m'as donné, de faire quelque chose dans ce style, en gros il faut que je simplifie au maximum mon code comme tu l'as fait. Merci d'avoir pris le temps de me répondre !

Eléphanteau du PHP | 23 Messages

20 mars 2020, 15:35

Alors j'ai avancé, j'ai plus ou moins réussi à factoriser mon code, du moins à le rendre plus propre et fonctionnel :
if (isset($_POST) && !empty($_POST)) {

    $post = $_POST;

    if (isset($post['product_id'])) {
        $id = $post['product_id'] . 'a';
        $quantity = isset($post['qt']);

        if (isset($post['delete_product'])) {
            unset($panier[$id]);
            $redirect = '/commandes/panier';
        } else {
            $panier[$id] = $quantity;
            $redirect = '/commandes';
        }
        $test = $ordersModel->addPanier($user->id, serialize($panier));
        redirect($redirect);
    }

}
L'ajout du produit dans le panier et la suppression fonctionnent très bien, le seul soucis c'est que maintenant je n'arrive plus à afficher la quantité. Quand je fais un var_dump, je vois que toutes les quantités de mes produits sont à 1, et je n'arrive pas à corriger le problème ><

Mammouth du PHP | 1348 Messages

20 mars 2020, 15:51

$quantity = isset($post['qt']);
qu'est sensé faire cette ligne ?

Eléphanteau du PHP | 23 Messages

20 mars 2020, 15:54

Je vérifie si dans mon formulaire le $_POST['qt] existe et je lui définie $quantity comme variable

Mammouth du PHP | 1348 Messages

20 mars 2020, 16:09

dans ce cas, le nom de la variable est très mal choisi.

Eléphanteau du PHP | 23 Messages

20 mars 2020, 16:20

J'ai beau creuser je ne vois pas pourquoi je ne récupère pas la quantité

Avatar du membre
Mammouth du PHP | 1235 Messages

20 mars 2020, 18:19

Parce que tu récupères un booléen true ou false selon que post qt soit définit ou non.
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^