Carrito de la compra en PHP
Planteamientos iniciales para la realización de un carrito de la compra sencillo en PHP. Almacenamiento del carrito en una variable de sesión.
20/9/04 - Vamos a ver una manera sencilla de realizar un carrito de la compra en PHP, utilizando una variable de sesión para guardar los datos del carrito, como los nombres de los productos, sus precios y otros datos de interés. En estos ejemplos nos vamos a centrar exclusivamente en la funcionalidad del carrito, es decir, la memorización de los productos comprados a lo largo de toda la sesión, dejando de lado todo lo relativo a presentación o la extracción de los productos de una base de datos.
Para entender este manual son necesarios unos conocimientos previos sobre PHP, que se pueden obtener de la lectura de nuestro manual de PHP http://www.desarrolloweb.com/php/ o los talleres prácticos de la tecnología http://www.desarrolloweb.com/manuales/6/. Debemos prestar especial atención al manejo de sesiones en PHP y, dado que esta implementación del carrito está realizada utilizando programación orientada a objetos, será necesario que conozcamos un poco ese tipo de programación, particularmente en PHP 4.
El carrito lo hemos creado con la versión PHP 4. Para que este ejemplo funcione en PHP 5 (que básicamente cambia con respecto a su antecesor en el trabajo con objetos) habría que realizar algunas modificaciones.
Se pueden
descargar los códigos de este artículo en un archivo comprimido.
Librería lib_carrito.php
Vamos a atacar al problema creando una librería con la declaración de una clase, que luego utilizaremos para crear un objeto carrito. Con dicho objeto implementaremos el trabajo típico del carro de la compra, es decir, introducir productos, extraerlos, contabilizar precios, etc. Esta librería la guardaremos en un archivo llamado lib_carrito.php y contendrá el código de la clase carrito, con todos sus métodos y propiedades.
El carrito se debe poder acceder en cualquier momento, siempre y cuando el visitante permanezca en la página. Además, cada visitante debe disponer de un carrito propio. Aunque podríamos pensar en otras soluciones, estas necesidades descritas inicialmente, hacen muy recomendable el uso de variables de sesión, puesto que ofrecen la mejor forma de tratar con datos específicos de cada usuario, que deben perdurar entre las distintas páginas que visite.
Vamos a mantener una variable de sesión con una instancia de la clase carrito, que contendrá el carro de la compra del visitante. Esta variable de sesión se guardará en $_SESSION["ocarrito"] y se debe crear al acceder a la página, siempre y cuando no se haya creado previamente. Por ello, en cada página se ha de comprobar si hay un carrito creado y, si no es así, se debe instanciar el objeto.
if (!isset($_SESSION["ocarrito"])){
$_SESSION["ocarrito"] = new carrito();
}
Este código lo hemos situado dentro del archivo librería del carrito, después de la declaración de la clase.
Seguir navegando a partir aquí:
+ 1 manual relacionado
+ 1 categoria relacionada
+ 6 comentarios (Añadir)
| Autoría, licencia y acciones sobre este artículo |
|
Informe de Miguel Angel Alvarez* Director de DesarrolloWeb.com
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
* Para consultas técnicas utilizar la lista de correo.
|
Manuales relacionados con este artículo
Categorias relacionadas
A través de las categorías de nuestro directorio se pueden encontrar otro tipo de recursos relacionados con este artículo:
+ Entrar en
Scripts en PHP
Comentarios de los visitantes
|
Los comentarios de los visitantes son para ampliar la información del artículo. Cualquiera puede participar.
|
| Se muestran 6 comentarios revisados |
Comentario de Matias
20/12/04
Hola, estuve implementando el carrito en mi sitio y funciona muy bien.
Solo que para tener un completo carro de compras estaria muy bueno que se pudiera insertar los productos cargados en el carro en una base de datos.
Desde ya muy agradecido por el nivel del sitio.
Matias
Comentario de Alberto
14/2/05
Esta muy bueno gracias por la nota. Alguien sabe como hacer para que no se pongan duplicados en la lista sino que se aumente la cantidad de productos? Es decir, si compras dos veces el mismo producto se lista dos veces, estaria bueno que se ponga "cantidad: 2", no? Vyo a ver si puedo hacerlo pero no se mucho como para esto.
Comentario de Cluster
21/4/05
Los métodos empleados (en general y concretamente) como "imprime_carrito()" .. estaría mejor si devolviesen su salida ante su llamada (con un return $html por ejemplo concatenando su salida en esa variable) ..
Todo esto con el objetivo por ejemplo de generar un e-mail o un archivo .. etc.
De la forma que está si bien cumple su objetivo principal, complica y hace que hay que "rediseñar" ese método para hacer taréas de lo más comunes con el trabajo de un "carrito" como es esa misma: generar una orden de pedido mínimo por e-mail.
Un saludo,
Comentario de Roberto Buil Artal
01/9/06
Bueno como veo no soy el único que ha tenido verdaderos problemas para poder almacenar el carrito en una variable y así meterlo en la base de datos.
Pero gracias a esta URL que explica las clases http://www.desarrolloweb.com/articulos/1913.php
a mi amigo Sergi y a varias horas he creado una función que os puede servir a los novatos como yo.
//EN lib_carrito.php
//declaro 2 variables nuevas
var $codref;
var $suma;
//añado una función
function guarda_carrito(){
global $codref;
global $suma;
$suma = 0;
for ($i=0;$i<$this->num_productos;$i++){
if($this->array_id_prod[$i]!=0){
$this->codref.=$this->array_id_prod[$i] . " ".$this->array_precio_prod[$i]. "<BR>";
$suma += $this->array_precio_prod[$i];
}
}
$this->suma=$suma*1.16;
}
//Y para finalizar las recupero desde mi página de confirma.php y las almaceno en variables para meter en la BD.
$_SESSION["ocarrito"]->guarda_carrito();
$pedido=$_SESSION["ocarrito"]->codref;
$total=$_SESSION["ocarrito"]->suma;
Espero que os sirva de algo.
Agradezco a los desarrolladores de esta web las explicaciones del código, e imagino que si no lo han dado completo es para evitar la comercialización con su herramienta. Pero aqui estamos los usuarios para ayudarnos entre todos.
Comentario de Bruno Alexei Savron
06/4/08
Hola amigos ,..aqui les envío gentilmente una leve mejora a nuestro carro de compras,...el que responde a la primera pregunta formulada en los comentarios,..bien,..aqui se diferencian los productos en cantidades diferidas segùn su identificador ,..en el caso anterior el proceso es acumulativo y no diferencia los productos.
entonces aqui tenemos sumas diferidas según el tipo de producto ej 3unidades del prod 1,..5unidades del prod7,..etc....
Y aqui está el código con una mejora en el diseño al oncluir hojas de estilo(un regalo aparte para vuestro perfeccionamiento)
carro.php
<?
include("lib_carrito.php");
?>
<html>
<head>
<title>Trabajando con el carrito</title>
<STYLE TYPE="text/css">
#kate{background-color: #FFFF00}
A {text-decoration:none}
A:hover{background-color: #008000}
</STYLE>
<link rel="STYLESHEET" type="text/css" href="estilo.css">
</head>
<body>
<table border=1 cellpadding="3">
<tr>
<td BGCOLOR="#ffffff" VALIGN="CENTER" ALIGN="CENTER"><a href="mete_producto.php?id=12" TITLE="Silla Jupiter"> Silla modelo jupiter 80 euros </a></td>
</tr>
<tr>
<td BGCOLOR="#ffffff" VALIGN="CENTER" ALIGN="CENTER"><a href="mete_producto.php?id=16" TITLE="Mesa Camilla">Mesa camilla en oferta 29 euros </a></td>
</tr>
<tr>
<td BGCOLOR="#ffffff" VALIGN="CENTER" ALIGN="CENTER"><a href="mete_producto.php?id=18" TITLE="Silla Oficina"> Silla oficina 102 euros </a></td>
</tr>
<tr>
<td BGCOLOR="#ffffff" VALIGN="CENTER" ALIGN="CENTER"><a href="mete_producto.php?id=98" TITLE="Aparador Cocina">Aparador cocina blanco 200 euros</a></td>
</tr>
<tr>
<br>
</tr>
<tr>
<td VALIGN="CENTER" ALIGN="CENTER"><a href="ver_carrito.php">Ver carrito</a></td>
</tr>
</table>
</body>
</html>
lib_carrito.php
<?
class carrito {
//atributos de la clase
var $num_productos;
var $array_id_prod;
var $array_nombre_prod;
var $array_precio_prod;
var $array_cant_prod;
var $array_cant_prod1;
//constructor. Realiza las tareas de inicializar los objetos cuando se instancian
//inicializa el numero de productos a 0
function carrito () {
$this->num_productos=0;
// for ($k=0;$k<4;$k++){
$this->array_cant_prod[0]=0;
$this->array_cant_prod[1]=0;
$this->array_cant_prod[2]=0;
$this->array_cant_prod[3]=0;
$this->array_nombre_prod[0]="silla modelo jupiter";
$this->array_nombre_prod[1]="mesa camilla oferta";
$this->array_nombre_prod[2]="Silla oficina";
$this->array_nombre_prod[3]="Aparador cocina blanco";
$this->array_precio_prod[0]=80;
$this->array_precio_prod[1]=29;
$this->array_precio_prod[2]=102;
$this->array_precio_prod[3]=200;
}
//Introduce un producto en el carrito. Recibe los datos del producto
//Se encarga de introducir los datos en los arrays del objeto carrito
//luego aumenta en 1 el numero de productos
function introduce_producto($id){
echo "Variable $id: $id<br>
";
if($id=="12"){
$this->array_cant_prod[0] ++;
echo "Variable : $this->array_cant_prod[0] <br>
"; }
elseif($id=="16"){
$this->array_cant_prod[1] ++;
echo "Variable : $this->array_cant_prod[1] <br>
"; }
elseif($id=="18"){
$this->array_cant_prod[2]++;
echo "Variable : $this->array_cant_prod[2] <br>
"; }
else
{
if($id=="98")
$this->array_cant_prod[3]++;
echo "Variable : $this->array_cant_prod[3] <br>
"; }
$this->num_productos++;
}
//Muestra el contenido del carrito de la compra
//ademas pone los enlaces para eliminar un producto del carrito
function imprime_carrito(){
$suma = 0;
echo '<table border=1 cellpadding="3">
<tr>
<td><b>Nombre producto</b></td>
<td><b>Precio</b></td>
<td><b>Cantidad</b></td>
<td> </td>
</tr>';
for($i=0;$i<4;$i++){
if($this->array_cant_prod[$i]!=0){
echo '<tr>';
echo "<td>" . $this->array_nombre_prod[$i] . "</td>";
echo "<td>" . $this->array_precio_prod[$i] . "</td>";
echo "<td>" . $this->array_cant_prod[$i] . "</td>";
echo "<td><a href='eliminar_producto.php?linea=$i'>Eliminar producto</td>";
echo '</tr>';
$suma += $this->array_precio_prod[$i]*$this->array_cant_prod[$i];
}
}
//muestro el total
echo "<tr><td><b>TOTAL:</b></td><td> <b>$suma</b></td><td> </td></tr>";
//total más IVA
echo "<tr><td><b>IVA (16%):</b></td><td> <b>" . $suma * 1.19 . "</b></td><td> </td></tr>";
echo "</table>";
}
//elimina un producto del carrito. recibe la linea del carrito que debe eliminar
//no lo elimina realmente, simplemente pone a cero el id, para saber que esta en estado retirado
function elimina_producto($linea){
$this->array_cant_prod[$linea]=0;
}
}
//inicio la sesión
session_start();
//si no esta creado el objeto carrito en la sesion, lo creo
if (!isset($_SESSION["ocarrito"])){
$_SESSION["ocarrito"] = new carrito();
}
?>
mete_producto.php
<?
include("lib_carrito.php");
$_SESSION["ocarrito"]->introduce_producto($_GET["id"]);
?>
<html>
<head>
<title>Introduce Producto</title>
<link rel="STYLESHEET" type="text/css" href="estilo.css">
</head>
<body>
Producto introducido.
<br>
<br>
<a href="carro.php">- Volver</a>
<br>
<br>
<a href="ver_carrito.php">- Ver carrito</a>
</body>
</html>
eliminar_producto.php
<?
include("lib_carrito.php");
$_SESSION["ocarrito"]->elimina_producto($_GET["linea"]);
?>
<html>
<head>
<title>Introduce Producto</title>
<link rel="STYLESHEET" type="text/css" href="estilo.css">
</head>
<body>
Producto eliminado.
<br>
<br>
<br>
<a href="carro.php">- Volver</a>
<br>
<br>
<a href="ver_carrito.php">- Ver carrito</a>
</body>
</html>
ver_carrito.php
<?
include("lib_carrito.php");
?>
<html>
<head>
<title>Introduce Producto</title>
<link rel="STYLESHEET" type="text/css" href="estilo.css">
</head>
<body>
<?
$_SESSION["ocarrito"]->imprime_carrito();
?>
<br>
<br>
<table border = '1'>
<tr>
<td><a href="carro.php">Volver</a></td>
</tr>
<tr>
<td><A HREF="javascript:history.back()">Volver Listado</A></td>
</tr>
</table >
</body>
</html>
estilo.css
A {
text-decoration : none;
color : #008080;
}
A:Visited {
text-decoration : none;
color : #008000;
}
A:Active {
text-decoration : none;
color : #808000;
}
A:Hover {
text-decoration : none;
color : #3333cc;
}
BODY {
font-size : 10pt;
font-family : verdana,arial,helvetica;
color : #000000;
background-color : #C0C0C0;
margin-left : 200px;
margin-right : 10px;
margin-top : 100px;
margin-bottom : 10px;
}
TD {
font-size : 10pt;
font-family : verdana,arial,helvetica;
color : #000000;
}
H1 {
font-size : 13pt;
font-family : verdana,arial,helvetica;
color : #008000;
}
INPUT {
font-size: 10pt;
}
SELECT {
font-size: 10pt;
}
TEXTAREA {
font-size: 10pt;
}
.fuente8 {
font-size:8pt;
font-family: verdana,arial,helvetica;
color : #0000FF;
}
Atte:Bruno Alexei Savron
Comentario de Bruno Alexei Savron
06/4/08
Una Correción,..en la introducción quiero decir,..los productos(ítem) se diferencian con un identificador,..y por lo tanto se obtienen sumas diferidas,..según su identificador...
Entonces ,..primero Se creó un identificador para cada item(producto ) y cada ítem tiene sus atributos(nombre ,precio, cantidad según ítem)
Luego,..Aquí se creó un arreglo para cada atributo de un producto(item) del carro (cantidad acumulada(según identificador de ítem),nombre(según identificador de item),valor(según identificador de ítem)),...ok
Ir arriba