Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Floodish

#1
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) [Seleccionar]
<?php
session_start
();
 
class 
Carrito
{
 
//aquí guardamos el contenido del carrito
private $carrito = array();
 
//seteamos el carrito exista o no exista en el constructor
public function __construct()
{

if(!isset($_SESSION["carrito"]))
{
$_SESSION["carrito"] = null;
$this->carrito["precio_total"] = 0;
$this->carrito["articulos_total"] = 0;
}
$this->carrito $_SESSION['carrito'];
}
 
//añadimos un producto al carrito
public function add($articulo = array())
{
//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
if(!is_array($articulo) || empty($articulo))
{
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
$unique_id md5($articulo["id"]);
 
//creamos la id única para el producto
$articulo["unique_id"] = $unique_id;

//si no está vacío el carrito lo recorremos 
if(!empty($this->carrito))
{
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
$articulo["cantidad"] = trim(preg_replace('/([^0-9\.])/i'''$articulo["cantidad"]));
    $articulo["precio"] = trim(preg_replace('/([^0-9\.])/i'''$articulo["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
if(!isset($this->carrito["precio_total"]) || $this->carrito === null)
{
return 0;
}
//si no es númerico lanzamos una excepción porque no es correcto
if(!is_numeric($this->carrito["precio_total"]))
{
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
if(!isset($this->carrito["articulos_total"]) || $this->carrito === null)
{
return 0;
}
//si no es númerico lanzamos una excepción porque no es correcto
if(!is_numeric($this->carrito["articulos_total"]))
{
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
unset($carrito["articulos_total"]);
unset($carrito["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)
{
unset($_SESSION["carrito"][$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
if(!isset($this->carrito[$unique_id]))
{
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
unset($_SESSION["carrito"][$unique_id]);
$this->update_carrito();
$this->update_precio_cantidad();
return true;
}
 
//eliminamos el contenido del carrito por completo
public function destroy()
{
unset($_SESSION["carrito"]);
$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 (php) [Seleccionar]
$carrito = new Carrito();


Añadir un producto al carrito


Código (php) [Seleccionar]
//array que crea un producto
$articulo = array(
"id" => 14,
"cantidad" => 3,
"precio" => 50,
"nombre" => "camisetas"
);

//añadir el producto
//$carrito->add($articulo);



Eliminar un producto por su unique_id


Código (php) [Seleccionar]
$carrito->remove_producto("45c48cce2e2d7fbdea1afc51c7c6ad26");


Ese es el aspecto de un campo unique_id de cada producto.

Obtener el contenido del carrito


Código (php) [Seleccionar]
$carrito->get_content();


Obtener el precio total del carrito

Código (php) [Seleccionar]
$carrito->precio_total();


Obtener el número de artículos del carrito


Código (php) [Seleccionar]
$carrito->articulos_total();


Eliminar el contenido del carrito


Código (php) [Seleccionar]
$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 (php) [Seleccionar]
//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 ;-)