Cistell: diferència entre les revisions
| Línia 60: | Línia 60: | ||
Mitjançant un foreach, per cada producte es crearà una fila on es definiràn els aspectes abans comentats, a més de realitzar un càlcul de preu i descompte | Mitjançant un foreach, per cada producte es crearà una fila on es definiràn els aspectes abans comentats, a més de realitzar un càlcul de preu i descompte | ||
=== Càlcul de totals, subtotals i descomptes === | === <u>Càlcul de totals, subtotals i descomptes</u> === | ||
Primerament, calcularem el subtotal de cada producte mitjançant la funció [[Funcions de la pràctica 5.2#Funció calcularPreus|calcularPreus]], la qual ens retorna: | |||
= | * Preu original (Quantitat * Preu unitari) | ||
* Preu descomptat, si és el cas | |||
* % descomptat | |||
<pre> | |||
$preusProducte = calcularPreus($prod['preu'], $prod['quantitat']); // Calculem el seu preu segons la quantitat i els possibles descomptes (també retorna el preu sense descopmpte) | |||
</pre>Seguidament, afagarem el preu descomptat (ja que si no hi ha cap descompte, té el mateix valor que el preu original) i el sumem a la variable $total declarada a l'inici del codi, que indica el total de la compra<pre> | |||
$total += $preusProducte['total_final']; //Sumem el preu final del producte al total de la compra | |||
</pre> | |||
=== | === <u>Gestió de l'stock</u> === | ||
Més endavant veurem com s'implementa una funcionalitat que permet afegir més untiats d'un producte des del propi cistell. Això significa que hem de fer el mateix que al catàleg i mantenir un control de l'stock per evitar poder afegir més unitats al cistell de les que realment hi ha. | |||
=== | Per això, farem una consulta SQL per recuperar l'stock de la BD del producte<pre> | ||
// Obtenim el seu stock | |||
$stmt = $pdo->prepare("SELECT estoc FROM productes WHERE id = :id"); | |||
$stmt->bindParam(":id", $id); | |||
$stmt->execute(); | |||
$stockBD = (int)$stmt->fetchColumn(); | |||
</pre>Per a continuació, definir el nombre màxim d'unitats que es poden afegir al cistell restant a l'stock de la BD les unitats del cistell<pre> | |||
$maxAfegir = $stockBD - $prod['quantitat']; // Stock real (BD - Cistell) | |||
if ($maxAfegir < 0) { | |||
$maxAfegir = 0; | |||
} | |||
</pre> | |||
=== | === <u>Mostra de característiques bàsiques del producte</u> === | ||
=== | === <u>Mostra del preu</u> === | ||
=== | === <u>Botons d'acció</u> === | ||
==== | ==== <u>Afegir productes</u> ==== | ||
=== Mostra del total de compra === | ==== <u>Retirar productes</u> ==== | ||
==== <u>Eliminar un producte del cistell</u> ==== | |||
=== <u>Mostra del total de compra</u> === | |||
== Botons d'acció i navegació == | == Botons d'acció i navegació == | ||
=== Botó de compra === | === <u>Botó de compra</u> === | ||
=== Botó per buidar el cistell === | === <u>Botó per buidar el cistell</u> === | ||
=== Botó per tornar al catàleg === | === <u>Botó per tornar al catàleg</u> === | ||
Revisió del 21:48, 30 des 2025
Inicialització de la sessió i connexió a la BD
Sempre que es treballa amb sessions, el primer que hem de fer és iniciar-la abans d'escriure el codi HTML
session_start();
A partir d'aquí, l'element principal d'aquesta aplicació és el cistell, el qual està present a la sessió i requerit per la majoria de codis. Per això, hem de comprovar que estigui creat, i en cas que no ho estigui, que es creï.
// Inicialitzar cistell if (!isset($_SESSION['cistell'])) {
$_SESSION['cistell'] = array();}
A més d'incloure la connexió a la BD i requerir el fitxer funcions.php, on es troba la funció calcularPreus
require_once "funcions.php"; require_once "./connexioBD/connexioR.php";
Per últim, sempre inicialitzarem una variable que indicarà el total de compra. La inicialitzem aquí perquè s’utilitza dins d’un bucle i no hi ha cap altre lloc per declarar-la. Com que és un bucle, si la declaréssim dins, el valor del total es reiniciaria a 0 a cada iteració, i volem que el total s’acumuli al llarg de totes les iteracions
$total = 0; // Inicialitzem la variable del preu total
Mostra de missatges d'error o èxit
Quan s'afageix, es retira o s'elimina un producte del cistell des del propi cistell, el procés el realitza el codi processa.php, que depenent del resultat de l'operació, ens pot enviar un missatge d'èxit o d'error mitjançant la sessió
// Si processa.php realitza correctament l'operació, catàleg.php veuria el següent: $_SESSION['missatge_ok'] = "S'ha retirat 1 unitat(s) de Teclat mecànic del cistell."; // Si processa.php no realitza correctament l'operació, catàleg.php veuria el següent: $_SESSION['missatge_error'] = "X" // Depenent de l'error es mostrarà un missatge o un altre
Per tant, dins del cistell hem de comprovar si hem rebut aquest missatge (ja sigui el d'error o èxit), i en cas afirmatiu, mostrar-lo
<!-- Missatge de confirmació d'accions -->
<center> <?php if (isset($_SESSION['missatge_ok'])): // Quan s'enviï un missatge de confirmació?> <p style="color: green; font-weight: bold;"> <?php echo htmlspecialchars($_SESSION['missatge_ok']); // Mostrem el missatge unset($_SESSION['missatge_ok']); // Eliminem el missatge, així al recarregar la pàgina no tornarà a sortir, únicament mostrant-se un sol cop ?> </p> <?php endif; ?> </center><!-- Missatge d'error --> <center> <?php if (isset($_SESSION['missatge_error'])): // Quan s'enviï un missatge d'error?> <p style="color: red; font-weight: bold;"> <?php echo htmlspecialchars($_SESSION['missatge_error']); // Mostrem el missatge unset($_SESSION['missatge_error']); // Eliminem el missatge, així al recarregar la pàgina no tornarà a sortir, únicament mostrant-se un sol cop ?> </p> <?php endif; ?> </center>
Un exemple d'un missatge seria el següent:

Mostra de productes
La mostra de productes és bàsicament una taula amb les següents columnes:
- Imatge
- Nom del producte
- Preu unitari
- Quantitat
- Subtotal
- Accions
Mitjançant un foreach, per cada producte es crearà una fila on es definiràn els aspectes abans comentats, a més de realitzar un càlcul de preu i descompte
Càlcul de totals, subtotals i descomptes
Primerament, calcularem el subtotal de cada producte mitjançant la funció calcularPreus, la qual ens retorna:
- Preu original (Quantitat * Preu unitari)
- Preu descomptat, si és el cas
- % descomptat
$preusProducte = calcularPreus($prod['preu'], $prod['quantitat']); // Calculem el seu preu segons la quantitat i els possibles descomptes (també retorna el preu sense descopmpte)
Seguidament, afagarem el preu descomptat (ja que si no hi ha cap descompte, té el mateix valor que el preu original) i el sumem a la variable $total declarada a l'inici del codi, que indica el total de la compra
$total += $preusProducte['total_final']; //Sumem el preu final del producte al total de la compra
Gestió de l'stock
Més endavant veurem com s'implementa una funcionalitat que permet afegir més untiats d'un producte des del propi cistell. Això significa que hem de fer el mateix que al catàleg i mantenir un control de l'stock per evitar poder afegir més unitats al cistell de les que realment hi ha.
Per això, farem una consulta SQL per recuperar l'stock de la BD del producte
// Obtenim el seu stock
$stmt = $pdo->prepare("SELECT estoc FROM productes WHERE id = :id");
$stmt->bindParam(":id", $id);
$stmt->execute();
$stockBD = (int)$stmt->fetchColumn();
Per a continuació, definir el nombre màxim d'unitats que es poden afegir al cistell restant a l'stock de la BD les unitats del cistell
$maxAfegir = $stockBD - $prod['quantitat']; // Stock real (BD - Cistell) if ($maxAfegir < 0) {
$maxAfegir = 0;}