Cuando un usuario proporciona unas credenciales de inicio de sesión correctas (recuerda que tú ya habías añadido el usuario "admin" con contraseña "secreto"), se le redirige de forma automática a la página del listado de productos ("listado.php"
) para que pueda empezar a hacer la compra. Esa es la página que vas a programar a continuación. Como ya se indicó en el apartado anterior se hace uso para los estilos de Bootstrap
y Font Awesome
.
La página se divide en varias partes:
- Al principio comprobamos si existe la variable $
_SESSION['nombre']
, la que creamos al hacer ellogin
, si no es así volvemos a"login.php"
, de esta forma garantizamos que nadie, sin validar, pueda acceder a esta página aunque conozca su URL y la ponga en el navegador.
<?php session_start(); if (!isset($_SESSION['nombre'])) { header('Location:login.php'); } require_once 'conexion.php'; $consulta = "select id, nombre, pvp from productos order by nombre"; $stmt = $conProyecto->prepare($consulta); try { $stmt->execute(); } catch (PDOException $ex) { cerrarTodo($conProyecto, $stmt); die("Error al recuperar los productos " . $ex->getMessage()); } ?>
require_once
a"conexion.php",
hacemos una consulta para recuperar el id, nombre y pvp de todos los productos, que mostraremos en la tabla con el listado de productos. - encabezado. Contiene la cantidad de elementos del carro (para ello, simplemente contamos los elementos del array
$_SESSION['cesta']
), el nombre del usuario (este lo mandamos en la variable$_SESSION['nombre']
) y un botón para cerrar sesión, este botón nos redirige a la página"cerrar.php".
<div class="float float-right d-inline-flex mt-2"> <i class="fa fa-shopping-cart mr-2 fa-2x"></i> <?php if (isset($_SESSION['cesta'])) { $cantidad = count($_SESSION['cesta']); echo "<input type='text' disabled class='form-control mr-2 bg-transparent text-white' value='$cantidad' size='2px'>"; } else { echo "<input type='text' disabled class='form-control mr-2 bg-transparent text-white' value='0' size='2px'>"; } ?> <i class="fas fa-user mr-3 fa-2x"></i> <input type="text" size='10px' value="<?php echo $_SESSION['nombre']; ?>" class="form-control mr-2 bg-transparent text-white" disabled> <a href="cerrar.php" class="btn btn-warning mr-2">Salir</a> </div>
- Botones "Ir a cesta" y "Vaciar Carro". "Ir a cesta" es un enlace a la página
"cesta.php"
y "Vaciar Carro" es unsubmit
a "listado.php".
La página en la que estamos.<form class="form-inline" name="vaciar" method="POST" action='<?php echo $_SERVER['PHP_SELF']; ?>'> <a href="cesta.php" class="btn btn-success mr-2">Ir a Cesta</a> <input type='submit' value='Vaciar Carro' class="btn btn-danger" name="vaciar"> </form>
unset()
de la variable$_SESSION['cesta']
if (isset($_POST['vaciar'])) { unset($_SESSION['cesta']); }
- productos. Contiene el listado de todos los productos ordenados por nombre tal y como figuran en la base de datos. Cada producto figura en una fila (nombre y precio). Se crea un formulario, por cada producto, con un botón "Añadir" que envía a esta misma página el id del producto añadido. Cuando se abre la página, se comprueba si se ha enviado este formulario, y si fuera así se añade un elemento al array asociativo
$_SESSION['cesta']
con el id del producto. A la derecha aparece un check (iconofa-check
) o una X (iconofa-times-circle
) en función de que el producto haya sido añadido o no. Para mostrar los productos hacemos uso de la consulta de arriba.while ($filas = $stmt->fetch(PDO::FETCH_OBJ)) { echo "<tr><th scope='row' class='text-center'>"; echo "<form action='{$_SERVER['PHP_SELF']}' method='POST'>"; echo "<input type='hidden' name='id' value='{$filas->id}'>"; echo "<input type='submit' class='btn btn-primary' name='comprar' value='Añadir'>"; echo "</form>"; echo "</th>"; echo "<td>{$filas->nombre}, Precio: {$filas->pvp} (€)</td>"; echo "<td class='text-center'>"; if (isset($_SESSION['cesta'][$filas->id])) { echo "<i class='fas fa-check fa-2x'></i>"; } else { echo "<i class='far fa-times-circle fa-2x'></i>"; } echo "<td>"; echo "</tr>"; } cerrarTodo($conProyecto, $stmt);
Descargar "listado.php":
listado (pdf - 42,62 KB)