jueves, 2 de junio de 2016

Interfaces en PHP

Interfaces
El concepto de interfaz es procedente del mundo Java. Una interfaz es una entidad que encierra funcionalidades que pueden ser implementadas por diversos objetos. Son muy utiles para poder permitir identificar rapidamente las funcionalidades que un sistema software nos proporciona sin necesidad de acceder a ver los métodos de las clases que lo conformen. Esto se lleva a cabo mediante la palabra reservada interface. Veamos un ejemplo de interfaz escrita en PHP:

idataaccess.class.php
1 //-------------------------------------------------------------
2 // Implementación de la interfaz de acceso a base de datos
3 // Autor: Ildefonso Montero Pérez - monteroperez@us.es
4 //-------------------------------------------------------------
5 <?php
6 interface IDataAccess{
7 public function execute($sqlquery);
8 public function debugQuery($sqlquery);
9 }
10 ?>

Como podemos observar la definición es identica. En este caso dado que estamos definiendo un contenedor de funcionalidades, iremos introduciendo funciones dentro de esta definición. No tiene sentido que una interfaz sea definida si no va a existir por lo menos un objeto que sea capaz de implementarla. Esto quiere decir que necesitaremos definir una clase que implemente los metodos contenidos en esta interfaz. Veamoslo para el ejemplo anteriormente citado en el que la interfaz encierra funcionalidades típicas de una fachada de confrontacion de queries a una base de datos.

mysqldataaccess.class.php
1 //-------------------------------------------------------------
2 // Clase que confronta queries contra bbdd de tipo MySQL
3 // Autor: Ildefonso Montero Pérez - monteroperez@us.es
4 //-------------------------------------------------------------
5 <?php
6 class MySQLDataAccess implements IDataAccess{
...
public function execute($sqlquery) { ... }
public function debugQuery($sqlquery) { ... }
...
}
?>

En este ejemplo hemos introducido una clase que lleva a cabo la implementación de las funcionalidades introducidas en la interfaz definida anteriormente. Para ello podemos observar que se añade la palabra reservada implements.

PHP - Carrito de Compras Parte IV - Creación de la Capa de Presentación

1. Entorno

  • NetBeans IDE 6.9.1
  • WampServer 2.1.

2. Introducció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

3. Desarrollo


3.1. Crear Carpeta

Vamos a crear una carpeta que se llamara "Include", en esta carpeta pondremos los archivos que serán comunes para todas las paginas en PHP. Como por ejemplo el menú de opciones del sistema. Y en esa carpeta crearemos un archivo que se llamara "Cabezera.php"




Y el archivo tendrá el siguiente código fuente:


<h1>Programando - Carrito Compras con PHP</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>


3.2. 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">
        <title>Programando con Café - 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>

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


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Programando con Café - Carrito de compras con PHP</title>
    </head>
    <body>
        <?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>

3.4. 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>Programando con Café - 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">
                        <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>

3.5. 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 codigo 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>Programando con Café - Carrito de compras con PHP</title>
    </head>
    <body>
        <?php include_once 'Include/Cabezera.php'; ?>
        <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>

3.6. 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 asi 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');
//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>Programando con Café - 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
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>


3.6. Archivo verVenta.php

Este archivo nos permite ver todas las ventas en formato HTML. Su código seria el siguiente


<?php
include_once 'CapaDatos/Venta.php';
$ven = new Venta();
$lista = $ven->buscarVenta();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Programando con Café - 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>
                <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>


3.7. 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>
        <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>
 
 
Fin del tutorial 

PHP - Carrito de Compras Parte III - Creación de la Capa de Negocios

1. Entorno


NetBeans IDE 6.9.1
WampServer 2.1.

2. Introducción


Ya vimos que en la Parte II del tutorial creamos la Capa de Dato de nuestro sistema, la cual es la encargada de comunicarse con la base de datos. Ahora nos tocaría desarrollar la Capa de Negocios que es la capa en la cual se implementa la lógica del negocio de la empresa como obtener descuentos, aumentos, etc.

3. Desarrollo


3.1. Creando la carpeta

Debemos de crear la carpeta que recibirá el nombre de "CapaNegocios"












3.2. Creando el archivo Prod_RegistrarProducto

Este archivo en PHP va a ser 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
    //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");
}
?>

3.3. Creando el archivo Prod_ModificarProducto

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");
}
?>

3.4. Creando el archivo Vent_RegistrarVenta

Quizás este archivo es el mas importante, ya que es el encargado de registrar la venta a la base de datos. Lo que hace es obtener todos los items 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");
}
?>

4. Resumen


Al final deberíamos tener la siguiente estructura