Implementación de la clase carrito en PHP

  • Por
Implementación de la clase del carrito de la compra en PHP, con las propiedades y métodos.
Como habíamos dicho, el carrito de la compra se ha implementado en una clase, para aprovechar algunas de las ventajas de la programación a objetos. Vamos a ver ahora cómo realizar esa clase, lo que incluye la definición de propiedades y métodos.

Atributos de la clase carrito

Es preferible empezar por ver los atributos que tendrá la clase carrito, que ya adelantamos en el capítulo 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 número 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 tuviésemos un solo producto en el carrito, $num_productos valdría uno. Además, en los arrays tendríamos una sola posición (con índice cero), donde se guardaría el identificador, nombre y precio. Estos datos se guardan por separado en cada uno de los tres arrays.

Métodos del carrito

Vamos ahora con las funciones típicas del carrito que se necesitará crear en algún momento.

Constructor

Se debe contar con un constructor que resuma las tareas de inicialización del carrito. En concreto, el constructor simplemente inicia a cero el número 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 método introduce_producto(),que recibe los datos del producto y los introduce en el objeto carrito. También aumenta en uno el número 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 función que nos permita eliminar un producto del carrito. En este caso voy a crear una función que recibe el número de línea del producto dentro del carrito, que corresponde con el índice de los arrays de productos que deseamos borrar. Podríamos recibir también 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 línea del carrito y otra recibiendo el identificador del producto. Para este ejemplo me resulta más fácil recibir la línea 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 sesión porque eso nos obligaría a recolocar todos los índices de las variables de sesión 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 número 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 capítulo veremos la implementación del método más complicado del carrito, que es el encargado de mostrar todos los productos que hay dentro.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Ezequiel

22/5/2006
No se porque dividis en 3 arrays los datos de los productos. Bueno, a mi entender, un carrito es simplemente una coleccion de objetos "producto". Digo, la implementacion de un objeto carrito es con una clase conjunto o set de objetos "producto". Cada producto tiene atributos como el Id, el nombre y el precio. Me parece mas intuitivo, no? Digo set, porque anulo la repeticion de elementos iguales, cuando quiero meter 2 productos iguales al carrito, lo que hago es guardar la cantidad de productos iguales que quiero como un atributo del producto insertado.

Y bueno, eso de cantidad de elem del carrito es #(set) length o como se le dice, pero creo q esta bien porque es mas eficiente tenerlo en una constante y no llamar al metodo constantemente.

bue saludos

Andteinadc

08/2/2010
Modificacion
Me parece una facil manera de realizar un carro de compra, gracias por la idea.
Realice algunas modificaciones para que contemplara trabajar con cantidades y acumular las cantidades si deseo comprar un mismo articulo:
<?php
class carrito {
var $num_productos;
var $array_id_prod;
var $array_nombre_prod;
var $array_precio_prod;
var $array_cant_prod;

//constructor. Realiza las tareas de inicializar los objetos cuando se instancian
//inicializa el numero de productos a 0
function __constructor () {
$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,$cant_prod){
$i=$this->buscar($id_prod);
if($i){
$this->array_cant_prod[$i]=$this->array_cant_prod[$i]+$cant_prod;
}
else{
$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->array_cant_prod[$this->num_productos]=$cant_prod;
$this->num_productos++;
}

}

function buscar($id_prod){
$enc=0;
for ($i=0;$i<$this->num_productos;$i++)
if($this->array_id_prod[$i]==$id_prod)
$enc=i;
return($enc);
}


//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>
<tr>
<td><b>Nombre producto</b></td>
<td><b>Precio</b></td>
<td><b>Cantidad</b></td>
<td><b>Total prod</b></td>
<td><b>Acción</b></td>
<td> </td>
</tr>';
for ($i=0;$i<$this->num_productos;$i++){
if($this->array_id_prod[$i]!=0){
$st=$this->array_cant_prod[$i]*$this->array_precio_prod[$i];
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>" . $st. "</td>";
echo "<td><a href='eliminar_producto.php?id='".$array_id_prod[$i]."'>Eliminar</td>";
echo '</tr>';
$suma += $st;
}
}
//muestro el total
echo "
<td> </td><td> </td>
<tr><td><b>TOTAL:</b></td>
<td> <b>$suma</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($id_prod){
$i=$this->buscar($id_prod);
if($i){
$this->array_id_prod[$i]=0;
$this->array_nombre_prod[$i]="";
$this->array_precio_prod[$i]=0;
$this->array_cant_prod[$i]=0;
}
}

}
?>
Espero que sea de ayuda, tanto como lo fueron para mi