Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/11/2011, 17:23
mr_pollo
 
Fecha de Ingreso: noviembre-2011
Mensajes: 8
Antigüedad: 12 años, 5 meses
Puntos: 1
Cambiar la cantidad en carrito de compras

hola genios de la programacion como estam ^^

este es mi 1er post asi qe espero q me tengan paciencia si digo alguna macana jaja
bueno necesito una mano con un trabajo practico del carrito de compras en php realizado con programacion orientada a objetos.

Yo recien estoy comenzando con programacion web, me puedo defender masomenos en todo lo qe es formularios altas, validaciones, css, bases de datos... pero el tema de la progr. orientada a objetos me tiene quemandome la cabesa

El trabajo consiste en realizar una pagina web de carrito de compras con varias funciones ... yo ya tengo resuelta la mayor parte del trabajo pero como les dije entiendo muy poco de clases, objetos y funciones.

LO que necesito es qe cuando se agreguen dos o mas veces el mismo producto , el valor de la cantidad cambie a 2,3,4,etc... en vez de simplemente agregarse varias veces ese producto con cantidad=1 .

Les dejo las tablas de mi base de datos.. :

-Carritos: idcarrito, fechaventa, idusu (tabla que almacena los carritos)
-lineasdeventas: codprod, idcarrito, cantidad, precio (tabla q guarda las lineas de productos comprados)
-productos: codprod, desprod, codrub, precioventa, stock
-usuarios: id, usuario, password, email

En cuanto al codigo utilizo una pagina como libreria que contiene todas las clases definidas, funciones del carrito, etc ,,, esta pagina esta incluida en todas las demas de mi trabajo

Pagina lib_carrito_class.php
Código PHP:
<?php
class LineadeVenta{
    private 
$cod;
    private 
$des;
    private 
$precio;
    public 
$cantidad;
    
//constructor de LineadeVenta
    //$cant=1 es valor que se establece por defecto a $cant en el caso de 
    //se omita este valor cuando se cree un objeto
    
function __construct($codigo,$descripcion,$pv,$cant=1)
    {
    
$this->cod=$codigo;
    
$this->cantidad=$cant;
    
$this->des=$descripcion;
    
$this->precio=$pv;
    }
   function 
GetCod(){return $this->cod;}
   function 
GetDes(){return $this->des;}
   function 
GetPrecio(){return $this->precio;}
   function 
GetCantidad(){return $this->cantidad;}
   function 
SetCod($newcod){$this->cod=$newcod;}
   
//crear una metodo que calcule el subtotal
}
/*****fin de la definicion de la clase LineadeVenta**************************************/
/******inicio de la clase Carrito******/
class Carrito{
public 
$olineasventa;
private 
$numlinea;
//constructor. Realiza las tareas de inicializar los objetos cuando se instancian
//inicializa el numero de lineas de venta a 0
function __construct()
{
//inicializar la variable como array
$this->olineasventa=array();
//inicializar el indice del array a cero
$this->numlinea=0;
}

//Introduce una linea de venta en el carrito. Recibe los datos del producto
//Se encarga de introducir los datos en los array olineasventa del objeto carrito
//luego aumenta en 1 indice(numlinea)
function AgregarLineasVentas($codigo,$descripcion,$pv)
{
//crear un objeto LineadeVenta y almacenarlo en una posicion del array
//deternimada por numlinea
//Corregir para mostrar cantidad= 2 cuando seleccione el mismo producto
foreach($this->olineasventa as $lv)
{
    if(
$lv->GetCod()!=$codigo)
    {
        echo 
"se ha seleccionado solo 1 producto";
        
//$this->cantidad = $this->cantidad +1;
        //$this->olineasventa[$this->numlinea]=new LineadeVenta($codigo,$descripcion,$pv);
        //$this->numlinea++;
    
}
    else
    {
        
$cantidad += $this->cantidad;
        
//$this->cantidad++;
    
}
}
$this->olineasventa[$this->numlinea]=new LineadeVenta($codigo,$descripcion,$pv);
//contador de lineas de ventas e indice(una posicion en el array)
$this->numlinea++;
}
        
//Muestra el contenido del carrito de  compra
//ademas pone los enlaces para eliminar una linea de venta del carrito
function imprime_carrito(){
$totalcarrito 0;
?>
<table border=1 cellpadding="3">
      <tr>
        <th>Codigo</th>
        <th>Nombre producto</th>
        <th>Precio</th>
        <th>Cantidad</th>
        <th>Subtotal</th>
        <th>&nbsp;</th>
      </tr>
<?php
foreach($this->olineasventa as $i=>$p)
{
    
//filtrar las lineas de ventas eliminadas
    //osea que sean distintas de 0(cero)
    
if($p->GetCod()!=0){
        
//ustedes debera crear un metodo en la clase LineadeVenta que realice
        //la siguiente operación
        
$subtotal=$p->GetPrecio()*$p->GetCantidad();
        
?>
        <tr>
        <td><?php echo $p->GetCod()?></td>
        <td><?php echo $p->GetDes()?></td>
        <td><?php echo $p->GetPrecio()?></td>
        <td><?php echo $p->GetCantidad()?></td>
        <td><?php echo $subtotal?></td>
        <td><a href='eliminar_producto.php?linea=<?php echo $i?>'>Eliminar producto</a></td>
        </tr>
        <?php
        $totalcarrito 
+= $subtotal;
    }
}
//muestro el total
?>
<tr>
  <td colspan="4" align="right"><strong>TOTAL:</strong></td>
  <td colspan="2"><strong><?php echo $totalcarrito?></strong></td>
  </tr>
<tr>
  <td colspan="4" align="right"><strong>IVA (21%):</strong></td>
  <td colspan="2"><strong><?php echo $totalcarrito1.21?></strong></td>
  </tr>
</table>
<?php }//fin de la funcion imprime_carrito
//elimina una linea de venta 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){
//llamar al metodo Setcod para establecer su valor a 0(cero)
$this->olineasventa[$linea]->SetCod(0);
}
}
function 
__destruct()
{
    
}
//inicio la sesión
session_start();
//si no esta creado el objeto carrito en la sesion, lo creamos
if (!isset($_SESSION["ocarrito"]))$_SESSION["ocarrito"] = new Carrito();
?>
En la parte de function AgregarLineasVentas($codigo,$descripcion,$pv).... alli tengo que CREAR una funcion o un metodo (creo qe es con un for each) que compare el codigo de los productos ya agregados al carrito (en la variable de session temporal) con el codigo del producto q estoy agregando en ese momento, entonces si el codigo coincide qiere decir qe tenemos al menos 2 veces el mismo producto en el carrito (variable temporal), si pasa esto en vez de agregar otra linea de venta lo que quiero es que la cantidad se vaya incrementando, y de esta forma poder guardar varios productos en la misma linea de venta.

y por ultimo les dejo la pagina que guarda el carrito en la base de datos .

grabar_carrito.php
Código PHP:
<?php 
include("class/lib_carrito.class.php");
include(
"funciones.php");
include(
"Connections/conexion.php");

$sql="select MAX(idcarrito) AS ultimo FROM carritos";
$rs=mysql_query($sql,$cnn) or die ("ERROR SQL linea 7");
if (
mysql_num_rows($rs) == 0)
$nuevocodigo=0;
else
{
$fila=mysql_fetch_array($rs);
$nuevocodigo=$fila['ultimo'] + 1;
}
//echo "nuevo codigo"=$nuevocodigo;
$fechaventa=GetSQLValueString(date("y-m-d"), "date");
$idusu=GetSQLValueString($_SESSION['idusu'], "int");
$nuevocodigo=GetSQLValueString($nuevocodigo"int");
$SQL="INSERT INTO carritos(idcarrito, fechaventa, idusu) values($nuevocodigo,$fechaventa,$idusu)";
//ejecutar la sentencia anterior
$Result=mysql_query($SQL$cnn) or die("ERROR SQL linea 21");

foreach(
$_SESSION['ocarrito']->olineasventa as $lv)
{
$codprod=$lv->GetCod();
$cantidad=$lv->GetCantidad();
$precio=$lv->GetPrecio();
//Insertar en la tabla lineasdeventa
$InsertSQL="INSERT INTO lineasdeventas(codprod, idcarrito, cantidad, precio) values($codprod,$nuevocodigo,$cantidad,$precio)";

$Result1=mysql_query($InsertSQL$cnn) or die("ERROR SQL linea 30");
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Datos guardados</title>
</head>

<body>
<h1>Datos guardados en la base de datos</h1>
<p><a href="index.php">Volver a Index</a></p>
<h1>Completar este script</h1>
<p>En esta pagina se debe grabar el <strong>Carrito de compras</strong> en la base de datos:</p>
<p>1_Generar un nuevo valor secuencial(de forma equivalente a un campo autoincremental) para idcarrito</p>
<p>2_Grabar los datos en la tabla <strong>carritos</strong></p>
<p>3_Recorrer el objeto contenedor ocarrito, mediante un foreach, para extraer las lineasdeventas y guardarlas en la tabla <strong>lineasdeventa.</strong></p>
<p>4_Mostrar el siguiente mensaje: &quot;Datos guardados en la base de datos&quot;.</p>
<p>5_Eliminar el objeto ocarrito de memoria.</p>
<p>6_Mostrar un vinculo para regresar a la pagina principal.</p>
</body>
</html>
Espero su ayuda con esto xfavor u.u
Gracias y saludos :D

Última edición por mr_pollo; 26/11/2011 a las 18:25