|
|
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
| |