Buenas gente, hace mucho tiempo andaba trabajando en un diseño de una mini-empresa de electrodomésticos, y ellos tenían la idea de crear su propio "carrito" de compras para vender electrodomésticos por la web (con tarjeta de crédito y paypal)
Bueno, me empecé a adentrar un poco más en el tema y noté que había muchas formas y diseños de hacerlos, pero me acuerdo de una buena página que use para hacer este script de la forma más dinámica y mejor posible.
1. Entendiendo el script
Antes de pasar a la programación y a los archivos, es IMPRESINDIBLE entender el funcionamiento de estos, y que lugar ocupan
- Metodo add
Array de clave valor. Se encarga de agregar un producto al carro. Es contable (es decir, podríamos agregar más de una vez el mismo y, así, comprar dos o más)
- remove_producto
identifica cada producto, cifrando con md5 la id del producto y así, eliminará por completo todas las unidades de ese mismo
- get_content
Nos devuelve un array con todos los productos del carrito y la información de cada uno de ellos.
- precio_total
Devuelve el precio total del carrito de compras, por defecto, si el carrito está vacío el valor es de 0.
- artículos_total
Devuelve el número total de artículos del carrito, por defecto, si el carrito está vacío el valor es de 0.
- La función destroy
Elimina por completo el carrito de compras, una vez hecho, nuestro carrito tendrá valor NULL.
2. Comenzando el script
Primero que nada, destacaremos toda nuestra lógica sobre el script dentro de un archivo llamado carrito.class.php, con el siguiente contenido
Código
<?php class Carrito { //aquí guardamos el contenido del carrito //seteamos el carrito exista o no exista en el constructor public function __construct() { { $_SESSION["carrito"] = null; $this->carrito["precio_total"] = 0; $this->carrito["articulos_total"] = 0; } $this->carrito = $_SESSION['carrito']; } //añadimos un producto al carrito { //primero comprobamos el articulo a añadir, si está vacío o no es un //array lanzamos una excepción y cortamos la ejecución { throw new Exception("Error, el articulo no es un array!", 1); } //nuestro carro necesita siempre un id producto, cantidad y precio articulo if(!$articulo["id"] || !$articulo["cantidad"] || !$articulo["precio"]) { throw new Exception("Error, el articulo debe tener un id, cantidad y precio!", 1); } //nuestro carro necesita siempre un id producto, cantidad y precio articulo if(!is_numeric($articulo["id"]) || !is_numeric($articulo["cantidad"]) || !is_numeric($articulo["precio"])) { throw new Exception("Error, el id, cantidad y precio deben ser números!", 1); } //debemos crear un identificador único para cada producto //creamos la id única para el producto $articulo["unique_id"] = $unique_id; //si no está vacío el carrito lo recorremos { foreach ($this->carrito as $row) { //comprobamos si este producto ya estaba en el //carrito para actualizar el producto o insertar //un nuevo producto if($row["unique_id"] === $unique_id) { //si ya estaba sumamos la cantidad $articulo["cantidad"] = $row["cantidad"] + $articulo["cantidad"]; } } } //evitamos que nos pongan números negativos y que sólo sean números para cantidad y precio //añadimos un elemento total al array carrito para //saber el precio total de la suma de este artículo $articulo["total"] = $articulo["cantidad"] * $articulo["precio"]; //primero debemos eliminar el producto si es que estaba en el carrito $this->unset_producto($unique_id); ///ahora añadimos el producto al carrito $_SESSION["carrito"][$unique_id] = $articulo; //actualizamos el carrito $this->update_carrito(); //actualizamos el precio total y el número de artículos del carrito //una vez hemos añadido el producto $this->update_precio_cantidad(); } //método que actualiza el precio total y la cantidad //de productos total del carrito private function update_precio_cantidad() { //seteamos las variables precio y artículos a 0 $precio = 0; $articulos = 0; //recorrecmos el contenido del carrito para actualizar //el precio total y el número de artículos foreach ($this->carrito as $row) { $precio += ($row['precio'] * $row['cantidad']); $articulos += $row['cantidad']; } //asignamos a articulos_total el número de artículos actual //y al precio el precio actual $_SESSION['carrito']["articulos_total"] = $articulos; $_SESSION['carrito']["precio_total"] = $precio; //refrescamos él contenido del carrito para que quedé actualizado $this->update_carrito(); } //método que retorna el precio total del carrito public function precio_total() { //si no está definido el elemento precio_total o no existe el carrito //el precio total será 0 { return 0; } //si no es númerico lanzamos una excepción porque no es correcto { throw new Exception("El precio total del carrito debe ser un número", 1); } //en otro caso devolvemos el precio total del carrito return $this->carrito["precio_total"] ? $this->carrito["precio_total"] : 0; } //método que retorna el número de artículos del carrito public function articulos_total() { //si no está definido el elemento articulos_total o no existe el carrito //el número de artículos será de 0 { return 0; } //si no es númerico lanzamos una excepción porque no es correcto { throw new Exception("El número de artículos del carrito debe ser un número", 1); } //en otro caso devolvemos el número de artículos del carrito return $this->carrito["articulos_total"] ? $this->carrito["articulos_total"] : 0; } //este método retorna el contenido del carrito public function get_content() { //asignamos el carrito a una variable $carrito = $this->carrito; //debemos eliminar del carrito el número de artículos //y el precio total para poder mostrar bien los artículos //ya que estos datos los devuelven los métodos //articulos_total y precio_total return $carrito == null ? null : $carrito; } //método que llamamos al insertar un nuevo producto al //carrito para eliminarlo si existia, así podemos insertarlo //de nuevo pero actualizado private function unset_producto($unique_id) { } //para eliminar un producto debemos pasar la clave única //que contiene cada uno de ellos public function remove_producto($unique_id) { //si no existe el carrito if($this->carrito === null) { throw new Exception("El carrito no existe!", 1); } //si no existe la id única del producto en el carrito { throw new Exception("La unique_id $unique_id no existe!", 1); } //en otro caso, eliminamos el producto, actualizamos el carrito y //el precio y cantidad totales del carrito $this->update_carrito(); $this->update_precio_cantidad(); return true; } //eliminamos el contenido del carrito por completo public function destroy() { $this->carrito = null; return true; } //actualizamos el contenido del carrito public function update_carrito() { self::__construct(); } }
Te recomiendo que releas este archivo unas cuantas veces, así entenderías el total funcionamiento de este archivo y de por sí, el del script
3. Funcionamiento final
Crear un nuevo carrito
Código
$carrito = new Carrito();
Añadir un producto al carrito
Código
//array que crea un producto "id" => 14, "cantidad" => 3, "precio" => 50, "nombre" => "camisetas" ); //añadir el producto //$carrito->add($articulo);
Eliminar un producto por su unique_id
Código
$carrito->remove_producto("45c48cce2e2d7fbdea1afc51c7c6ad26");
Ese es el aspecto de un campo unique_id de cada producto.
Obtener el contenido del carrito
Código
$carrito->get_content();
Obtener el precio total del carrito
Código
$carrito->precio_total();
Obtener el número de artículos del carrito
Código
$carrito->articulos_total();
Eliminar el contenido del carrito
Código
$carrito->destroy();
Una vez creado el carrito y añadido algún producto, simplemente podemos mostrar los artículos de la siguiente forma.
Código
//asignamos a $carro el método get_content() que contiene el contenido del carrito $carro = $carrito->get_content(); if($carro) { foreach($carro as $producto) { echo $producto["id"]; echo "<br />"; echo $producto["unique_id"]; echo "<br />"; echo $producto["cantidad"]; echo "<br />"; echo $producto["precio"]; echo "<br />"; echo $producto["nombre"]; echo "<br />"; } }
De acá, solo quedaría juntar todo lo que nos falta a nuestro gusto y con nuestro diseño y listo, script funcionando
Espero que les haya servido, saludos y suerte