Afegir productes al cistell des del catàleg

De Wiki personal d'en Guillem Serrat

Afegir productes al cistell des del catàleg

L'objectiu d'aquesta operació és afegir una quantitat d'unitats d'un producte al cistell des del catàleg

Aquesta petició arriba per part del codi del catàleg i la seva acció és "afegir". Aquesta operació ens fa arribar la ID del producte i la quantitat a afegir

Primerament, haurem de verificar que la ID que ha arribat és vàlida i un nombre

// Validar ID
        if (!isset($_POST['id']) || !is_numeric($_POST['id'])) { // Verifiquem que el producte té una ID i que és numèrica
            $_SESSION['missatge_error'] =
            "ID de producte no vàlid";
            header("Location: cataleg.php");
            exit;
        }

        $id = (int)$_POST['id']; // Assignem la ID del producte a una variable verificant que és INT

Seguidament, haurem de verificar la quantitat. Si és menor o igual a 0 enviarem un missatge d’error i retornarem l’usuari al catàleg, mostrant el missatge d’error

// Definir i validar quantitat de productes a afegir

       $quantitat = (int)$_POST['quantitat']; // Agafa la quantitat del producte
       if ($quantitat <= 0) { // En cas que sigui 0 o menor, no es processa la quantitat
           $_SESSION['missatge_error'] =
           "Quantitat no vàlida";
           header("Location: cataleg.php");
           exit;
       }

El següent pas serà recuperar els detalls del producte segons la ID proporcionada. Recuperem tots els detalls del producte ja que dins de la sessió hem d'especificar-los. Més endevant es comprovarà. En cas que la ID sigui errònia, no recuperarà cap producte i es redirigirà al catàleg indicant que el producte no existeix

// Obtenir dades del producte
        $stmt = $pdo->prepare(
            "SELECT nom, preu, estoc, imatge, categoria
            FROM productes
            WHERE id = :id"
        );
        $stmt->bindParam(":id",$id);
        $stmt->execute();
        $producte = $stmt->fetch();

        if (!$producte) { // En cas que el producte no existeixi
            $_SESSION['missatge_error'] =
            "El producte no existeix";
            header("Location: cataleg.php");
            exit;
        }

A continuació, afegirem el producte dins del cistell. Aquí definim tots els detalls del producte, i afegim el producte dins de l'array de la sessió "cistell" amb l'identificador del seu ID de producte de la BD (es pot consultar l'Exemple de model de dades de l'array $SESSION[cistell] amb productes per entendre el model de dades del cistell).

} else { // En cas que el producte no hi sigui al cistell (AFEGEIX)

           $_SESSION['cistell'][$id] = array( // Inserim el producte al cistell
               'nom' => $producte['nom'],
               'preu' => $producte['preu'],
               'quantitat' => $quantitat, // On la quantitat es defineix segons el nombre de productes a introduir al cistell
               'imatge' => $producte['imatge'],
               'categoria' => $producte['categoria']
           );
       }

En cas que el producte ja existeixi al cistell (comprovant si a la array del cistell de la sessió existeix la ID del producte) únicament caldrà actualitzar la quantitat d'unitats, sumant el que ja hi havia al cistell amb la nova quantitat a introduir

// Afegir o actualitzar producte al cistell
        if (isset($_SESSION['cistell'][$id])) { // Si el producte està al cistell (ACTUALITZA)
            $_SESSION['cistell'][$id]['quantitat'] = $_SESSION['cistell'][$id]['quantitat'] + $quantitat; // Agafem la quantitat que hi ha al cistell i hi afegim la quantitat inserida


Per últim, únicament cal definir la variable del missatge dins de la sessió (i per tant, quan es redirigeixi al catàleg, es mostrarà) i redirigir l'usuari al catàleg

$_SESSION['missatge_ok'] = "S'ha afegit $quantitat {$producte['nom']} al cistell.";
header("Location: cataleg.php");
exit;

Exemple de model de dades de l'array $SESSION[cistell] amb productes

// Valors no reals
$_SESSION['cistell'] = array(
    101 => array( // ID de producte
        'nom' => 'Teclat mecànic',
        'preu' => 79.99,
        'quantitat' => 2,
        'imatge' => 'teclat.jpg',
        'categoria' => 'Informàtica'
    ),
    205 => array( // ID de producte
        'nom' => 'Altaveu Bluetooth',
        'preu' => 49.50,
        'quantitat' => 1,
        'imatge' => 'altaveu.jpg',
        'categoria' => 'Audio'
    )
);