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

De WikiEducator
Saltar a: navegación, buscar
Línea 14: Línea 14:
 
*Para ello añadiremos el método pública obtieneProductos() en la clase DB.php que quedará con lo que tenía
 
*Para ello añadiremos el método pública obtieneProductos() en la clase DB.php que quedará con lo que tenía
 
[[Archivo:DB2_.png]]
 
[[Archivo:DB2_.png]]
*escribimos el código
 
<!--
 
<source lang=php>
 
<?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() {
 
//....
 
 
</source>
 
 
 
 
 
 
<!--      $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;
 
    }
 
</source>
 
-->
 
;La clase Producto.php
 
[[Archivo:producto.png]]<br />
 
Esta clase  implementa los atributos de la tabla productos y la posibilidad de obtener cada uno de sus atributos.
 
{{Plegable|hide|Producto.php|
 
<source lang=php>
 
<?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'];
 
    }
 
}
 
?>
 
</source>
 
}}
 
;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
 
{{Plegable|hide|productos.php|
 
<source lang=php>
 
<?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');   
 
?>
 
</source>
 
}}
 
 
;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
 
{{Plegable|hide|producto.tpl, la plantilla|
 
<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>
 
   
 
  <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>
 
</source>
 
}}
 
-->
 

Revisión de 21:05 20 dic 2017



Probando el ejemplo

  • Puedes ver esta parte del ejercicio ejecutándose en la web:
http://manuel.infenlaces.com/dwes/tienda/TiendaProductos/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 como un objeto de la clase 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

DB2 .png