Diferencia entre revisiones de «Usuario:ManuelRomero/php/smarty/cesta»

De WikiEducator
Saltar a: navegación, buscar
Línea 14: Línea 14:
 
*En la parte inferior tendremos  el total de la cesta.
 
*En la parte inferior tendremos  el total de la cesta.
 
*En la siguiente imagen podemos ver cómo queda la cesta después de comprar 1 unidad de un producto y 3 de otros dos productos.
 
*En la siguiente imagen podemos ver cómo queda la cesta después de comprar 1 unidad de un producto y 3 de otros dos productos.
[[imagen: cestaTienda.png|300px]]
+
[[imagen: cestaTienda.png|300px|center]]<br />
 
*Para gestionar la cesta tendremos un objeto de la clase cesta: '''''Cesta.php'''''
 
*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, según se indica en las líneas siguiente.
 
*Por otro lado tenemos que modificar la plantilla de productos.tpl una platilla, según se indica en las líneas siguiente.
Línea 22: Línea 22:
 
*Par ver claro el escenario dibujamos el siguiente diagrama de uso
 
*Par ver claro el escenario dibujamos el siguiente diagrama de uso
 
[[Archivo:CasosUso4.png|500px]]
 
[[Archivo:CasosUso4.png|500px]]
*Explicación
+
*Explicación:
#Usuario selecciona un nuevo producto
+
#El usuario selecciona un nuevo producto
 
#Se incorpora el nuevo producto en la cesta (Cesta.php, BD.php y Producto.php)
 
#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 objeto cesta para la plantilla cesta.tpl
Línea 38: Línea 38:
 
#get_productos()// Obtiene los artículos en la cesta
 
#get_productos()// Obtiene los artículos en la cesta
 
#coste()// Obtiene el coste total de 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
+
#vacia() // Devuelve true si la cesta está vacía
 
#guarda_cesta()// Guarda la cesta de la compra en la sesión del usuario
 
#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.
 
#carga_cesta() // Recupera la cesta de la compra almacenada en la sesión del usuario.
Línea 49: Línea 49:
  
 
class Cesta {
 
class Cesta {
     protected $productos = array();
+
     protected $productos = [];
 
+
    protected $unidades = [];
 
//...
 
//...
 
</source>
 
</source>
<!--
+
 
  
 
      
 
      
    // Introduce un nuevo artículo en la cesta de la compra
+
  // Introduce un nuevo artículo en la cesta de la compra
 
     public function nuevo_articulo($codigo) {
 
     public function nuevo_articulo($codigo) {
         $producto = DB::obtieneProducto($codigo);
+
 
        $this->productos[] = $producto;
+
         if ($this->unidades[$codigo] > 0) {
 +
            $this->unidades[$codigo] ++;
 +
        } else {
 +
            $producto = DB::obtieneProducto($codigo);
 +
            $this->productos[] = $producto;
 +
            $this->unidades[$codigo] = 1;
 +
        }
 
     }
 
     }
      
+
     ...
 +
<!--
 
     // Obtiene los artículos en la cesta
 
     // Obtiene los artículos en la cesta
 
     public function get_productos() { return $this->productos; }
 
     public function get_productos() { return $this->productos; }

Revisión de 09:22 7 abr 2017



Probando el ejemplo

  • Puedes ver esta parte del ejercicio ejecutándose en la web:
http://manuel.infenlaces.com/dwes/tienda/TiendaCesta/login.php

Nuevas especificaciones

  • En esta nueva versión vamos a añadir la parte de la cesta.
  • Cuando seleccionemos un nuevo producto, añadiremos 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; Lo que antes solo eran los productos, ahora nos aparecerán en la parte derecha constituyendo la cesta de la compra.
  • La cesta contendrá un listado de todos los productos que actualmente hemos comprado.
  • De cada producto anotaremos la cantidad de productos incorporados, así como su precio
  • En la parte inferior tendremos el total de la cesta.
  • En la siguiente imagen podemos ver cómo queda la cesta después de comprar 1 unidad de un producto y 3 de otros dos productos.
CestaTienda.png

  • 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, según se indica en las líneas siguiente.

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

CasosUso4.png

  • Explicación:
  1. El usuario selecciona un nuevo producto
  2. Se incorpora el nuevo producto en la cesta (Cesta.php, BD.php y Producto.php)
  3. Se exporta el objeto cesta para la plantilla cesta.tpl
  4. Se exporta el usuario y lista de productos para la plantilla listaProductos.tpl
  5. 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:
  1. nuevo_articulo($codigo) //Añande un nuevo producto a la cesta
  2. get_productos()// Obtiene los artículos en la cesta
  3. coste()// Obtiene el coste total de los artículos en la cesta
  4. vacia() // Devuelve true si la cesta está vacía
  5. guarda_cesta()// Guarda la cesta de la compra en la sesión del usuario
  6. 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

Cesta.png

<?php
require_once('DB.php');
 
class Cesta {
    protected $productos = [];
    protected $unidades = [];
//...


  // Introduce un nuevo artículo en la cesta de la compra
   public function nuevo_articulo($codigo) {
       if ($this->unidades[$codigo] > 0) {
           $this->unidades[$codigo] ++;
       } else {
           $producto = DB::obtieneProducto($codigo);
           $this->productos[] = $producto;
           $this->unidades[$codigo] = 1;
       }
   }
   ...
  • 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

DB3 .png

  • 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) {

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

PlantillaProductos.png

  • Por lo tanto ahora tendremos tres ficheros para estas plantillas
  1. productos.tpl
  2. listaProductos.tpl
  3. 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.
        {include file="cesta.tpl"}
       {include file="listaproducto.tpl"}
 
   <form action='logoff.php' method='post'>
       <input type='submit' name='desconectar' value='Desconectar usuario {$usuario}'/>
   </form>        

</div> </body> </html> </source>

-->

listaProductos.tpl
  • Tendría el siguiente código
    {foreach from=$productos item=producto}
  ......

La lógica o el código

  • 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();
.....
  • 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