|
Sesiones
Simule un carrito de compras.
Para ello, implemente una clase Carrito que contenga métodos
para mostrar contenido, agregar y eliminar del carrito, asi como
mostrar el monto de lo comprado. Al entrar a la página
de la tienda, se mostrarán los artículos disponibles
(los cuales puede definirlos estáticamente en un arreglo
o leerlos de un archivo). Después de eso el cliente podra
tener una sesión típica de compras.
Para verlo funcionando dar
clic aqui
El enunciado esta dado, ahora
hay que ver como realizar esto, pero primero analicemos lo siguiente.
¿Qué
son las sesiones?
Una sesión es considerada
como el intervalo de tiempo empleado por un usuario en recorrer
nuestras páginas hasta que abandona nuestro sitio o deja
de actuar sobre él durante un tiempo prolongado o bien,
sencillamente, cierra el navegador.
PHP nos permite almacenar variables llamadas
de sesión que, una vez definidas, podrán ser utilizadas
durante este lapso de tiempo por cualquiera de los scripts de
nuestro sitio. Estas variables serán especificas del usuario
de modo que varias variables sesión del mismo tipo con
distintos valores pueden estar coexistiendo para cada una de las
sesiones que están teniendo lugar simultáneamente.
Estas sesiones tienen además su propio identificador de
sesión que será único y específico.
Bien ahora ya conocemos que
onda con esto de las sesiones, ahora hay que ver como implementar
lo que se pidio, lo primero que hice fue una clase que se encarga
de manejar el almacen (class.almacen.php) la cual contiene un
arreglo el cual tiene toda la información de los productos
y cuenta con los métodos suficientes para su manejo.
class.almacen.php
<?php
class
Almacen
{
var
$tienda =
array(
"Accesorios" =>
array(
"Microfono" =>
array("17","Microfono
Inalámbrico"),
"Lentes" =>
array("22","Para
protejer los ojos"),
"Filtro" =>
array("10","Filtro
para monitor")
),
"Software" =>
array(
"Office" =>
array("5000","Suite
de oficina"),
"Dreamweaver" =>
array("6000","Suite
para desarrollo web"),
"Matlab" =>
array("2000","Suite
matemática")
),
"Hardware" =>
array(
"Teclado" =>
array("250","Teclado
Qwerty"),
"Ratón" =>
array("80","Ratón
Inalámbrico"),
"Monitor" =>
array("2000","Pantalla
plana")
)
);
function
getTienda()
{
return
$this->tienda;
}
/* function getTienda()
*/
function
getCategorias($arreglo)
{
foreach
($arreglo as
$nombre=>$email)
{
$catego[]=$nombre;
}
return
$catego;
}
/* function getCategorias($arreglo)
*/
function
getElementosCate($arreglo,
$strTabla)
{
foreach
($arreglo[$strTabla]
as $nombre=>$valores)
{
$ele[]=$nombre;
}
return
$ele;
}
/* function getElementosCate($arreglo,
$strTabla) */
function
getPrecio($arreglo,
$strNombre)
{
foreach
($arreglo as
$grupo=>$elemento)
{
foreach
($elemento as
$nombre=>$datos)
{
if
($nombre ==
$strNombre)
{
return
$datos[0];
}
}
}
}
/* function getPrecio($arreglo,
$strNombre) */
function
getDescripcion($arreglo,
$strNombre)
{
foreach
($arreglo as
$grupo=>$elemento)
{
foreach
($elemento as
$nombre=>$datos)
{
if
($nombre ==
$strNombre)
{
return
$datos[1];
}
}
}
}
/* function getDescripcion($arreglo,
$strNombre) */
function
despliegaArreglo($arreglo,
$separa="",
$url="",
$estilo="",
$param="")
{
foreach
($arreglo as
$elemento)
{
if
($url!="")
{
if
($param!="")
{
echo
"<a href=\"".$url."?$param=$elemento\"
class=\"$estilo\">$elemento</a>$separa";
}
else
{
echo
"<a href=\"".$url."\"
class=\"$estilo\">$elemento</a>$separa";
}
}
else
{
echo
"$elemento$separa";
}
}
}
/* function despliegaArreglo($arreglo,
$separa="", $url="", $estilo="", $param="") */
function
&getInstancia()
{
static
$instancia;
if
(!isset( $instancia ))
{
$instancia
=& new Almacen();
}
return
$instancia;
}
} /*
class Almacen */
?>
|
|
Ahora necesitamos la
clase que se encargue de manejar el carrito de compra(class.carrito.php)
la cual contiene los métodos suficientes para su manejo.
class.carrito.php
<?
session_start();
class Carrito
{
function
agregaElemento($producto,
$cantidad)
{
if
(!isset($_SESSION["carrito"]))
{
$_SESSION["carrito"][$producto]=$cantidad;
}
/* if (!isset($_SESSION["carrito"]))
*/
else
{
foreach($_SESSION["carrito"]
as $nombre =>
$unidades)
{
if
($_GET["producto"]==$nombre)
{
$_SESSION["carrito"][$nombre]+=$cantidad;
$encontrado=1;
} /*
if ($_GET["producto"]==$nombre) */
}
/* foreach($_SESSION["carrito"]
as $nombre => $unidades) */
if
(!$encontrado)
{
$_SESSION["carrito"][$_GET["producto"]]=$cantidad;
}
/* if (!$encontrado)
*/
} /*
else -> if (!isset($_SESSION["carrito"])) */
}
/* function agregaElemento($producto)
*/
function
borraElemento($nombre)
{
if
(isset($_SESSION["carrito"]))
{
foreach($_SESSION["carrito"]
as $nombre =>
$unidades)
{
if
($_GET["eliminar"]==$nombre)
{
if
($_SESSION["carrito"][$nombre]>0)
{
$_SESSION["carrito"][$nombre]--;
}
/* if ($_SESSION["carrito"][$nombre]>0)
*/
}
/* if ($_GET["eliminar"]==$nombre)
*/
}
/* foreach($_SESSION["carrito"]
as $nombre => $unidades) */
}
/* if (isset($_SESSION["carrito"]))
*/
}
/* function borraElemento($producto)
*/
function
mostrarCarrito()
{
$productos
=& Almacen::getInstancia();
foreach($_SESSION["carrito"]
as $nombre =>
$unidades)
{
if
($unidades>0)
{
echo
"<tr>";
echo
" <td><div
align=\"center\">$unidades</div></td>";
echo
" <td><div
align=\"center\">$nombre</div></td>";
echo
" <td><div align=\"right\">$ ".(
number_format(
$productos->getPrecio($productos->getTienda(),$nombre)*$unidades
) )."</div></td>";
echo
" <td><div
align=\"center\"><a
href=\"?eliminar=$nombre\"
class=\"enlace\">Eliminar</a></div></td>";
echo
"</tr>";
}
/* if ($unidades>0)
*/
}
/* foreach($_SESSION["carrito"]
as $nombre => $unidades) */
}
/* function mostrarCarrito($formato="")
*/
function
calcularTotal()
{
$productos
=& Almacen::getInstancia();
foreach($_SESSION["carrito"]
as $nombre =>
$unidades)
{
$total
= $total
+ (double)($productos->getPrecio($productos->getTienda(),$nombre)*$unidades);
}
/* foreach($_SESSION["carrito"]
as $nombre => $unidades) */
return
$total;
}
/* function calcularTotal()
*/
}
/* class Carrito */
?>
|
|
La forma de invocarlas en el código
es de la siguiente manera:
<?php
include("class.almacen.php");
include("class.carrito.php");
$productos=new Almacen;
$compra=new Carrito;
?>
<html>
<head>
<title>Ejemplo de carrito de compras con PHP y sesiones by Pecesama</title>
</head>
<body>
<table width=95% border=0 align="center" cellpadding=0 cellspacing=0>
<tbody>
<tr>
<td width="20%" valign=top><br>
<table width="95%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#6699cc">
<tr>
<td><table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="71%"> <p align="center"> <br>
<font color="#000099" face="Courier New"><strong><font size="4">Elegir
categoría </font></strong></font>
<p>
<?php
$productos->despliegaArreglo($productos->getCategorias($productos->getTienda()),"<br>",$_SERVER["PHP_SELF"], "enlace", "categoria");
?>
</p>
<br>
</p>
</td>
</tr>
</table></td>
</tr>
</table>
<p> </p></td>
<td height="100%" vAlign=top><br>
<table width="95%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#6699cc">
<tr>
<td><table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="71%"><div align="left">
<p align="center"><br><font color="#000099">
<strong><font size="4">Elegir producto / cantidad
</font></strong></font></p>
<?php
if ($_GET["categoria"])
{
echo "<center>| ";
$productos->despliegaArreglo($productos->getElementosCate($productos->getTienda(), $_GET["categoria"]), " | ", $_SERVER["PHP_SELF"], "enlace", "producto");
echo "<center>";
}
if ($_GET["producto"])
{
?>
<form name="frmAgregarProducto" action="" method="post">
<table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr bgcolor="#CCCCCC">
<td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Cantidad</font></strong></font></div></td>
<td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Producto</font></strong></font></div></td>
<td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Descripción</font></strong></font></div></td>
<td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Precio</font></strong></font></div></td>
</tr>
<tr>
<td><div align="center"> </div></td>
<td><div align="center"> </div></td>
<td><div align="center"> </div></td>
<td><div align="center"> </div></td>
</tr>
<tr>
<td><div align="center">
<input name="txtCantidad" type="text" id="txtCantidad" size="2" value="1">
</div></td>
<td><div align="center"></div></td>
<td><div align="center"><?php echo $productos->getDescripcion($productos->getTienda(),$_GET["producto"]) ?></div></td>
<td><div align="center"><?php echo "$ ".number_format($productos->getPrecio($productos->getTienda(),$_GET["producto"])) ?></div></td>
</tr>
<tr>
<td><div align="center"> </div></td>
<td><div align="center"> </div></td>
<td><div align="center"> </div></td>
<td><div align="center"> </div></td>
</tr>
<tr>
<td><div align="center"><font face="Courier New"> </font></div></td>
<td><div align="center"><font face="Courier New"> </font></div></td>
<td><div align="center"><font face="Courier New"> </font></div></td>
<td><div align="center"><font face="Courier New">
<input type="submit" name="btnAgregar" value="Agregar">
</font></div></td>
</tr>
</table>
</form>
<?php
}
?>
<br>
</p>
</div></td>
</tr>
</table></td>
</tr>
</table>
<br>
<table width="95%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#6699cc">
<tr>
<td><table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="71%"><div align="left">
<p align="center"><font color="#000099" face="Courier New"><br>
<strong><font size="4">Nuestro carrito</font></strong></font></p>
<?php
if ($_GET["producto"] and $_POST["btnAgregar"]!="")
{
$compra->agregaElemento($_GET["producto"], $_POST["txtCantidad"]);
}
if (isset($_SESSION["carrito"]))
{
if ($_GET["eliminar"])
{
$compra->borraElemento($_GET["eliminar"]);
}
?>
<table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr bgcolor="#CCCCCC">
<td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Cantidad</font></strong></font></div></td>
<td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Producto</font></strong></font></div></td>
<td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Subtotales</font></strong></font></div></td>
<td> <div align="center"><font face="Courier New"><strong></strong></font></div></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<?php echo $compra->mostrarCarrito(); ?>
<tr>
<td><hr noshade></td>
<td><hr noshade></td>
<td><hr noshade></td>
<td><hr noshade></td>
</tr>
<tr>
<td><font face="Courier New"> </font></td>
<td><div align="right"><font face="Courier New"><b> Total:
</b></font></div></td>
<td><div align="right"><b><?php echo "$ ".$compra->calcularTotal(); ?></b></div></td>
<td><div align="right"><font face="Courier New"> </font></div></td>
</tr>
</table>
<?php
}
?>
<br>
</div></td>
</tr>
</table></td>
</tr>
</table>
</td>
</tr>
<!--Inicio de las secciones-->
<!--Fin de las secciones-->
</tbody>
</table>
</body>
</html>
|
|
Veamos como quedó la utilería
en un screenshot
|