entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Eliminar objeto CarritoCompra PHP

Buenas noches compañeros, estoy intentando en el carrito compra que ya me solucionó un compañero sobre como añadir objetos a un carrito...el caso, es que claro, quiero también tener la posibilidad de borrar el objeto del carrito de compra.

De momento, he conseguido este código:

<?php  
        /* COMPRUEBO QUE EL TOTAL SEA MAYOR A CERO, ESO SIGNIFICA QUE HAY PRODUCTOS EN LA CESTA */ 
        if($obj_kart->total_kart() > 0){  
            /* IMPRIMIMOS CADA PRODCUTO */ 
            foreach($obj_kart->productos as $producto){ 
                echo ' 
                <div class="productofinal">  
                    <center>  
                        <img src="'.$producto->imagen.'"><br>  
                        <span>'.$producto->nombre.'</span><br>  
                        <span>Precio: '.$producto->precio.'</span><br>  
                        <span>Cantidad:   
                            <input type="text" value="'.$producto->cantidad.'" size="5px";
                            data-precio="'.$producto->precio.'" 
                            data-id="'.$producto->id.'" class="cantidad"></span><br>  
                        <span class="subtotal">Subtotal:'.$producto->precio * $producto->cantidad.'></span><br>  
                        <a href="#" class="eliminar" data-id="'.$obj_kart->del_prod($producto->id).'">Eliminar</a>
                    </center>  
                </div>  
                ';             
            }
        ?>

Aquí adjunto la parte PHPOO para dar la información relativa a cuando añado un objeto y a cuando intento eliminarlo.

class datos_producto { 
    public $numArt; 
    public $id; 
    public $nombre; 
    public $precio; 
    public $cantidad; 
    public $imagen; 
} 
    /* ESTA FUNCIÓN AÑADE ARTÍCULOS O CAMBIA CANTIDADES AL ARTÍCULO */ 
    function add_changue_prod($id,$nombre,$precio,$cantidad,$imagen){ 
        $productos = $this->productos; 
        $poner = true; 

        foreach($productos as $key => $producto){ 
            if($id == $producto->id){ 
                $poner = false; 
                if(!$cantidad){ 
                    $producto->cantidad++; 
                }else{ 
                    $producto->cantidad = $cantidad; 
                } 
            } 
        } 

        if($poner){ 
            if(!$cantidad){ 
                $cantidad = 1; 
            } 
            $A = $key + 1; 
            $this->productos[$A] = new datos_producto(); 
            $this->productos[$A]->numArt = $A; 
            $this->productos[$A]->id = $id; 
            $this->productos[$A]->nombre = $nombre ; 
            $this->productos[$A]->precio = $precio ; 
            $this->productos[$A]->cantidad = $cantidad; 
            $this->productos[$A]->imagen = $imagen ; 
        } 
    } 

    /* ESTA FUNCIÓN ELIMINA ARTÍCULOS DEL CARRITO */ 
    function del_prod($numArt){ 
        unset($this->productos [$numArt]);
    } 

El tema esta en que no estoy consiguiendo lo deseado. Lo único que consigo es que la página se recargue...

Gracias por toda la ayuda que recibo, es un proyecto personal para aprender :)

1 Respuesta

1voto

Leonardo-Tadei Puntos227320

Hola @Yesod,

la página solo se recarga porque el enlace para sacar un elemento del carrito

<a href="#" class="eliminar" data-id="'.$obj_kart->del_prod($producto->id).'">Eliminar</a>

tiene el enlace apuntando a un ancla vacía de la misma página (el #).

Tenés que hacer que ese enlace apunte al código que borrará el elemento del carrito, como por ejemplo:

<a href="borrarProducto.php?id={$producto->id}" class="eliminar" data-id="'.$obj_kart->del_prod($producto->id).'">Eliminar</a>

Por otra parte si el código de $obj_kart->del_prod() estuviera funcionando, estarías dando la orden de borrar cada producto a medidda que lo vas mostrando...

Saludos cordiales!

PD: No es algo que preguntaste pero no me puedo aguartar... que el nombre de la clase se llame class datos_producto implica que no estás comprendiendo el paradigma de la Programación Orientada a Objetos :-(

0voto

Leonardo-Tadei comentado

Te comento sobre esto más arriba: si estás cargando los productos como Objetos a la sesión, pero acá los estás buscando como elementos de una ARRAY, el bucle no encontrará nada haciendo que $datosNuevos no exista, y al ejecutar unset($_SESSION['carrito']) estás borrando toda la sesión.

Tenés que manejar para el alta y la baja la misma esctructura de datos...

0voto

Yesod comentado

¿Entonces tendría que cambiar el sistema de carritocompra y hacer que fuera un array de sesion?

0voto

Leonardo-Tadei comentado

Da lo mismo cual cambies: lo importantes es que la estructura de datos sea siempre la misma.

0voto

Yesod comentado

Bueno, ya esta solucionado, cambié el código por completo, pero lo entiendo mejor y me siento mas cómodo trabajando con este:

Trabajo con la variable de sesion y, mediante un array voy a manipulando los datos. Aquí el código por si alguien mas lo necesita:

<?php
    session_start();
    include './conexion.php';
    if(isset($_SESSION['carrito'])){
        if(isset($_GET['id'])){
            $arreglo=$_SESSION['carrito'];
            $encontro=false;
            $numero=0;
            for($i=0;$i<count($arreglo);$i++){
                if($arreglo[$i]['Id']==$_GET['id']){
                    $encontro=true;
                    $numero=$i;
                }
            }
            if($encontro==true){
                $arreglo[$numero]['Cantidad']=$arreglo[$numero]['Cantidad']+1;
                $_SESSION['carrito']=$arreglo;
            }else{
                $nombre="";
                $precio=0;
                $imagen="";
                $re=mysql_query("select * from productos where id=".$_GET['id']);
                while ($f=mysql_fetch_array($re)){
                    $nombre=$f['nombre'];
                    $precio=$f['precio'];
                    $imagen=$f['imagen'];
                }
                $datosNuevos=array('Id'=>$_GET['id'],
                                'Nombre'=>$nombre,
                                'Precio'=>$precio,
                                'Imagen'=>$imagen,
                                'Cantidad'=>1);

                array_push($arreglo, $datosNuevos);
                $_SESSION['carrito']=$arreglo;
            }
        }
    }else{
        if(isset($_GET['id'])){
            $nombre="";
            $precio=0;
            $imagen="";
            $re=mysql_query("select * from productos where id=".$_GET['id']);
            while ($f=mysql_fetch_array($re)){
                $nombre=$f['nombre'];
                $precio=$f['precio'];
                $imagen=$f['imagen'];
            }
            $arreglo[]=array('Id'=>$_GET['id'],
                            'Nombre'=>$nombre,
                            'Precio'=>$precio,
                            'Imagen'=>$imagen,
                            'Cantidad'=>1);
            $_SESSION['carrito']=$arreglo;
        }
    }
?>
<!DOCTYPE html>
<html lang="es">
    <head>
        <meta charset="utf-8"/>
        <title>Carrito de Compras</title>
        <link rel="stylesheet" type="text/css" href="./css/estilos.css" />
        <script type="text/javascript" src="js/scriptJQuery.js"></script>
        <script type="text/javascript"  src="./js/scripts.js"></script>
    </head>
    <body>
        <header>
            <img src="./imagenes/logo.png" id="logo" />
            <a href="./carritodecompras.php" title="ver carrito de compras"><img src="./imagenes/carrito.png" /></a>
        </header>
        <section>
            <div id="separador">
            </div>
            <?php
                $total=0;
                if(isset($_SESSION['carrito'])){
                    $datos=$_SESSION['carrito'];

                    $total=0;
                    for($i=0;$i<count($datos);$i++){
            ?>
                        <div class="productofinal">
                            <center>
                                <img src="<?php echo $datos[$i]['Imagen'];?>" /><br />
                                <span ><?php echo $datos[$i]['Nombre'];?></span><br />
                                <span>Precio: <?php echo $datos[$i]['Precio'];?></span><br />
                                <span>Cantidad: 
                                    <input type="text" value="<?php echo $datos[$i]['Cantidad'];?>"
                                    data-precio="<?php echo $datos[$i]['Precio'];?>"
                                    data-id="<?php echo $datos[$i]['Id'];?>"
                                    class="cantidad">
                                </span><br />
                                <span class="subtotal">Subtotal:<?php echo $datos[$i]['Cantidad']*$datos[$i]['Precio'];?></span><br />
                                <a href="#" class="eliminar" data-id="<?php echo $datos[$i]['Id']?>">Eliminar</a>
                                </center>
                        </div>
                        <?php
                        $total=($datos[$i]['Cantidad']*$datos[$i]['Precio'])+$total;
                    }
                }else{
                        echo '<center><h2>No has añadido ningun producto</h2></center>';
                    }
                    echo '<center><h2 id="total">Total: '.$total.'</h2></center>';
                    if($total>0){
                            //echo '<center><a href="./compras/compras.php" class="aceptar">Comprar</a></center>';
                        ?>
                        <form action="https://www.paypal.com/cgi-bin/webscr" method="post" id="formulario">
                            <input type="hidden" name="cmd" value="_cart">
                            <input type="hidden" name="upload" value="1">
                            <input type="hidden" name="business" value="[email protected]">
                            <input type="hidden" name="currency_code" value="MXN">
                            <?php 
                                for($i=0;$i<count($datos);$i++)
                                {
                            ?>
                                <input type="hidden" name="item_name_<?php echo $i+1;?>" value="<?php echo $datos[$i]['Nombre'];?>">
                                <input type="hidden" name="amount_<?php echo $i+1;?>" value="<?php echo $datos[$i]['Precio'];?>">
                                <input  type="hidden" name="quantity_<?php echo $i+1;?>" value="<?php echo $datos[$i]['Cantidad'];?>">  
                            <?php 
                                }
                            ?>
                            <center><input type="submit" value="comprar" class="aceptar" style="width:200px"></center>
                        </form>
                        <?php
                    }
                        ?>
                <center><a href="./">Ver catalogo</a></center>
        </section>
    </body>
</html>

Aquí el script que uso para la comunicación entre las páginas:

var inicio=function () {
    $(".eliminar").click(function(e){
        e.preventDefault();
        var id=$(this).attr('data-id');
        $(this).parentsUntil('.productofinal').remove();
        $.post('js/eliminar.php',{
            Id:id
        },function(a){
            if(a=='0'){
                location.href="./carritodecompras.php";
            }
        });

    });
}   
$(document).on('ready',inicio);

Aqui el código que uso para guardar el resto de objetos en un nuevo array eliminando el antiguo, dejando asi, solo los objetos que no quiero eliminar, es decir, al clicar en un objeto para eliminarlo, guardo el resto en el nuevo array:

<?php
session_start();
    $arreglo=$_SESSION['carrito'];
    for($i=0;$i<count($arreglo);$i++){
        if($arreglo[$i]['Id']!=$_POST['Id']){
            $datosNuevos[]=array(
                'Id'=>$arreglo[$i]['Id'],
                'Nombre'=>$arreglo[$i]['Nombre'],
                'Precio'=>$arreglo[$i]['Precio'],
                'Imagen'=>$arreglo[$i]['Imagen'],
                'Cantidad'=>$arreglo[$i]['Cantidad']
                );
        }
    }
    if(isset($datosNuevos)){
        $_SESSION['carrito']=$datosNuevos;
    }else{
        unset($_SESSION['carrito']);
        echo '0';
    }
?>

1voto

Leonardo-Tadei comentado

Gracias por compartir el código final!
Seguro que será de utilidad para muchos.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta