Usuario:ManuelRomero/php/smarty/cesta
De WikiEducator
< Usuario:ManuelRomero | php
Revisión a fecha de 19:10 9 feb 2016; ManuelRomero (Discusión | contribuciones)
Probando el ejemplo
- Puedes ver esta parte del ejercicio ejecutándose en la web:
http://www.manuel.infenlaces.com/TiendaCesta/login.php
Nuevas especificaciones
- En esta nueva versión vamos a añadir la parte de la cesta
- Es decir que cuando seleccionemos un nuevo producto, añadamos ese producto a la cesta
- Para ello seleccionaremos o elegiremos productos de la lista de productos, y según los seleccionemos, se añadirán a la cesta.
- Esto modificará la plantilla de lo que antes solo eran los productos pues ahora nos aparecer en la parte de la derecha una cesta
- La cesta contendrá un listado de todos los productos que actualmente hemos comprado.
- La cesta, con su contenido, aparecerá en la pantalla de productos.
- De cada producto aparecerá su código y nombre corto (actualmente en la base de datos no hay nombres cortos), y el precio
- También aparecerá el total de la cesta.
- Para gestionar la cesta tendremos un objeto de la clase cesta: Cesta.php
- Por otro lado tenemos que modificar la plantilla de productos.tpl una platilla
Explicación del funcionamiento
- El siguiente diagrama de uso expone el funcionamiento de la nueva versión
- Par ver claro el escenario dibujamos el siguiente diagrama de uso
- Explicacion
- Usuario selecciona un nuevo producto
- Se incorpora el nuevo producto en la cesta (Cesta.php, BD.php y Producto.php)
- Se exporta el objeto cesta para la plantilla cesta.tpl
- Se exporta el usuario y lista de productos para la plantilla listaProductos.tpl
- Se carga la plantilla productos.tpl que incluirá las platillas cesta.tpl y listaProductos.tpl.
- En esta explicación ya hemos detallado los nuevos ficheros que vamos a incorporar en nuestro desarrollo, los cuales se exponen a continuación
Clases
- Cesta.php
- Vamos a crear una clase Cesta.php
- Una cesta va a ser un conjunto de productos que hemos comprado.
- Además podremos hacer las siguientes acciones:
- nuevo_articulo($codigo) //Añande un nuevo producto a la cesta
- get_productos()// Obtiene los artículos en la cesta
- coste()// Obtiene el coste total de los artículos en la cesta
- vacia // Devuelve true si la cesta está vacía
- guarda_cesta()// Guarda la cesta de la compra en la sesión del usuario
- carga_cesta() // Recupera la cesta de la compra almacenada en la sesión del usuario.
- Todos estos métodos los obtenemos a partir de las especificaciones o ejercicio realizado anteriormente.
- El objeto Cesta queda como se expresa en la siguiente imagen
<?php require_once('DB.php'); class Cesta { protected $productos = array(); // Introduce un nuevo artículo en la cesta de la compra public function nuevo_articulo($codigo) { $producto = DB::obtieneProducto($codigo); $this->productos[] = $producto; } // Obtiene los artículos en la cesta public function get_productos() { return $this->productos; } // Obtiene el coste total de los artículos en la cesta public function get_coste() { $coste = 0; foreach($this->productos as $p) $coste += $p->getPVP(); return $coste; } // Devuelve true si la cesta está vacía public function vacia() { if(count($this->productos) == 0) return true; return false; // alternativa return !(count($this->productos)); } // Guarda la cesta de la compra en uns variable de sesión public function guarda_cesta() { $_SESSION['cesta'] = $this; } // Recupera la cesta de la compra almacenada en la variable de sesión . Si no existía crea una variable de sesión con una instancia del objeto Cesta public static function carga_cesta() { if (!isset($_SESSION['cesta'])) return new CestaCompra(); else return $_SESSION['cesta']; } } ?>
- Dentro de esta clase necesitamos acceder a la base de datos
- Esto implica que incluyamos incluyamos en el fichero DB.php, así como añadir nuevo método en la clase DB.php.
- Dentro de la clase Cesta.php, en el método nuevo artículo necesitamos recuperar los datos de un artículo, para ello creamos el método obtieneProducto($codigo) en la clase DB.php
- Este método a partir de un código de producto nos retorna un objeto de la clase producto.
- DB.php
- Como acabamos de ver a esta clase le añadimos un nuevo método
- Con ello la clase DB.php definitiva quedaría
- El código de este método
/*======================obtieneProducto ($codigo)====================================== Accion: obtiene los datos de un determinado producto cuyo codigo pasamos como argumento Parámetros: $codigo es el codigo del producto cuyos datos queremos Retorna un objeto de la clase producto con sus datos(cod, nombre_corto y PVP * ***********************************************************************************************/ public static function obtieneProducto($codigo) { $valores = array('cod'=>$codigo); $sql = <<<FIN SELECT cod, nombre_corto, nombre, PVP FROM usuarios WHERE cod = :cod FIN; $resultado = self::ejecutaConsulta ($sql,$valores); $producto = null; if(isset($resultado)) { $row = $resultado->fetch(); $producto = new Producto($row); } return $producto; }
Plantillas
- Tenemos que modificar la plantilla de productos.tpl, para añadir la presentación de los datos de la cesta
- Para hacerlo más cómodo vamos a crear una plantilla contenedora que será productos.tpl, y en ella incluiremos por un lado la lista de productos que irá en una plantilla llamadda listaProductos.tpl, y los datos de la cesta que los aportará una plantilla llamada cesta.tpl
- Por lo tanto ahora tendremos tres ficheros para estas plantillas
- productos.tpl
- listaProductos.tpl
- cesta.tpl
- Las palntillas listaProductos y cesta las cargaremos en la plantilla de productos.tpl, usando la instrución de smarty include file=plantilla.tpl.
- El código quedará de la siguiente manera
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Listado de Productos con Plantillas</title> <link href="tienda.css" rel="stylesheet" type="text/css"> </head> <body class="pagproductos"> <div id="contenedor"> <div id="encabezado"> <h1>Listado de productos</h1> </div> <!-- Dividir en varios templates --> <div id=""contenedor> <div id="cesta"> {include file="cesta.tpl"} </div> </div> <div id=""contenedor> <div id="productos"> {include file="listaproducto.tpl"} </div> </div> <br class="divisor" /> <div id="pie"> <form action='logoff.php' method='post'> <input type='submit' name='desconectar' value='Desconectar usuario {$usuario}'/> </form> </div> </div> </body> </html>
- listaProductos.tpl
- Tendría el siguiente código
{foreach from=$productos item=producto} <p><form id='{$producto->getcodigo()}' action='producto.php' method='post'> <input type='hidden' name='cod' value='{$producto->getcodigo()}'/> <input type='submit' name='enviar' value='Añadir'/> {$producto->getnombrecorto()}: {$producto->getPVP()} euros.</form></p> {/foreach}
- cesta.tpl
<id class="pagcesta"> <h3><img src="cesta.png" alt="Cesta" width="24" height="21"> Cesta</h3> <hr /> {if empty($productoscesta)} <p>Cesta vacía</p> {else} {foreach from=$productoscesta item=producto} <p> <span class='codigo'>{$producto->getcodigo()}</span> <span class='precio'>{$producto->getPVP()}</span> </p> {/foreach} <hr /> <span class='coste'> Total: {$coste} €</span> {/if} </id>
La lógica o el códgio
- Ahora vamos a ver que hemos tenido que modificar en el código
- La parte de código la centramos en el fichero producto.php
- Por un lado debemos cargar un objeto cesta con el contenido de la cesta
- El contenido de la cesta la guardamos en una variable de sesión
El código que implementamos para ello sería
$cesta = Cesta::carga_cesta(); // Comprobamos si se quiere añadir un producto a la cesta if (isset($_POST['enviar'])) { $cesta->nuevo_articulo($_POST['cod']); $cesta->guarda_cesta(); }
- $cesta es un objeto de la clase Cesta que recuperará la cesta que tuviéramos o creará una cesta vacía
- Esto lo implementa el método carga_cesta de la clase Cesta.php
- Por otro lado debemos dejar disponibles las variables para la plantilla cesta.tpl
- La variable que queremos exportar es precisamente el objeto $cesta
- Para ello escribimos el siguiente código
//Ponemso disponible para la cesta if ($cesta->vacia()==false){ $smarty->assign('productoscesta', $cesta->get_productos()); $smarty->assign('coste', $cesta->get_coste()); }
- Con esto ya tendríamos terminada la penúltima versión de nuestro trabajo
- No olvidéis subir la cesta.png para que aparezca la imagen