Afegir productes al cistell des del catàleg
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;
Codi complet
// Case Afegir que també actúa com a "Actualitzar" segons el cas
case 'afegir': // En cas que l'acció sigui afegir al cistell (cridada sempre desde cataleg.php)
// 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
// 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;
}
// 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;
}
// 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
} 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']
);
}
$_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'
)
);