Ing. Maribel Molina Barriga – Gestión y administración Web
1
PROGRAMACIÓN
POR CAPAS
OBJETIVOS
Conocer la programación por capas
Diseñar un proyecto web con programación por capas
MARCO TEÓRICO
La programación por capas
La programación por capas es una arquitectura cliente-servidor en el que el objetivo primordial es
la separación de la lógica de negocios de la lógica de diseño; un ejemplo básico de esto consiste en
separar la capa de datos de la capa de presentación al usuario.
La ventaja principal de este estilo es que el desarrollo se puede llevar a cabo en varios niveles y, en
caso de que sobrevenga algún cambio, sólo se ataca al nivel requerido sin tener que revisar entre
código mezclado. Un buen ejemplo de este método de programación sería el modelo de
interconexión de sistemas abiertos.
Además, permite distribuir el trabajo de creación de una aplicación por niveles; de este modo,
cada grupo de trabajo está totalmente abstraído del resto de niveles, de forma que basta con
conocer la API que existe entre niveles.
Práctica
06
Acceso a Datos
Ing. Maribel Molina Barriga – Gestión y administración Web
2
En el diseño de sistemas informáticos actual se suelen usar las arquitecturas multinivel o
Programación por capas. En dichas arquitecturas a cada nivel se le confía una misión simple, lo que
permite el diseño de arquitecturas escalables (que pueden ampliarse con facilidad en caso de que
las necesidades aumenten).
El diseño más utilizado actualmente es el diseño en tres niveles (o en tres capas).
CAPAS Y NIVELES
1. Capa de presentación: es la que ve el usuario (también se la denomina "capa de usuario"),
presenta el sistema al usuario, le comunica la información y captura la información del usuario
en un mínimo de proceso (realiza un filtrado previo para comprobar que no hay errores de
formato). También es conocida como interfaz gráfica y debe tener la característica de ser
"amigable" (entendible y fácil de usar) para el usuario. Esta capa se comunica únicamente con
la capa de negocio.
2. Capa de negocio: es donde residen los programas que se ejecutan, se reciben las peticiones del
usuario y se envían las respuestas tras el proceso. Se denomina capa de negocio (e incluso de
lógica del negocio) porque es aquí donde se establecen todas las reglas que deben cumplirse.
Esta capa se comunica con la capa de presentación, para recibir las solicitudes y presentar los
resultados, y con la capa de datos, para solicitar al gestor de base de datos almacenar o
recuperar datos de él. También se consideran aquí los programas de aplicación.
3. Capa de datos: es donde residen los datos y es la encargada de acceder a los mismos. Está
formada por uno o más gestores de bases de datos que realizan todo el almacenamiento de
datos, reciben solicitudes de almacenamiento o recuperación de información desde la capa de
negocio.
Todas estas capas pueden residir en un único ordenador, si bien lo más usual es que haya una
multitud de ordenadores en donde reside la capa de presentación (son los clientes de la
arquitectura cliente/servidor). Las capas de negocio y de datos pueden residir en el mismo
ordenador, y si el crecimiento de las necesidades lo aconseja se pueden separar en dos o más
ordenadores. Así, si el tamaño o complejidad de la base de datos aumenta, se puede separar en
varios ordenadores los cuales recibirán las peticiones del ordenador en que resida la capa de
negocio.
Si, por el contrario, fuese la complejidad en la capa de negocio lo que obligase a la separación, esta
capa de negocio podría residir en uno o más ordenadores que realizarían solicitudes a una única
base de datos. En sistemas muy complejos se llega a tener una serie de ordenadores sobre los
cuales corre la capa de negocio, y otra serie de ordenadores sobre los cuales corre la base de
datos.
En una arquitectura de tres niveles, los términos "capas" y "niveles" no significan lo mismo ni son
similares.
El término "capa" hace referencia a la forma como una solución es segmentada desde el punto de
vista lógico:
Ing. Maribel Molina Barriga – Gestión y administración Web
3
Presentación.
Lógica de Negocio.
Datos.
En cambio, el término "nivel" corresponde a la forma en que las capas lógicas se encuentran
distribuidas de forma física. Por ejemplo:
Una solución de tres capas (presentación, lógica del negocio, datos) que residen en un solo
ordenador (Presentación+lógica+datos). Se dice que la arquitectura de la solución es de
tres capas y un nivel.
Una solución de tres capas (presentación, lógica del negocio, datos) que residen en dos
ordenadores (presentación+lógica por un lado; lógica+datos por el otro lado). Se dice que
la arquitectura de la solución es de tres capas y dos niveles.
ACTIVIDADES Venta de productos por Internet El siguiente sistema permite la elaboración de un Carrito de Compras, utilizando programación por capas; pero antes debemos de crear lo siguiente: 1. Crear un proyecto en xampp, un sitio llamado “compras” 2. Dentro de Compras crear una carpeta llamada “CapaDatos” 3. Dentro de Compras crear una carpeta llamada “Include” 4. Dentro de Compras crear una carpeta llamada “CapaNegocios” 5. Subir el proyecto a su dominio gratuito
Capa de Datos: 1. La base de datos tendría las siguientes tablas. Venta, Producto y DetalleVenta. Esto tendría
que crearlo en localhost/Phpmyadmin
Ing. Maribel Molina Barriga – Gestión y administración Web
4
A continuación les paso el script de creación de la base de datos
-- Creando la base de datos-------------------------------
CREATE DATABASE IF NOT EXISTS bdtutorial;
USE bdtutorial;
-- Creando la tabla `detalleventa`------------------------
--
DROP TABLE IF EXISTS `detalleventa`;
CREATE TABLE `detalleventa` (
`codigoVenta` int(11) NOT NULL,
`codigoProducto` int(11) NOT NULL,
`cantidad` decimal(18,2) NOT NULL,
`descuento` decimal(18,2) NOT NULL,
PRIMARY KEY (`codigoVenta`,`codigoProducto`),
KEY `FK_DetalleVenta_Producto` (`codigoProducto`),
CONSTRAINT `FK_DetalleVenta_Producto` FOREIGN KEY (`codigoProducto`) REFERENCES
`producto` (`codigoProducto`),
CONSTRAINT `FK_DetalleVenta_Venta` FOREIGN KEY (`codigoVenta`) REFERENCES
`venta` (`codigoVenta`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Creando la tabla `producto`------------------------------
DROP TABLE IF EXISTS `producto`;
CREATE TABLE `producto` (
`codigoProducto` int(11) NOT NULL,
`nombre` varchar(100) NOT NULL,
`precio` decimal(18,2) NOT NULL,
PRIMARY KEY (`codigoProducto`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Creando la tabla venta-------------------------------------
DROP TABLE IF EXISTS `venta`;
CREATE TABLE `venta` (
`codigoVenta` int(11) NOT NULL,
`cliente` varchar(100) NOT NULL,
`fecha` datetime NOT NULL,
PRIMARY KEY (`codigoVenta`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
2. Dentro de la carpeta CapaDatos, colocaré el siguiente código:
Conexión.php DetalleVenta.php Producto.php Venta.php
A continuación el código siguiente
Ing. Maribel Molina Barriga – Gestión y administración Web
5
A. La clase Conexión, se codifica el código: Conexión.php
<?php class Conexion { var $BaseDatos; var $Servidor; var $Usuario; var $Clave; var $Conexion_ID; var $Consulta_ID; var $Errno = 0; var $Error = ""; //Constructor de la clase Conexion function Conexion() { $this->BaseDatos = "bdtutorial"; $this->Servidor = "localhost"; $this->Usuario = "root"; $this->Clave = ""; } //Metodo para conectarnos a la base de datos function conectar() { $this->Conexion_ID = mysql_connect($this->Servidor, $this->Usuario, $this->Clave); if (!$this->Conexion_ID) { $this->Error = "Ha fallado la conexion."; return 0; } if (!@mysql_select_db($this->BaseDatos, $this->Conexion_ID)) { $this->Error = "Imposible abrir " . $this->BaseDatos; return 0; } return $this->Conexion_ID; } } ?>
B. Esta clase se encarga de conectar la clase Producto con MySQL: Producto.php <?php include_once("Conexion.php"); //Declaracion class Producto { //Variable de la clase private $codigoProducto; private $nombre; private $precio; //Metodo utilizado para obtener el codigo siguiente del producto function codigoSiguiente($cn) { $cod = 0; $sql = "SELECT IFNULL(MAX(codigoProducto),0)+1 as codigo FROM Producto"; try { $result = mysql_query($sql, $cn); $registros = array(); while ($reg = mysql_fetch_array($result)) { $cod = $reg['codigo'];
Ing. Maribel Molina Barriga – Gestión y administración Web
6
break; } } catch (exception $e) { } return $cod; } //Metodo utilizado para insertar un producto a la base de datos function insertarProducto() { $rpta; try { //Creamos un objeto de la clase conexion $miconexion = new Conexion(); //Obtenemos la conexion $cn = $miconexion->conectar(); //Comenzamos la transaccion mysql_query("BEGIN", $cn); //Obtenemos el codigo del siguiente producto $this->codigoProducto =$this->codigoSiguiente($cn); //Elaboramos la sentencia $sql = "INSERT INTO Producto VALUES($this->codigoProducto,'$this->nombre',$this->precio)"; //Ejecutamos la sentencia $result = mysql_query($sql, $cn); if (!$result) { //Si no obtiene resultados anulamos la transaccion mysql_query("ROLLBACK", $cn); $rpta = false; } else { //Si obtiene resultados confirmamos la transaccion mysql_query("COMMIT", $cn); $rpta = true; } //Cerramos la conexion mysql_close($cn); } catch (exception $e) { try { mysql_query("ROLLBACK", $cn); } catch (exception $e1) { } try { mysql_close($cn); } catch (exception $e1) { } $rpta = false; } return $rpta; } //Metodo utilizado para actualizar un producto function actualizarProducto() { $rpta; try { //Creamos un objeto de la clase conexion $miconexion = new Conexion(); //Obtenemos la conexion $cn = $miconexion->conectar(); //Comenzamos la transaccion mysql_query("BEGIN", $cn);
Ing. Maribel Molina Barriga – Gestión y administración Web
7
//Elaboramos la sentencia $sql = "UPDATE Producto SET nombre='$this->nombre', precio=$this->precio WHERE codigoProducto=$this->codigoProducto"; //Ejecutamos la sentencia $result = mysql_query($sql, $cn); $rpta; if (!$result) { //Si no obtiene resultados anulamos la transaccion mysql_query("ROLLBACK", $cn); $rpta = false; } else { //Si obtiene resultados confirmamos la transaccion mysql_query("COMMIT", $cn); $rpta = true; } //Cerramos la conexion mysql_close($cn); } catch (exception $e) { try { mysql_query("ROLLBACK", $cn); } catch (exception $e1) { } try { mysql_close($cn); } catch (exception $e1) { } $rpta = false; } return $rpta; } //Metodo utilizado para obtener un producto function buscarProducto() { //Le deciamos que la locacion es lenguaje español setlocale(LC_CTYPE, 'es'); //La sentencia a ejecutar $sql = "SELECT * FROM Producto WHERE codigoProducto=$this->codigoProducto"; try { //Creamos un objeto de la clase conexion $miconexion = new Conexion(); //Obtenemos la conexion $cn = $miconexion->conectar(); //Ejecutamos la sentencia $rs = mysql_query($sql, $cn); //Creamos un array que almacenara los datos de la sentencia $registros = array(); //Recorremos el resultado de la consulta y lo almacenamos en el array while ($reg = mysql_fetch_array($rs)) { array_push($registros, $reg); } //Liberamos recursos mysql_free_result($rs); mysql_close($cn); } catch (exception $e) { try { mysql_free_result($rs); } catch (exception $e) {
Ing. Maribel Molina Barriga – Gestión y administración Web
8
} try { mysql_close($cn); } catch (exception $e) { } } return $registros; } //Metodo utilizado para obtener todos los productos function buscarProductoTodos() { //Le deciamos que la locacion es lenguaje español setlocale(LC_CTYPE, 'es'); //La sentencia a ejecutar $sql = "SELECT * FROM Producto ORDER BY nombre"; try { //Creamos un objeto de la clase conexion $miconexion = new Conexion(); //Obtenemos la conexion $cn = $miconexion->conectar(); //Ejecutamos la sentencia $rs = mysql_query($sql, $cn); //Creamos un array que almacenara los datos de la sentencia $registros = array(); //Recorremos el resultado de la consulta y lo almacenamos en el array while ($reg = mysql_fetch_array($rs)) { array_push($registros, $reg); } //Liberamos recursos mysql_free_result($rs); mysql_close($cn); } catch (exception $e) { try { mysql_free_result($rs); } catch (exception $e) { } try { mysql_close($cn); } catch (exception $e) { } } return $registros; } //Get y Set de la clase function getCodigoProducto() { return $this->codigoProducto; } function getNombre() { return $this->nombre; } function getPrecio() { return $this->precio; } function setCodigoProducto($codigoProducto) {
Ing. Maribel Molina Barriga – Gestión y administración Web
9
$this->codigoProducto = $codigoProducto; } function setNombre($nombre) { $this->nombre = $nombre; } function setPrecio($precio) { $this->precio = $precio; } } ?>
C. La clase DetalleVenta DetalleVenta.php <?php include_once("Conexion.php"); class DetalleVenta { private $codigoVenta; private $codigoProducto; private $cantidad; private $descuento; //Metodo utilizado para insertar un detalle de venta a la base de datos //como variable pide la conexion que va a usar function insertarDetalleVenta($cn) { $rpta; try { //Elaboramos la sentencia $sql = "INSERT INTO DetalleVenta VALUES($this->codigoVenta, $this->codigoProducto,$this->cantidad,$this->descuento)"; //Ejecutamos la sentencia $result = mysql_query($sql, $cn); if (!$result) { $rpta = false; } else { $rpta = true; } } catch (exception $e) { $rpta = false; } return $rpta; } function getCodigoVenta() { return $this->codigoVenta; } function getCodigoProducto() { return $this->codigoProducto; } function getCantidad() { return $this->cantidad; } function getDescuento() {
Ing. Maribel Molina Barriga – Gestión y administración Web
10
return $this->descuento; } function setCodigoVenta($codigoVenta) { $this->codigoVenta= $codigoVenta; } function setCodigoProducto($codigoProducto) { $this->codigoProducto = $codigoProducto; } function setCantidad($cantidad) { $this->cantidad = $cantidad; } function setDescuento($descuento) { $this->descuento = $descuento; } } ?>
D. La clase Venta
Venta.php
<?php include_once("Conexion.php"); include_once("DetalleVenta.php"); class Venta { private $codigoVenta; private $cliente; private $fecha; private $detalleVenta; //Metodo utilizado para obtener el codigo siguiente del producto function codigoSiguiente($cn) { $cod = 0; $sql = "SELECT IFNULL(MAX(codigoVenta),0)+1 as codigo FROM Venta"; try { $result = mysql_query($sql, $cn); $registros = array(); while ($reg = mysql_fetch_array($result)) { $cod = $reg['codigo']; break; } } catch (exception $e) { } return $cod; } //Metodo utilizado para insertar una venta a la base de datos function insertarVenta() { $rpta; try { //Creamos un objeto de la clase conexion $miconexion = new Conexion(); //Obtenemos la conexion $cn = $miconexion->conectar(); //Comenzamos la transaccion mysql_query("BEGIN", $cn); //Obtenemos el codigo del siguiente producto
Ing. Maribel Molina Barriga – Gestión y administración Web
11
$this->codigoVenta=$this->codigoSiguiente($cn); //Elaboramos la sentencia $sql = "INSERT INTO Venta VALUES($this->codigoVenta,'$this->cliente',CURDATE())"; //Ejecutamos la sentencia $result = mysql_query($sql, $cn); if (!$result) { //Si no obtiene resultados anulamos la transaccion mysql_query("ROLLBACK", $cn); $rpta = false; } else { //Recorremos el detalle y lo insertamos foreach($this->detalleVenta as $k => $v){ $detalle=new DetalleVenta(); $detalle->setCodigoVenta($this->codigoVenta); $detalle->setCodigoProducto($v['codigo']); $detalle->setCantidad($v['cantidad']); $detalle->setDescuento($v['descuento']); $rpta=$detalle->insertarDetalleVenta($cn); if(!$rpta){ break; } } if($rpta){ //Confirmamos la transaccion si se registra todos los detalles mysql_query("COMMIT", $cn); }else{ //Negamos al transaccion si no se registra algun detalle mysql_query("ROLLBACK", $cn); } } //Cerramos la conexion mysql_close($cn); } catch (exception $e) { try { mysql_query("ROLLBACK", $cn); } catch (exception $e1) { } try { mysql_close($cn); } catch (exception $e1) { } $rpta = false; } return $rpta; } //Metodo utilizado para obtener un producto function buscarVenta() { //Le deciamos que la locacion es lenguaje español setlocale(LC_CTYPE, 'es'); //La sentencia a ejecutar $sql="SELECT "; $sql.="v.codigoVenta AS CodigoVenta, "; $sql.="v.cliente AS Cliente, "; $sql.="v.fecha AS Fecha, "; $sql.="d.codigoProducto AS CodigoProducto, "; $sql.="p.nombre AS Nombre, ";
Ing. Maribel Molina Barriga – Gestión y administración Web
12
$sql.="p.precio AS Precio, "; $sql.="d.cantidad AS Cantidad, "; $sql.="d.descuento AS Descuento, "; $sql.="p.precio*d.cantidad AS Parcial, "; $sql.="((p.precio*d.cantidad)-d.descuento) AS SubTotal, "; $sql.="( "; $sql.="SELECT "; $sql.="SUM((dT.cantidad * pT.precio)-dT.descuento) AS TotalPagar "; $sql.="FROM "; $sql.="DetalleVenta AS dT INNER JOIN "; $sql.="Producto AS pT ON dT.codigoProducto = pT.codigoProducto "; $sql.="WHERE "; $sql.="dT.codigoVenta=v.codigoVenta "; $sql.=") AS TotalPagar "; $sql.="FROM "; $sql.="Venta AS v INNER JOIN "; $sql.="DetalleVenta AS d ON v.codigoVenta = d.codigoVenta INNER JOIN "; $sql.="Producto AS p ON d.codigoProducto = p.codigoProducto "; $sql.="ORDER BY "; $sql.="CodigoVenta, Nombre"; try { //Creamos un objeto de la clase conexion $miconexion = new Conexion(); //Obtenemos la conexion $cn = $miconexion->conectar(); //Ejecutamos la sentencia $rs = mysql_query($sql, $cn); //Creamos un array que almacenara los datos de la sentencia $registros = array(); //Recorremos el resultado de la consulta y lo almacenamos en el array while ($reg = mysql_fetch_array($rs)) { array_push($registros, $reg); } //Liberamos recursos mysql_free_result($rs); mysql_close($cn); } catch (exception $e) { try { mysql_free_result($rs); } catch (exception $e) { } try { mysql_close($cn); } catch (exception $e) { } } return $registros; } function getCodigoVenta() { return $this->codigoVenta; } function getCliente() { return $this->cliente; }
Ing. Maribel Molina Barriga – Gestión y administración Web
13
function getFecha() { return $this->fecha; } function getDetalleVenta() { return $this->detalleVenta; } function setCodigoVenta($codigoVenta) { $this->codigoProducto = $codigoVenta; } function setCliente($cliente) { $this->cliente = $cliente; } function setFecha($fecha) { $this->fecha = $fecha; } function setDetalleVenta($detalleVenta) { $this->detalleVenta = $detalleVenta; } } ?>
Capa de Negocios: Es la capa en la cual se implementa la lógica del negocio de la empresa como obtener descuentos, aumentos, etc. Dentro de la carpeta CapaNegocios se codificará: Prod_RegistrarProducto.php Prod_ModificarProducto.php Vent_RegistrarVenta.php
A. Prod_RegistrarProducto
Este archivo en PHP es el encargado de recibir los datos de la capa de presentación del
proyecto y llamar a la capa de datos, específicamente a la clase "Producto", para poder
registrar un producto a la base de datos. Su código fuente es el siguiente:
<?php include_once '../CapaDatos/Producto.php'; //Crea un objeto producto $pro=new Producto(); //Establece el nombre del producto y lo convierte a mayusculas $pro->setNombre(strtoupper($_REQUEST['txtNombre'])); //Establece el precio $pro->setPrecio($_REQUEST['txtPrecio']); //Llama al metodo insertar producto de producto $rpta=$pro->insertarProducto(); //Si la respuesta es verdadera es porque se registro el producto if($rpta){ //Redireccionamos a un archivo que se llama mensaje para mostrar el resultado
Ing. Maribel Molina Barriga – Gestión y administración Web
14
//del registro header("Location: ../mensaje.php?mensaje=Se registro el producto de manera correcta"); }else{ header("Location: ../mensaje.php?mensaje=No se pudo registrar el producto"); } ?>
B. Prod_ModificarProducto.php
Este archivo en PHP va a ser el encargado de llamar al método "actualizarProducto" de la clase "Producto". <?php include_once '../CapaDatos/Producto.php'; //Crea un objeto producto $pro=new Producto(); //Establece el codigo del producto $pro->setCodigoProducto($_REQUEST['txtCodigo']); //Establece el nombre del producto $pro->setNombre(strtoupper($_REQUEST['txtNombre'])); //Establece el precio del producto $pro->setPrecio($_REQUEST['txtPrecio']); //Llama al metodo actualizarProducto $rpta=$pro->actualizarProducto(); //Si rpta es verdadero es porque se actualizo el Producto if($rpta){ header("Location: ../mensaje.php?mensaje=Se modifico el producto de manera correcta"); }else{ header("Location: ../mensaje.php?mensaje=No se pudo modificar el producto"); } ?>
C. Vent_RegistrarVenta.php Este archivo es el más importante, ya que es el encargado de registrar la venta a la base de datos. Lo
que hace es obtener todos los ítems o productos que están almacenados en nuestro carrito de compras,
específicamente en la sesión de la aplicación y llama a la clase "Venta" para poder registrar la venta a la
base de datos. Su código fuente debería ser el siguiente:
<?php //Obtenemos la sesion session_start(); session_register('itemsEnCesta'); include_once '../CapaDatos/Venta.php'; //Creamos una clase venta $ven=new Venta(); //Establecemos el nombre del cliente $ven->setCliente(strtoupper($_REQUEST['txtCliente'])); //Obtenemos el objeto que esta en la sesion $itemsEnCesta=$_SESSION['itemsEnCesta']; //Establece el detalle con la informacion de la sesion $ven->setDetalleVenta($itemsEnCesta); //Llamamos al metodo insertar ventar $rpta=$ven->insertarVenta(); //Si rpta es verdadero es proque se inserto if($rpta){ //Eliminamos la sesion session_destroy(); //Redireccionamos a un archivo para que nos muestre el mensaje header('Location: ../mensaje.php?mensaje=Se registro la venta de manera correcta'); }else{ header('Location: ../mensaje.php?mensaje=No se pudo registrar la venta'); }
Ing. Maribel Molina Barriga – Gestión y administración Web
15
?>
Capa de Presentación:
En esta parte mostraremos los formularios con la cual es usuario interactuara con el sistema. Y
veremos cómo crear un reporte en Excel con PHP.
1. Dentro de la carpeta Include se codificará, En esta carpeta pondremos los archivos que serán
comunes para todas las páginas en PHP. Como por ejemplo el menú de opciones del sistema. Y
en esa carpeta crearemos un archivo que se llamara:
Cabezera.php
<h1>Carrito de Compras<br> </h1> <div> <a href="index.php">Inicio</a> | <a href="registrarProducto.php">Registrar Producto</a> | <a href="registrarVenta.php">Registrar Venta</a> | <a href="verVenta.php">Consultar Ventas</a> | <a href="reporteVentas.php">Reporte Producto</a> </div> <br>
2. Tenemos otros archivos los cuales están dentro de la carpeta de sitio compras, que está en
htdocs de xampp:
index.php
registrarProducto.php
modificarProducto.php
anadirCarrito.php
registrarVenta.php
verVenta.php
reporteVentas.php
A. Archivo index.php En este archivo mostraremos todos los productos que tenemos en el sistema. Y tendrá el siguiente código: <?php include_once 'CapaDatos/Producto.php'; $pro = new Producto(); $lista = $pro->buscarProductoTodos(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Ing. Maribel Molina Barriga – Gestión y administración Web
16
<title>Carrito de compras con PHP</title> </head> <body> <?php include_once 'Include/Cabezera.php'; ?> <div> <table border="1"> <tr style="background-color: chocolate"> <td colspan="4" >Listado Producto</td> </tr> <tr style="background-color: chocolate"> <td>Código</td> <td>Nombre</td> <td>Precio</td> <td>Proceso</td> </tr> <?php if(count($lista)>0){ for($i=0;$i<(count($lista));$i++) { $dirModifica="modificarProducto.php?codigoProducto=".$lista[$i]['codigoProducto']; $dirAnadir="anadirCarrito.php?codigoProducto=".$lista[$i]['codigoProducto']; ?> <tr> <td><?php echo ($lista[$i]['codigoProducto']);?></td> <td><?php echo ($lista[$i]['nombre']);?></td> <td><?php echo ($lista[$i]['precio']);?></td> <td><a href="<?php echo $dirModifica;?>">Modificar</a> | <a href="<?php echo $dirAnadir;?>">Añadir</a> </td> </tr> <?php } } ?> </table> </div>
</body> </html>
B. Archivo registrarProducto.php
Este archivo PHP es el encargado de mostrar al usuario el formulario para registrar los
productos a la base de datos. Su código html es el siguiente:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Carrito de compras con PHP</title> </head> <body>
Ing. Maribel Molina Barriga – Gestión y administración Web
17
<?php include_once 'Include/Cabezera.php'; ?> <form method="post" action="CapaNegocios/Prod_RegistrarProducto.php"> <div> <table border="1"> <tr> <td>Nombre</td> <td><input type="text" name="txtNombre" value="" /></td> </tr> <tr> <td>Precio</td> <td><input type="text" name="txtPrecio" value="0" /></td> </tr> <tr> <td></td> <td><input type="submit" value="Registrar" name="btnRegistrar" /></td> </tr> </table> </div> </form> </body> </html>
C. Archivo modificarProducto.php Este archivo recibe el código del producto por medio del archivo "index.php". Muestra la
información del producto que deseamos modificar y nos permite editar su información.
<?php include_once 'CapaDatos/Producto.php'; $pro = new Producto(); $pro->setCodigoProducto($_REQUEST['codigoProducto']); $lista = $pro->buscarProducto(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Carrito de compras con PHP</title> </head> <body> <?php include_once 'Include/Cabezera.php'; ?> <form method="post" action="CapaNegocios/Prod_ModificarProducto.php"> <div> <table border="1">
Ing. Maribel Molina Barriga – Gestión y administración Web
18
<tr> <td>Codigo</td> <td><input type="text" name="txtCodigo" value="<?php echo ($lista[0]['codigoProducto']);?>" readonly /></td> </tr> <tr> <td>Nombre</td> <td><input type="text" name="txtNombre" value="<?php echo($lista[0]['nombre']);?>" /></td> </tr> <tr> <td>Precio</td> <td><input type="text" name="txtPrecio" value="<?php echo($lista[0]['precio']);?>" /></td> </tr> <tr> <td></td> <td><input type="submit" value="Actualizar" name="btnActualizar" /></td> </tr> </table> </div> </form> </body> </html>
D. Archivo anadirCarrito.php Este formulario recibe el código del producto que deseamos añadir al carrito de compras
desde la pagina "index.php". Muestra toda la información del producto y nos pide la
cantidad que deseamos añadir al carrito. Su código fuente es el siguiente:
<?php include_once 'CapaDatos/Producto.php'; $pro = new Producto(); $pro->setCodigoProducto($_REQUEST['codigoProducto']); $lista = $pro->buscarProducto(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Carrito de compras con PHP</title> </head> <body> <?php include_once 'Include/Cabezera.php'; ?>
Ing. Maribel Molina Barriga – Gestión y administración Web
19
<form action="registrarVenta.php" method="post"> <div> <table border="1"> <tr> <td>Codigo</td> <td><input type="text" name="txtCodigo" value="<?php echo ($lista[0]['codigoProducto']);?>" readonly /></td> </tr> <tr> <td>Nombre</td> <td><input type="text" name="txtNombre" value="<?php echo($lista[0]['nombre']);?>" readonly /></td> </tr> <tr> <td>Precio</td> <td><input type="text" name="txtPrecio" value="<?php echo($lista[0]['precio']);?>" readonly /></td> </tr> <tr> <td>Cantidad Pedir</td> <td><input type="text" name="txtCantidad" value="0" /></td> </tr> <tr> <td></td> <td><input type="submit" value="Añadir" name="btnAnadir" /></td> </tr> </table> </div> </form> </body> </html>
E. Archivo registrarVenta.php
Este archivo es el encargado de mostrar al usuario el formulario para concluir la venta. Lo
que hace es traer todos los productos que están en sesión y mostrarlos en una tabla, para
que así veamos todos los productos que tenemos en el carrito de compras y poder decirle
que lo registra a la base de datos.
<?php session_start(); session_register('itemsEnCesta');
Ing. Maribel Molina Barriga – Gestión y administración Web
20
//Estableciendo los datos al carrito $codigo = $_REQUEST['txtCodigo']; $nombre = $_REQUEST['txtNombre']; $cantidad = $_REQUEST['txtCantidad']; $pu = $_REQUEST['txtPrecio']; $parcial = ($cantidad * $pu); $descuento = 0; if ($parcial > 50) { $descuento = ($parcial * 0.05); } $itemsEnCesta = $_SESSION['itemsEnCesta']; if ($codigo) { if (!isset($itemsEnCesta)) { $itemsEnCesta[$codigo] = array("codigo" => $codigo, "nombre" => $nombre, "cantidad" => $cantidad, "pu" => $pu, "parcial" => $parcial, "descuento" => $descuento, "subtotal" => ($parcial - $descuento)); } else { $itemsEnCesta[$codigo] = array("codigo" => $codigo, "nombre" => $nombre, "cantidad" => $cantidad, "pu" => $pu, "parcial" => $parcial, "descuento" => $descuento, "subtotal" => ($parcial - $descuento)); } } $_SESSION['itemsEnCesta'] = $itemsEnCesta; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Carrito de compras con PHP</title> </head> <body> <?php include_once 'Include/Cabezera.php'; ?> <div> <form action="CapaNegocios/Vent_RegistrarVenta.php" method="post"> <table border="1"> <tr style="background-color: chocolate"> <td colspan="6" >Carrito de Compras</td> </tr> <tr style="background-color: chocolate"> <td>Cliente</td> <td colspan="5" ><input type="text" name="txtCliente" value="" /></td> </tr> <tr style="background-color: chocolate"> <td>Nombre</td> <td>Cantidad</td> <td>Precio</td> <td>Parcial</td> <td>Descuento</td> <td>Sub.Total</td> </tr> <?php
Ing. Maribel Molina Barriga – Gestión y administración Web
21
if (isset($itemsEnCesta)) { foreach ($itemsEnCesta as $k => $v) { ?> <tr> <td><?php echo ($v['nombre']); ?></td> <td><?php echo number_format(($v['cantidad']), 2); ?></td> <td><?php echo number_format(($v['pu']), 2); ?></td> <td><?php echo number_format(($v['parcial']), 2); ?></td> <td><?php echo number_format(($v['descuento']), 2); ?></td> <td><?php echo number_format(($v['subtotal']), 2); ?></td> </tr> <?php } } ?> <tr style="background-color: chocolate"> <td colspan="6" ><input type="submit" value="Registrar Venta" name="btnRegistrarVenta" /></td> </tr> </table> </form> </div> </body> </html>
F. Archivo verVenta.php Este archivo nos permite ver todas las ventas en formato HTML. Su código sería el
siguiente:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Carrito de compras con PHP</title> </head> <body> <?php include_once 'Include/Cabezera.php'; ?> <div> <table border="1"> <tr style="background-color: chocolate"> <td>Código</td> <td>Cliente</td> <td>Producto</td> <td>Precio</td> <td>Cantidad</td> <td>Parcial</td>
Ing. Maribel Molina Barriga – Gestión y administración Web
22
<td>Descuento</td> <td>Sub. Total</td> <td>Total</td> </tr> <?php if(count($lista)>0){ for($i=0;$i<(count($lista));$i++) { ?> <tr> <td><?php echo ($lista[$i]['CodigoVenta']);?></td> <td><?php echo ($lista[$i]['Cliente']);?></td> <td><?php echo ($lista[$i]['Nombre']);?></td> <td><?php echo number_format(($lista[$i]['Precio']),2);?></td> <td><?php echo number_format(($lista[$i]['Cantidad']),2);?></td> <td><?php echo number_format(($lista[$i]['Parcial']),2);?></td> <td><?php echo number_format(($lista[$i]['Descuento']),2);?></td> <td><?php echo number_format(($lista[$i]['SubTotal']),2);?></td> <td><?php echo number_format(($lista[$i]['TotalPagar']),2);?></td> </tr> <?php } } ?> </table> </div> </body> </html>
G. Archivo reporteVentas.php Este archivo PHP nos permite crear un reporte en Excel. Su código fuente es el siguiente:
<?php header('Content-type: application/vnd.ms-excel'); header('Content-Disposition: attachment; filename=reporteVentas.xls'); header('Pragma: no-cache'); header('Expires: 0'); include_once 'CapaDatos/Venta.php'; $ven = new Venta(); $lista = $ven->buscarVenta(); ?> <table border="1"> <tr > <td style="background-color: chocolate">Cod</td> <td style="background-color: chocolate">Cliente</td> <td style="background-color: chocolate">Producto</td> <td style="background-color: chocolate">Precio</td> <td style="background-color: chocolate">Cantidad</td> <td style="background-color: chocolate">Parcial</td>
Ing. Maribel Molina Barriga – Gestión y administración Web
23
<td style="background-color: chocolate">Descuento</td> <td style="background-color: chocolate">Sub. Total</td> <td style="background-color: chocolate">Total</td> </tr> <?php if (count($lista) > 0) { for ($i = 0; $i < (count($lista)); $i++) { ?> <tr> <td><?php echo ($lista[$i]['CodigoVenta']); ?></td> <td><?php echo ($lista[$i]['Cliente']); ?></td> <td><?php echo ($lista[$i]['Nombre']); ?></td> <td><?php echo number_format(($lista[$i]['Precio']), 2); ?></td> <td><?php echo number_format(($lista[$i]['Cantidad']), 2); ?></td> <td><?php echo number_format(($lista[$i]['Parcial']), 2); ?></td> <td><?php echo number_format(($lista[$i]['Descuento']), 2); ?></td> <td><?php echo number_format(($lista[$i]['SubTotal']), 2); ?></td> <td><?php echo number_format(($lista[$i]['TotalPagar']), 2); ?></td> </tr> <?php } } ?> </table>
Top Related