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

De WikiEducator
Saltar a: navegación, buscar
 
Línea 32: Línea 32:
 
===Clases===
 
===Clases===
 
;Cesta.php
 
;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
 
[[Archivo:Cesta.png]]
 
<source lang=php>
 
<?php
 
require_once('DB.php');
 
 
class Cesta {
 
    protected $productos = [];
 
    protected $unidades = [];
 
//...
 
</source>
 
 
 
   
 
  // 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;
 
        }
 
    }
 
    ...
 
<!--
 
    // 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'];
 
    }
 
}
 
 
?>
 
</source>
 
-->
 
*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
 
;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
 
[[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>
 
-->
 
 
===Plantillas===
 
===Plantillas===
 
*Tenemos que modificar la plantilla de '''''productos.tpl''''', para añadir la presentación de los datos de la cesta
 
*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'''''
 
*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]]
 
[[Archivo:PlantillaProductos.png]]
*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
 
<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">
 
 
<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>
 
</source>
 
 
-->
 
;listaProductos.tpl
 
*Tendría el siguiente código
 
 
<source lang=php>
 
    {foreach from=$productos item=producto}
 
  ......
 
</source>
 
<!--
 
        <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}
 
</source>
 
;cesta.tpl
 
<source lang=php>
 
<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>
 
</source>
 
-->
 
===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
 
 
<source lang=php>
 
$cesta = Cesta::carga_cesta();
 
.....
 
</source>
 
<!--
 
// Comprobamos si se quiere añadir un producto a la cesta
 
if (isset($_POST['enviar'])) {
 
    $cesta->nuevo_articulo($_POST['cod']);
 
    $cesta->guarda_cesta();
 
}
 
</source>
 
*$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
 
<source lang=php>
 
//Ponemso disponible para la cesta
 
if ($cesta->vacia()==false){
 
    $smarty->assign('productoscesta', $cesta->get_productos());
 
    $smarty->assign('coste', $cesta->get_coste());
 
}
 
</source>
 
-->
 
*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
 

Ú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