Академический Документы
Профессиональный Документы
Культура Документы
Prctica
06
PROGRAMACIN
POR CAPAS
OBJETIVOS
Conocer la programacin por capas
Disear un proyecto web con programacin por capas
MARCO TERICO
Acceso a
Datos
La ventaja principal de este estilo es que el desarrollo se puede llevar a cabo en varios niveles y, en
caso de que sobrevenga algn cambio, slo se ataca al nivel requerido sin tener que revisar entre
cdigo mezclado. Un buen ejemplo de este mtodo de programacin sera el modelo de
interconexin de sistemas abiertos.
Adems, permite distribuir el trabajo de creacin de una aplicacin por niveles; de este modo,
cada grupo de trabajo est totalmente abstrado del resto de niveles, de forma que basta con
conocer la API que existe entre niveles.
Presentacin.
Lgica de Negocio.
Datos.
En cambio, el trmino "nivel" corresponde a la forma en que las capas lgicas se encuentran
distribuidas de forma fsica. Por ejemplo:
Una solucin de tres capas (presentacin, lgica del negocio, datos) que residen en un solo
ordenador (Presentacin+lgica+datos). Se dice que la arquitectura de la solucin es de
tres capas y un nivel.
Una solucin de tres capas (presentacin, lgica del negocio, datos) que residen en dos
ordenadores (presentacin+lgica por un lado; lgica+datos por el otro lado). Se dice que
la arquitectura de la solucin es de tres capas y dos niveles.
ACTIVIDADES
Venta de productos por Internet
El siguiente sistema permite la elaboracin de un Carrito de Compras, utilizando programacin por
capas; pero antes debemos de crear lo siguiente:
1.
2.
3.
4.
5.
Capa de Datos:
1.
La base de datos tendra las siguientes tablas. Venta, Producto y DetalleVenta. Esto tendra
que crearlo en localhost/Phpmyadmin
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);
//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 espaol
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) {
}
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 espaol
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) {
$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() {
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
10
$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 espaol
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, ";
11
12
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 lgica 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 presentacin del
proyecto y llamar a la capa de datos, especficamente a la clase "Producto", para poder
registrar un producto a la base de datos. Su cdigo 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
13
//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 mtodo "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 ms 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 estn almacenados en nuestro carrito de compras,
especficamente en la sesin de la aplicacin y llama a la clase "Venta" para poder registrar la venta a la
base de datos. Su cdigo fuente debera 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');
}
14
?>
Capa de Presentacin:
En esta parte mostraremos los formularios con la cual es usuario interactuara con el sistema. Y
veremos cmo crear un reporte en Excel con PHP.
1. Dentro de la carpeta Include se codificar, En esta carpeta pondremos los archivos que sern
comunes para todas las pginas 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 estn 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 cdigo:
<?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">
15
</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 cdigo 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>
16
C. Archivo modificarProducto.php
Este archivo recibe el cdigo del producto por medio del archivo "index.php". Muestra la
informacin del producto que deseamos modificar y nos permite editar su informacin.
<?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">
17
<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 cdigo del producto que deseamos aadir al carrito de compras
desde la pagina "index.php". Muestra toda la informacin del producto y nos pide la
cantidad que deseamos aadir al carrito. Su cdigo 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'; ?>
18
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 estn en sesin 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');
19
20
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 cdigo sera 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>Cdigo</td>
<td>Cliente</td>
<td>Producto</td>
<td>Precio</td>
<td>Cantidad</td>
<td>Parcial</td>
21
<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 cdigo 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>
22
23
24