Catàleg

De Wiki personal d'en Guillem Serrat

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']) || !is_array($_SESSION['cistell'])) { // Si el cistell no està inicialitzat o no és una array

   $_SESSION['cistell'] = array();

}

A més, hem de requerir una connexió a la BD. En aquest cas, dins del catàleg únicament mostrarem els productes i no farem cap modificació a la BD, per tant farem servir la connexió de lectura.

require_once "./connexioBD/connexioR.php";

Comptador del cistell

Dins de l'aplicació, hi ha un botó en forma de cistell que mostra la quantitat d'unitats de tots els productes es troba dins del cistell

Inicialment, la quantitat de productes és 0, però en cas que, desde la sessió es comprovi que hi ha productes, per cada producte revisarà la seva quantitat (es pot consultar [[Afegir productes al cistell des del catàleg#Exemple de model de dades de l'array $SESSION[cistell] amb productes|Exemple de model de dades de l'array $SESSION[cistell] amb productes]] per entendre el model de dades del cistell).

Un cop recuperi la quantitat del producte, sumarà aquesta quantitat al comptador. Això es realitzarà per cada producte, fins tenir la suma de totes les quantitats de tots els productes.

// Comptador de productes al cistell
$comptador = 0; // El comptador inicial és 0
foreach ($_SESSION['cistell'] as $prod) { // Per cada producte
    if (is_array($prod) && isset($prod['quantitat'])) { // Ens assegurem que el producte és una array i que el vector "quantitat" existeix
        $comptador = $comptador + (int)$prod['quantitat']; // Asignem que comptador és igual al comptador més la quantitat (convertida a int)
    }
}

Obtenció de productes amb i sense cerca

El següent pas serà fer una consulta SQL per recuperar els productes de la BD. En cas que s’hagi realitzat una cerca, ho sabrem ja que s’ha enviat un formulari GET amb el camp “nom” o el camp “categoria”

Per tant, si es cerca per nom, ens arribarà el camp "nom" i aprovarà el següent condicional

// Filtrar per nom
    if (!empty($_GET['nom'])) { // En cas que s'hagi rebut algun valor pel camp "nom" (i per tant fer una cerca per nom)
        $cerca = "nom"; // Definim que a la consulta SQL es filtrarà per nom
        $valor = "%" . $_GET['nom'] . "%"; // Afegim els % degut a que és sintaxis de les consultes SQL
        $sql = "SELECT * FROM productes WHERE $cerca LIKE :valor"; // Exemple: SELECT * FROM productes WHERE nom LIKE %pc%
        $stmt = $pdo->prepare($sql);
        $stmt->bindParam(':valor', $valor);
        $stmt->execute();

En canvi, si ens arriba el camp "categoria", aprovarà el següent condicional

// Filtrar por categoría

   } elseif (!empty($_GET['categoria'])) { // En cas que s'hagi rebut algun valor pel camp "categoria" (i per tant fer una cerca per categoria)
       $cerca = "categoria"; // Definim que a la consulta SQL es filtrarà per categoria
       $valor = "%" . $_GET['categoria'] . "%"; // Afegim els % degut a que és sintaxis de les consultes SQL
       $sql = "SELECT * FROM productes WHERE $cerca LIKE :valor"; // Exemple: SELECT * FROM productes WHERE categoria LIKE %periferic%
       $stmt = $pdo->prepare($sql);
       $stmt->bindParam(':valor', $valor);
       $stmt->execute();

Si pel contrari no arriba cap cerca (i per tant, volem obtenir tots els productes de la BD), s'aprovarà el següent condicional

// En cas que no s'hagi enviat cap camp del formulari (no hi ha cap cerca)

   } else {
       $sql = "SELECT * FROM productes"; // Consulta per defecte, tots els productes
       $stmt = $pdo->prepare($sql);
       $stmt->execute();
   }

Per últim, sigui quina sigui la consulta realitzada, la desarem a la variable $productes preparada per ser recorreguda per un foreach

$productes = $stmt->fetchAll();

Mostra de missatges d'error o èxit

Quan s'afageix un producte al 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 afegit $quantitat {$producte['nom']} al 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 catàleg 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>

Mostra de productes

Fluxe de l'aplicació

Si és la primera vegada que s'entra a l'aplicació, el flux serà el següent:

  1. Es crea el cistell
  2. Comptador del cistell mostra 0 unitats
  3. Obtenció de productes sense cerca
  4. Mostra de productes (amb l'stock de tots els productes obtinguts de la BD)
  5. S'afageix un producte amb X unitats al cistell
  6. Es redirigeix al catàleg

Si s'entra al catàleg després d'afegir un producte al cistell, el flux serà el següent:

  1. Comptador del cistell mostra X unitats (les afegides)
  2. Obtenció de productes sense cerca
  3. Mostra del missatge d'èxit
  4. Mostra de productes (amb l'stock real calculat d'aquell producte afegit, no obtingut de la BD)

Codi sencer