Foros del Web » Programando para Internet » PHP »

Cambiar la cantidad en carrito de compras

Estas en el tema de Cambiar la cantidad en carrito de compras en el foro de PHP en Foros del Web. hola genios de la programacion como estam ^^ este es mi 1er post asi qe espero q me tengan paciencia si digo alguna macana jaja ...
  #1 (permalink)  
Antiguo 26/11/2011, 17:23
 
Fecha de Ingreso: noviembre-2011
Mensajes: 8
Antigüedad: 11 años, 2 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
  #2 (permalink)  
Antiguo 27/11/2011, 00:40
Avatar de chwc  
Fecha de Ingreso: julio-2008
Ubicación: Buenos Aires ! :D
Mensajes: 814
Antigüedad: 14 años, 5 meses
Puntos: 103
Respuesta: Cambiar la cantidad en carrito de compras

cambia esto


Código PHP:
Ver original
  1. foreach($this->olineasventa as $lv)
  2. {
  3.     if($lv->GetCod()!=$codigo)
  4.     {
  5.         echo "se ha seleccionado solo 1 producto";
  6.         //$this->cantidad = $this->cantidad +1;
  7.         //$this->olineasventa[$this->numlinea]=new LineadeVenta($codigo,$descripcion,$pv);
  8.         //$this->numlinea++;
  9.     }
  10.     else
  11.     {
  12.         $cantidad += $this->cantidad;
  13.         //$this->cantidad++;
  14.     }
  15. }
  16. $this->olineasventa[$this->numlinea]=new LineadeVenta($codigo,$descripcion,$pv);
  17. //contador de lineas de ventas e indice(una posicion en el array)
  18. $this->numlinea++;
  19. }

por esto

Código PHP:
Ver original
  1. foreach($this->olineasventa as $lv)
  2. {
  3.     if($lv->GetCod()==$codigo)
  4.     {
  5.        
  6.         $lv->cantidad = $lv->cantidad +1;
  7.     }
  8. else
  9. {
  10. $this->olineasventa[$this->numlinea]=new LineadeVenta($codigo,$descripcion,$pv);
  11. //contador de lineas de ventas e indice(una posicion en el array)
  12. $this->numlinea++;
  13.  
  14. }
  15. }


espero que este bien me costo un rato para sacarlo
+

Saludos
  #3 (permalink)  
Antiguo 27/11/2011, 06:57
Avatar de chwc  
Fecha de Ingreso: julio-2008
Ubicación: Buenos Aires ! :D
Mensajes: 814
Antigüedad: 14 años, 5 meses
Puntos: 103
Respuesta: Cambiar la cantidad en carrito de compras

Perdon, la respuesta anterior estaba mal,tendria que quedar asi
Código PHP:
Ver original
  1. $crear = true;
  2. foreach($this->olineasventa as $lv)
  3. {
  4.     if($lv->GetCod()==$codigo)
  5.     {
  6.          $crear = false;
  7.          $lv->cantidad = $lv->cantidad +1;
  8.     }
  9. }
  10.  
  11. if($crear){
  12.          $this->olineasventa[$this->numlinea]=new LineadeVenta($codigo,$descripcion,$pv);
  13.           //contador de lineas de ventas e indice(una posicion en el array)
  14.          $this->numlinea++;
  15.       }
  16. }

Saludos, y espero que este bien
  #4 (permalink)  
Antiguo 27/11/2011, 18:58
 
Fecha de Ingreso: noviembre-2011
Mensajes: 8
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Cambiar la cantidad en carrito de compras

muchas gracias x tu respuesta !!!!

ahora la pruebo y te aviso :P

funciona :D jajaja

bueniiiiiisimo maestro !!

gracias a vos pude aprobar la materia ^^

Última edición por mr_pollo; 29/11/2011 a las 18:14
  #5 (permalink)  
Antiguo 23/07/2012, 11:08
 
Fecha de Ingreso: abril-2012
Ubicación: Soy de Utiel de erasmus en Varsovia
Mensajes: 49
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Cambiar la cantidad en carrito de compras

Muy buenas compañero, es justo lo que necesito para mi carrito, que me cambie la variable cantidad, pues del 1 no se mueve haga lo que haga... llevo un mes intentando de todo y no lo encuentro, te pongo todo el codigo y a ver si pudieses saber que es lo que falta, gracias y perdona por el abuso..:)

<?php
session_start();
if(isset($_GET['id']))
{
$_SESSION['carrito'][$_GET['id']]=$_GET['id'];
}
require 'conexion.php';
?>
<!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=iso-8859-1" />
<title>Documento sin t&iacute;tulo</title>
</head>
<script>
function requerir(){
try{
req=new XMLHttpRequest();
}catch(err1){
try{
req=new ActiveXObject("Microsoft.XMLHTTP");
}catch(err2){
try{
req=new ActiveXObject("Msxm12.XMLHTTP");
}catch(err3){
req= false;
}
}
}
return req;
}
function cantidad(id)
{
//c1
//alert(id.substr(1));
var peti=requerir();
var url="proceso.php";
var valor=document.getElementById(id).value;
if valor<i || valor==""}
valor=1;

var vari="valor="+valor+"$id="+id.substr(1);
//alert(vari);
peti.open("POST",url,true);
peti.onreadystatechange = function(){
if(peti.readyState==4)
{
if(peti.status==200)
{
//alert(peti.responseText);
//location.reload();
document.getElementById('s'+id.substr(1)).value=pe ti.responseText;
total();

}else{
alert("Error --- "+peti.statusText);
}
}
};
peti.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
peti.send(vari);

function total()
{
var id = document.getElementById('tabla');
var val = id.getElementByTagName('input');
var total=0;
for(var i=0;i<val.length;++1)
{
//document.write(val[i].value);
if(i#2==1 ){
total+=parseFloat(val[1].value);
}
}
document.getElementById('total').value=Match.round (total*100)/100;
}

function solonumero (e) {
tecla = (document.all) ? e.KeyCode : e.which;
//alert(tecla);
if (tecla==8) { return true;} //Tecla de retroceso para poder borrar;
//if (tecla==$4) return true; //Coma ( En este caso para diferenciar los decimales )
else if (tecla==48) {return true}
else if (tecla==49) {return true}
else if (tecla==50) {return true}
else if (tecla==51) {return true}
else if (tecla==52) {return true}
else if (tecla==53) {return true}
else if (tecla==54) {return true}
else if (tecla==55) {return true}
else if (tecla==56) {return true}
else if (tecla==57) {return true}
else if (tecla==46) {return true}//punto
else{alert('Solo puede ingresar numeros en esta casilla');}
patron = /1/; //ver nota
te = String.fromCharCode(tecla);
return patron.test(te);
}

</script>
<body>
<p>
</p>
<table width="412" border="2">
<tr>
<td width="68" align="center">#n</td>
<td width="92" align="center" valign="middle">producto</td>
<td width="109" align="center">precio unidad</td>
<td width="47" align="center">subtotal</td>
<td width="60" align="center">&nbsp;</td>
</tr>
<?php
$cad="";
foreach($_SESSION['carrito'] as $k)
{
$cad.=' or id='.$k;
}
$sql= " select * from tb_producto where id=-1 ".$cad;

//echo $sql;
conectar();
$re=mysql_query($sql)or die (mysql_error());
desconectar();
$total=0;
$item="";
$cant=0;
$i=1;
while($f=mysql_fetch_array($re)){
?>
<tr>
<td><input name="c<?php echo $f['id'];?>" type="text" id="c<?php echo $f['id'];?>"
value="<?php if(isset($_SESSION['cantidad'][$f['id']])){
$total+=$_SESSION['cantidad'][$f['id']]*$f['precio'];
echo $_SESSION['cantidad'][$f['id']];
$cant=$_SESSION['cantidad'][$f['id']];
}else{
$total+=$f['precio'];
echo 1;
$cant=1;
}
?>" size="3" onkeyup="cantidad(this.id)" onkeypress="return solonumero(event)"></td>
<td><?php echo $f['nombre'];?></td>
<td><?php echo $f['precio'];?></td>
<td align="center"><input name="s<?php echo $f['id'];?>" type="text" id="s<?php echo $f['id'];?>"
value="<?php if(isset($_SESSION['cantidad'][$f['id']])){
echo $_SESSION['cantidad'][$f['id']]*$f['precio'];

}else{
echo $f['precio'];
}
?>" size="5" readonly="readonly"></td>
<td><a href="eliminar.php?id=<?php echo $f['id'];?>">Eliminar</a></td>
<td align="center"><a href="eliminar.php?id=<?php echo $f['id'];?>"></a></td>
</tr>
<?php
}
?>
</table>
<p>

</p>
<p>&nbsp;</p>
<p><a href="producto.php">seguir comprando </a></p>
</body>
</html>

Etiquetas: cantidad, carrito, carrito+de+compras, carrito+php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 17:55.