Traitement d'un input

a marqué ce sujet comme résolu.

Bonjour à tous,

Je viens vers vous car je rencontre un petit problème. Je souhaite que l’utilisateur puisse modifier la quantité d’un objet dans son panier s’il le souhaite, via un input tout simple fait avec bootstrap (cf capture d’écran). Je vous poste le code que je vais expliquer ensuite.

public function updateItem()
    {
        $cartsTable = new CartsTable();
        $cart = $cartsTable->getCart(Auth::getUserId());

        foreach ($cart as $key => $value) {
            $_POST['quantity'] = $key;
            if ($_POST['down'] != $key || $_POST['up'] != $key) {
                array_slice($cart, $_POST['quantity']);
            }
        }
        $cart = serialize($cart);

        $carts = new Carts();
        $carts
            ->setUsers_Id(Auth::getUserId())
            ->setItems($cart);

        $cartsTable->updateCart($carts);
    }

Dans un premier temps, je récupère le panier de l’utilisateur que je déserialize pour ensuite mettre en place le changement de quantité via l’input. Si la valeur est différente, je met à jour le panier après la condition. Sauf qu’il ne se passe absolument rien lors du traitement, la page se recharge, mais la quantité reste la même, je n’ai pas de messages d’erreur, j’ai l’impression que tout le code n’est pas pris en compte. Je vous met ci-dessous le formulaire

   {% for item_id, item in cart %}
                        <tr>
                        <td>{{ product_name(item_id) }}</td>
                        <td>
                            {{ form.start() }}
                            <div class="def-number-input number-input safari_only">
                                <button name="down" onclick="this.parentNode.querySelector('input[type=number]').stepDown()">
                                    <i class="fa fa-minus"></i>
                                </button>
                                <input class="quantity" min="0" name="quantity" value="{{ item.quantity }}" type="number">
                                <button name="up" onclick="this.parentNode.querySelector('input[type=number]').stepUp()">
                                    <i class="fa fa-plus"></i>
                                </button>
                            </div>
                            {{ form.end() }}
                        </td>
                        <td>
                            {{ form.start({action:generate('technicien_cart_item_delete')}) }}
                            {{ tag.input({type:'hidden', name:'product_id', value:item_id}) }}
                            <button type="submit" class="btn btn-danger"><i class="fas fa-trash"></i></button>
                            {{ form.end() }}
                        </td>
                    </tr>
                    {% endfor %}

Je ne sais pas vraiment d’ou peut venir le problème, car la logique me paraissait bonne. Si quelqu’un peut jeter un oeil et me dire ou est-ce que cela cloche, je lui en serait très reconnaissant ! Merci d’avance :)

image.png
image.png

Je traite le panier sous forme de tableau serializé qui contient l’id du produit, le nom et la quantité, cela m’évite d’avoir une nouvelle ligne dans la table par commande. Voici les requêtes que j’utilise :


    public function getCart ($users_id)
    {
        $query = $this->pdo->prepare("SELECT items FROM {$this->table} WHERE users_id = :users_id");
        $query->execute(['users_id' => $users_id]);
        $query->setFetchMode(PDO::FETCH_CLASS, $this->class);
        $cart = $query->fetch();
        return $cart == false ? [] : unserialize($cart->getItems());
    }

    public function updateCart (Carts $cart)
    {
        $query = $this->pdo->prepare("UPDATE {$this->table} SET users_id = :users_id, items = :items");
        $query->execute([
            'users_id' => $cart->getUsers_Id(),
            'items' => $cart->getItems()
        ]);
    }

Oui, j’ai essayé, j’ai mis des dump partout, mais je n’ai même pas de retour pour m’indiquer ce qui cloche …

As-tu activé le mode d’erreur qui lance des exceptions sur PDO ?

La fonction $cart->getItems() renvoie quoi ?


Je trouve un peu bizarre d’avoir des serialize/unserialize à l’extérieur de la relation avec la BDD : ça devrait être dans les class qui communiquent avec ta base que tu devrais gérer ça de façon transparente.

Oui, je m’en sers souvent pour mettre en place d’autres fonctionnalités, jusqu’à présent cela avait toujours fonctionné, je ne comprend pas pourquoi ici il refuse de m’indiquer quoique ce soit.

Elle renvoie les produits (que j’ai nommé items) que contient le panier de l’utilisateur.

En fait c’est pour plus de praticité, cela me permet de ne pas avoir à serialize / unserialize mon tableau à chaque fois, je conviens que ce n’est pas la méthode la plus propre cela dit.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte