Usuario:ManuelRomero/php/smarty/producto
De WikiEducator
< Usuario:ManuelRomero | php
Revisión a fecha de 19:09 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/TiendaLogin/login.php
Lista productos
- Se trata de modificar tanto productos.php, como la plantilla productos.tpl, para obtener un listado de todos los productos
- Para ello también añadiremos métodos a la clase DB.php.
- A la vez crearemos la clase Producto.php para obtener de forma más cómoda cada producto a partir de cada fila de la consulta
- Directamente vamos a escribir el código
- DB.php
- Debemos hacer una consulta que obtenga todos los productos
- Para ello añadiremos el método pública obtieneProductos() en la clase DB.php que quedará con lo que tenía
- escribimos el código
<?php require_once('Producto.php'); class DB { //..... lo que había /*======================obtieneProducto ()====================================== Accion: obtiene un array con todos los productos de la bd. Parámetros: Retorna un array de objetos de productos con todos los productos * ***********************************************************************************************/ public static function obtieneProductos() { $sql = "SELECT cod, nombre_corto, nombre, PVP FROM producto;"; $resultado = self::ejecutaConsulta ($sql); $productos = array(); if($resultado) { // Añadimos un elemento por cada producto obtenido while ($row=$resultado->fetch()) { $productos[] = new Producto($row); } } return $productos; }
- La clase Producto.php
Esta clase implementa los atributos de la tabla productos y la posibilidad de obtener cada uno de sus atributos
<?php class Producto { protected $codigo; protected $nombre; protected $nombre_corto; protected $PVP; public function getcodigo() {return $this->codigo; } public function getnombre() {return $this->nombre; } public function getnombrecorto() {return $this->nombre_corto; } public function getPVP() {return $this->PVP; } public function __construct($row) { $this->codigo = $row['cod']; $this->nombre = $row['nombre']; $this->nombre_corto = $row['nombre_corto']; $this->PVP = $row['PVP']; } } ?>
- productos.php
- Esta parte del código simplemente accede a la base de datos y obtiene todos los productos
- Los productos quedan disponibles para la plantilla en una variable $productos que es un array asociativo
- el código
<?php require_once('./../include/DB.php'); require_once('Smarty.class.php'); // Recuperamos la información de la sesión session_start(); // Y comprobamos que el usuario se haya autentificado, para evitar que puedan acceder directamente //a esta pagina sin pasar por el login 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 = '/web/smarty/tiendaSmarty2/templates/'; $smarty->compile_dir = '/web/smarty/tiendaSmarty2/templates_c/'; $smarty->config_dir = '/web/smarty/tiendaSmarty2/configs/'; $smarty->cache_dir = '/web/smarty/tiendaSmarty2/cache/'; // Ponemos a disposición de la plantilla los datos necesarios //..... $smarty->assign('usuario', $_SESSION['usuario']); $smarty->assign('productos', DB::obtieneProductos()); // Mostramos la plantilla $smarty->display('producto.tpl'); ?>
- producto.tpl
- Esta es la plantilla de los productos
- En este caso debemos recorrer un array usando smarty
- Como se vio en la teoría la estructura from de smarty queda reflejada en el siguiente código
<!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> <div id="productos"> {foreach from=$productos item=producto} <p> <form id='{$producto->getcodigo()}' action='productos.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} </div> </div> </body> </html>