Hola amigos de Foros del Web!!
Estoy algo enquistado con una clase muy sencilla, un carito de la compra que los amigos de www.desarrolloweb.com ofrecieron hace un tiempo.
La clase es la siguiente:
Código PHP:
<?
class carrito {
//atributos de la clase
public $num_productos;
public $array_id_prod;
public $array_nombre_prod;
public $array_precio_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){
$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++;
}
function num_items(){
echo count ($this->array_id_prod);
}
//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){
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 más 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;
}
}
//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();
}
?>
Así de sencilla. Todo el carrito se rige por sesiones, se supone que en cada página hay que empezar lo típico, con session_start(); y que la sesión: $_SESSION["ocarrito"] se enlaza a la creación de un objeto: $_SESSION["ocarrito"] = new carrito();
El caso es que funciona bien salvo para el primer "pedido". La primera vez que "compro" algo no funciona, la segunda, tercera etc si. Por eso creo que es un problema con las sesiones, pq en el código de la clase no encontré ningún error.
La página para ver el carrito sería algo así:
Código PHP:
<?
include("clases/lib_carrito.php");
session_start();
?>
<html>
<head>
<title>Introduce Producto</title>
</head>
<body>
<?
$_SESSION["ocarrito"]->imprime_carrito();
$_SESSION["ocarrito"]->num_items();
?>
<br>
<br>
<a href="index.php">Volver</a>
</body>
</html>
y la página para añadir productos sería así:
Código PHP:
<?
include("clases/lib_carrito.php");
session_start();
if (!isset($_SESSION["ocarrito"])){
$_SESSION["ocarrito"] = new carrito();
}
$_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>
los productos, enlaces son de la forma:
Código HTML:
<a href="mete_producto.php?id=12&nombre=silla+modelo+jupiter&precio=80">Silla modelo jupiter 80 euros</a>
Espero me puedan aydar, porque la clase aunque muy sencilla me sería de gran ayuda.
¿Porque creen que la primera de las compras no funciona y las siguientes si?
Muchas gracias!!!