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

De WikiEducator
Saltar a: navegación, buscar
 
(22 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
{{:Usuario:ManuelRomero/php/smarty/tienda/nav}}
 
{{:Usuario:ManuelRomero/php/smarty/tienda/nav}}
 
__NOTOC__
 
__NOTOC__
===Cesta===
+
===Probando el ejemplo===
*Ahora deberemos ver o añadir la cesta
+
*Puedes ver esta parte del ejercicio ejecutándose en la web:
*Podremos seleccionar o elegir productos y según añadamos se añadirán a la cesta
+
http://manuel.infenlaces.com/dwes/tienda/TiendaCesta/login.php
*Esto aparecer en la pantalla de productos
+
*Para mejorar el código y siguiendo las especificaciones planteadas, vamos crear dos plantillas
+
#listaProductos.tpl
+
#cesta.tpl
+
*y ambas plantillas las cargaremos en la plantilla de productos.tpl.
+
*La plantilla productos.ptl quedará de la siguiente manera
+
<source lang=php>
+
<!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">
+
===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.
 +
[[imagen: cestaTienda.png|300px|center]]<br />
 +
*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.
  
<div id="contenedor">
+
===Explicación del funcionamiento===
  <div id="encabezado">
+
*El siguiente diagrama de uso expone el funcionamiento de la nueva versión
    <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>
+
</source>
+
===Clases===
+
*Vamos a crear una clase cesta
+
*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
+
[[Archivo:Cesta.png]]
+
<source lang=php>
+
<?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;
+
    }
+
   
+
    // Guarda la cesta de la compra en la sesión del usuario
+
    public function guarda_cesta() { $_SESSION['cesta'] = $this; }
+
   
+
    // Recupera la cesta de la compra almacenada en la sesión del usuario
+
    public static function carga_cesta() {
+
        if (!isset($_SESSION['cesta'])) return new CestaCompra();
+
        else return $_SESSION['cesta'];
+
    }
+
}
+
 
+
?>
+
</source>
+
;Vemos que hemos usado acceso a la base de datos
+
*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 nos retorna un objeto de la clase producto
+
*Con ello la clase DB.php definitiva quedaría
+
[[Archivo:DB3_.png]]
+
*El código de este método
+
<source lang=php>
+
/*======================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) {
+
//....
+
</source>
+
<!--
+
 
+
        $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;   
+
    }
+
   
+
</source>
+
-->
+
 
+
;cesta.php
+
*Este fichero se ejecutará cada vez que el usuario seleccione un nuevo producto
+
*Lo que hará será añadir un nuevo elemento al objeto de la clase cesta
+
*Este objeto lo deberemos de tener cargado en sesión, para no peder su valor  en las recargas  (cada vez que añadimos un producto recargamos la página
+
*Tendrá que exportar para la plantilla los productos de la cesta y el coste total que llevamos hasta el momento>
+
*El código
+
<source lang=php>
+
<?php
+
require_once('./..(/include/Cesta.php');
+
require_once('Smarty.class.php');
+
 
+
// Recuperamos la información de la sesión
+
session_start();
+
 
+
// Y comprobamos que el usuario se haya autentificado
+
if (!isset($_SESSION['usuario']))
+
    die("Error - debe <a href='login.php'>identificarse</a>.<br />");
+
 
+
// Cargamos la librería de Smarty
+
$smarty = new Smarty;
+
$smarty->template_dir = '/private/web/smarty/tiendaSmarty4/templates/';
+
$smarty->compile_dir = '/private/web/smarty/tiendaSmarty4/templates_c/';
+
$smarty->config_dir = '/private/web/smarty/tiendaSmarty4/configs/';
+
$smarty->cache_dir = '/private/web/smarty/tiendaSmarty4/cache/';
+
 
+
// Recuperamos la cesta de la compra
+
$cesta = CestaCompra::carga_cesta();
+
 
+
// Ponemos a disposición de la plantilla los datos necesarios
+
$smarty->assign('usuario', $_SESSION['usuario']);
+
$smarty->assign('productoscesta', $cesta->get_productos());
+
$smarty->assign('coste', $cesta->get_coste());
+
 
+
// Mostramos la plantilla
+
$smarty->display('cesta.tpl');
+
?>
+
</source>
+
 
+
;Las plantillas
+
*Ahora debemos de escribir las plantillas que van a componer la plantilla de producto.tpl
+
 
*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]]
 +
*Explicación:
 +
#El 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
  
[[Archivo:usoTiendaCesta.png]]
+
===Clases===
;listaPorductos,tpl
+
;Cesta.php
*Esta plantilla es la antigua de producto.tpl, pero ahora cada vez que añadamos un producto ejecutaremos el método
+
;DB.php
 +
===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'''''
 +
[[Archivo:PlantillaProductos.png]]

Última revisión de 21:10 20 dic 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
DB.php

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