Está en la página 1de 9

Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.

com

Carrito de la compra en PHP

Autores del manual Este manual ha sido realizado por los siguientes colaboradores de DesarrolloWeb.com: Miguel Angel Alvarez
Director de DesarrolloWeb.com http://www.desarrolloweb.com

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com

(5 captulos)

Carrito de la compra en PHP


Vamos a ver una manera sencilla de realizar un carrito de la compra en PHP, utilizando una variable de sesin para guardar los datos del carrito, como los nombres de los productos, sus precios y otros datos de inters. En estos ejemplos nos vamos a centrar exclusivamente en la funcionalidad del carrito, es decir, la memorizacin de los productos comprados a lo largo de toda la sesin, dejando de lado todo lo relativo a presentacin o la extraccin 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 prcticos de la tecnologa http://www.desarrolloweb.com/manuales/6/. Debemos prestar especial atencin al manejo de sesiones en PHP y, dado que esta implementacin del carrito est realizada utilizando programacin orientada a objetos, ser necesario que conozcamos un poco ese tipo de programacin, particularmente en PHP 4. El carrito lo hemos creado con la versin PHP 4. Para que este ejemplo funcione en PHP 5 (que bsicamente cambia con respecto a su antecesor en el trabajo con objetos) habra que realizar algunas modificaciones.
Referencia: Disponemos de algunos artculos sobre la programacin orientada a objetos en PHP 4.

Se pueden descargar los cdigos de este artculo en un archivo comprimido. Librera lib_carrito.php Vamos a atacar al problema creando una librera con la declaracin de una clase, que luego utilizaremos para crear un objeto carrito. Con dicho objeto implementaremos el trabajo tpico del carro de la compra, es decir, introducir productos, extraerlos, contabilizar precios, etc. Esta librera la guardaremos en un archivo llamado lib_carrito.php y contendr el cdigo de la clase carrito, con todos sus mtodos y propiedades. El carrito se debe poder acceder en cualquier momento, siempre y cuando el visitante permanezca en la pgina. Adems, cada visitante debe disponer de un carrito propio. Aunque podramos pensar en otras soluciones, estas necesidades descritas inicialmente, hacen muy recomendable el uso de variables de sesin, puesto que ofrecen la mejor forma de tratar con datos especficos de cada usuario, que deben perdurar entre las distintas pginas que visite. Vamos a mantener una variable de sesin con una instancia de la clase carrito, que contendr el carro de la compra del visitante. Esta variable de sesin se guardar en $_SESSION["ocarrito"] y se debe crear al acceder a la pgina, siempre y cuando no se haya creado previamente. Por ello, en cada pgina 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(); }

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com

Este cdigo lo hemos situado dentro del archivo librera del carrito, despus de la declaracin de la clase. Artculo por Miguel Angel Alvarez

Estudio de las necesidades del carrito


Ahora nos vamos a fijar en la clase carrito. Para empezar vamos a hacer un estudio de las funcionalidades y datos que debera contener. Mtodos del objeto carrito Las funcionalidades que debera implementar el objeto carrito se definirn como mtodos de la clase carro de la compra. En principio, se deben crear los siguientes mtodos: Introducir un producto en el carrito Eliminar un producto del carrito Mostrar el carrito Otras funcionalidades que seguro que necesitars a medida que avances en el trabajo...

Datos a utilizar Para empezar, tenemos que llevar la cuenta del nmero de productos que se han introducido en el carrito. En el momento de creacin del objeto carrito, el nmero de productos debe ser igual a cero. Tambin necesitaremos guardar los id_producto de cada uno de los productos que se vayan introduciendo en el carrito. Lo haremos a travs del array $array_id_prod, que es una de las propiedades del objeto. Ahora bien, probablemente sea til guardar ms que los simples identificadores de los productos. Si se guarda su precio y su nombre puede ser til para mostrar rpidamente esos valores sin necesidad de acceder a la base de datos. Para ello se utilizan otro par de arrays, que tambin se han creado como atributos del objeto carrito. Estos son $array_nombre_prod, para almacenar los nombres de los productos y $array_precio_prod, para guardar los precios de cada uno de los productos del carrito. Artculo por Miguel Angel Alvarez

Implementacin de la clase carrito en PHP


Como habamos dicho, el carrito de la compra se ha implementado en una clase, para aprovechar algunas de las ventajas de la programacin a objetos. Vamos a ver ahora cmo realizar esa clase, lo que incluye la definicin de propiedades y mtodos. Atributos de la clase carrito
Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin. 3

Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com

Es preferible empezar por ver los atributos que tendr la clase carrito, que ya adelantamos en el captulo anterior.
//atributos de la clase var $num_productos; var $array_id_prod; var $array_nombre_prod; var $array_precio_prod;

El atributo $num_productos guarda el nmero de productos almacenados en el carrito. $array_id_prod guarda los identificadores de los productos comprados. $array_nombre_prod almacena los nombres de los productos y por ltimo, $array_precio_prod, que guarda el precio de los productos. Por ejemplo, si tuvisemos un solo producto en el carrito, $num_productos valdra uno. Adems, en los arrays tendramos una sola posicin (con ndice cero), donde se guardara el identificador, nombre y precio. Estos datos se guardan por separado en cada uno de los tres arrays. Mtodos del carrito Vamos ahora con las funciones tpicas del carrito que se necesitar crear en algn momento. Constructor Se debe contar con un constructor que resuma las tareas de inicializacin del carrito. En concreto, el constructor simplemente inicia a cero el nmero de productos del carrito.
function carrito () { $this->num_productos=0; } Nota: Este objeto est construido con PHP 4, donde los constructores tienen el mismo nombre que la clase, en este caso "carrito". En PHP 5 los constructores deben llamarse siempre __constructor

Introducir un producto en el carrito Se hace con el mtodo introduce_producto(),que recibe los datos del producto y los introduce en el objeto carrito. Tambin aumenta en uno el nmero de productos del carrito.
function introduce_producto($id_prod,$nombre_prod,$precio_prod){ $this->array_id_prod[$this->num_productos]=$id_prod; $this->array_nombre_prod[$this->num_productos]=$nombre_prod; $this->array_precio_prod[$this->num_productos]=$precio_prod; $this->num_productos++; }

El incremento se hace al final porque el numero de productos inicialmente es cero y el primer producto a insertar deseamos que tenga ese ndice. Borrar un producto del carrito Debemos disponer de una funcin que nos permita eliminar un producto del carrito. En este caso voy a crear una funcin que recibe el nmero de lnea del producto dentro del carrito, que corresponde con el ndice de los arrays de productos que deseamos borrar. Podramos recibir
Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin. 4

Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com

tambin el identificador del producto a borrar o incluso puede ser que nos sea til crear un par de funciones para borrar productos del carrito, una recibiendo la lnea del carrito y otra recibiendo el identificador del producto. Para este ejemplo me resulta ms fcil recibir la lnea en la que est ese producto en el carrito.
function elimina_producto($linea){ $this->array_id_prod[$linea]=0; }

Simplemente colocamos a cero el identificador de producto a borrar. No borramos directamente las variables de sesin porque eso nos obligara a recolocar todos los ndices de las variables de sesin para que fuesen correlativos. Este detalle tendremos que tenerlo en cuenta a la hora de mostrar el carrito, pues si el identificador de producto es cero, se entiende que el producto est eliminado del carrito. Tampoco disminuimos en uno el nmero de productos, porque en realidad no estamos eliminando un producto de la estructura de datos, sino que lo estoy marcando a cero para saber que no hay nada que contabilizar en ese caso. En el siguiente captulo veremos la implementacin del mtodo ms complicado del carrito, que es el encargado de mostrar todos los productos que hay dentro. Artculo por Miguel Angel Alvarez

Mostrar el carrito PHP


La ltima funcin de las que vamos a ver aqu sirve para mostrar todos los productos del carrito. Tiene que hacer un simple bucle que recorra los arrays de productos, que se han ido rellenando al meter productos en el carrito. Debe mostrar los datos de cada producto segn se recorre con el bucle. Adems, debe proporcionar el importe total de la compra y un enlace para quitar cualquier 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> </td> </tr>'; for ($i=0;$i<$this->num_productos;$i++){ if($this->array_id_prod[$i]!=0){ echo '<tr>'; echo "<td>" . $this->array_nombre_prod[$i] . "</td>"; echo "<td>" . $this->array_precio_prod[$i] . "</td>"; echo "<td><a href='eliminar_producto.php?linea=$i'>Eliminar producto</td>"; echo '</tr>'; $suma += $this->array_precio_prod[$i]; } } //muestro el total echo "<tr><td><b>TOTAL:</b></td><td> <b>$suma</b></td><td> </td></tr>"; //total ms IVA echo "<tr><td><b>IVA (16%):</b></td><td> <b>" . $suma * 1.16 . "</b></td><td> </td></tr>";

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com

echo "</table>"; }

La funcin declara primero la variable suma donde se guardar la suma de importes de los productos. Se muestran todos los productos con un bucle que recorre las lneas del carrito, desde la primera hasta el nmero de productos. En cada lnea del carrito se muestran sus datos, teniendo cuidado porque si el identificador del producto era cero quera decir que ese producto haba sido borrado del carrito. Adems, acumulamos en la variable suma el importe de todos los productos del carrito que no han sido borrados previamente. Todava dentro del bucle que recorre los productos del carrito, colocamos un enlace para que el visitante pueda eliminar un producto. Hay que darse cuenta que el enlace para borrar un producto indica como parmetro la lnea del carrito que se debe borrar, que era lo que nosotros necesitbamos en la funcin creada para borrar los productos. Ya fuera del bucle, imprimimos el importe total con la suma de los importes de los productos que hemos ido acumulando durante el bucle. Cdigo completo de la clase Veamos a continuacin cmo quedara la clase carrito completa, para que no se nos pase ningn detalle.
class carrito { //atributos de la clase var $num_productos; var $array_id_prod; var $array_nombre_prod; var $array_precio_prod; //constructor. Realiza las tareas de inicializar los objetos cuando se instancian //inicializa el numero de productos a 0 function carrito () { $this->num_productos=0; } //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_prod,$nombre_prod,$precio_prod){ $this->array_id_prod[$this->num_productos]=$id_prod; $this->array_nombre_prod[$this->num_productos]=$nombre_prod; $this->array_precio_prod[$this->num_productos]=$precio_prod; $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> </td> </tr>'; for ($i=0;$i<$this->num_productos;$i++){ if($this->array_id_prod[$i]!=0){ Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin. 6

Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com

} } //muestro el total echo "<tr><td><b>TOTAL:</b></td><td> <b>$suma</b></td><td> </td></tr>"; //total ms IVA echo "<tr><td><b>IVA (16%):</b></td><td> <b>" . $suma * 1.16 . "</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_id_prod[$linea]=0; }

echo '<tr>'; echo "<td>" . $this->array_nombre_prod[$i] . "</td>"; echo "<td>" . $this->array_precio_prod[$i] . "</td>"; echo "<td><a href='eliminar_producto.php?linea=$i'>Eliminar producto</td>"; echo '</tr>'; $suma += $this->array_precio_prod[$i];

Artculo por Miguel Angel Alvarez

Utilizacin de la clase carrito en PHP


Para ilustrar el funcionamiento de la clase carrito, vamos a realizar unas pginas donde podremos utilizarla. Realmente son unas pginas sencillas, el trabajo duro ya se realiz al crear el propio carrito. index.php La pgina de inicio muestra una lista de objetos para comprar. Esta lista est completamente inventada sobre la marcha, pero en nuestros ejemplos lo lgico sera que la extrajramos de una base de datos.
<? include("lib_carrito.php"); ?> <html> <head> <title>Trabajando con el carrito</title> </head> <body> <a href="mete_producto.php?id=12&nombre=silla+modelo+jupiter&precio=80">Silla modelo jupiter 80 euros</a> <br> <br> <a href="mete_producto.php?id=16&nombre=mesa+camilla+oferta&precio=29">Mesa camilla en oferta 29 euros</a> <br> <br> <a href="mete_producto.php?id=18&nombre=Silla+oficina&precio=102">Silla oficina 102 euros</a> <br> <br> <a href="mete_producto.php?id=98&nombre=Aparador+cocina+blanco&precio=200">Aparador cocina blanco 200 euros</a> <br>

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com

<br> <br> - <a href="ver_carrito.php">Ver carrito</a> </body> </html>

mete_producto.php Esta pgina introduce el un producto en el carrito de la compra. Recibe los datos del producto a introducir por la URL. Lo que hace es llamar al mtodo introduce_producto(), pasando los datos del producto, que se reciben por GET.
<? include("lib_carrito.php"); $_SESSION["ocarrito"]->introduce_producto($_GET["id"], $_GET["nombre"], $_GET["precio"]); ?> <html> <head> <title>Introduce Producto</title> </head> <body> Producto introducido. <br> <br> <a href="index.php">- Volver</a> <br> <br> <a href="ver_carrito.php">- Ver carrito</a> </body> </html>

ver_carrito.php La pgina que muestra el carrito es bsicamente una llamada al mtodo de la clase carrito que se encarga de mostrar el contenido del carro de la compra y la suma de los precios de los productos.
<? include("lib_carrito.php"); ?> <html> <head> <title>Introduce Producto</title> </head> <body> <? $_SESSION["ocarrito"]->imprime_carrito(); ?> <br> <br> <a href="index.php">Volver</a> </body> </html>

eliminar_producto.php

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com

Esta pgina recibe por GET el ndice del producto que se desea borrar. Con el ndice, se llama al mtodo elimina_producto, que se encarga de marcar como eliminado el producto del carro.
<? include("lib_carrito.php"); $_SESSION["ocarrito"]->elimina_producto($_GET["linea"]); ?> <html> <head> <title>Introduce Producto</title> </head> <body> Producto eliminado. <br> <br> <br> <a href="index.php">- Volver</a> <br> <br> <a href="ver_carrito.php">- Ver carrito</a> </body> </html>

Artculo por Miguel Angel Alvarez

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.

También podría gustarte