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

Yesod comentado

A ver, el nombre de la clase es lo primero que se me ocurre...lo mismo me pasó cuando empecé a programar en JAVA y ahora sin embargo estoy haciendo algunos video juegos, todo trata de tiempo y paciencia.

Con respecto a lo otro...si llamo con un href desde un enlace, por lógica accederá a esa pagina sin dar retorno a la del carrito. Lo cual, pienso que sirve de poco...

0voto

Leonardo-Tadei comentado

La página borrarProducto.php podría tener como última línea un

header("Location: tu_pagina_del_carrito.php");

con lo que luego de ejecutarse, volvería a la página que deseas.

Saludos cordiales!

0voto

Yesod comentado

Hice lo siguiente pero no entiendo porque no termina de funcionar.

Script:

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);

Para este código:

<?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';
    }
?>
<!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/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>
        <div class="producto">
            <?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">
                            <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="'.$producto->id.'">Eliminar</a>
                    </div>  
                    ';             
                }
            ?>
        </div>

No entiendo porque no me funciona...se supone que le estoy indicando en la clase "productofinal" le indico que donde haya luego una clase llamada "eliminar" al hacer click o una acción sobre esta llame a "eliminar.php" y ahí elimino ese producto.

0voto

Leonardo-Tadei comentado

Sin poder ejecutar el código para debuggearlo no me doy cuenta de si falla la llamada AJAX y por tanto hay un error en el JS o si falla la llamada JS está bien y falla el script PHP que hace el proceso.

Primero que todo, fijate en qué parte del código está el problema,

Veo que cambiaste el contenido de la seción y en vez de contener un objeto obj_cart ahora es un vector. Es un cambio en la implementación de la solución o es que tenés cargada una cosa pero luego buscás otra?

PD: recorré siempre los vectores (y las colecciones de objetos) con foreach porque el lenguaje no garantiza que los índices sean siempre números correlativos.

0voto

Yesod comentado

Es un cambio porque me resulta asi mas fácil pensarlo...se parece mas a JAVA, prefiero decirle en AJAX lo que tiene que buscar y donde esta y lo que tiene que hacer. Luego prefiero recorrer el array buscando el ID para eliminar todo el contenido relacionado con ese ID y hacer un nuevo array con todo lo demás (se parece mas a JAVA con sus vectores)

Voy a ver si es que no se ha cargado bien el script...estoy un poco cansado de que no pare de fallar.

EDITO: El problema esta en que el script no me carga, he puesto "alert("se omitio el evento");" para ver si hacía algo y na de na...

Te paso el enlace donde lo tengo subido: https://mega.nz/#!foBDgDyS!owZ0nAG_zmWV_eDwbPYvHuDb3GTU32rb8cAbGK7nFzQ

A ver si eres capaz de decirme donde esta el problema...

0voto

Leonardo-Tadei comentado

Hola @Yesod,

correr tu código implica usar una DB que no tengo a mano ahora. No lo tenés publicado en algún sitio público así se puede revisar el JS con todo funcionando?

Si vas a pasar a usar los productos como un vector en la sesión, tené en cuenta entonces que al agregarlos, se carguen en la sesión como vectores y no como un objeto Carrito que contiene los productos. En el código que enlazaste se cargan con una estructura pero después se borran asumiendo otra estructura, con lo que nunca los vas a encontrar.

Los vectores en PHP no se parecen tanto a los vectores en Java, sino que se parecen a las Listas en Java. Tené eso en cuenta al usarlos.

Si vas a mantener los productos en el carrito usando nu vector guardado en la sesión, el manejo es mucho más simple si usás como índice del vector el ID del Producto, de forma tal que borrar un producto del Carrito sería solamente:

function del_prod($id){
  unset($_SESSION[$id]);
}

y ver si un producto existe sería una llamada a in_array($id).

Luego, más allá de que la llamada AJAX funcione o no, justamente por estar borrando los elementos vía AJAX, si se borran de la sesión no se va a ver esto reflejado en la página que hace el llamado, porque los datos de la sesión se muestran al cargar la página, y esta no se vuelvería a cargar (por esto te comentaba más arriba el hacer una llamada normal a un script y que este al terminar vuleva a llamar a la página, con lo que conseguirías que se recargue).

Saludos cordiales!

0voto

Yesod comentado

Entonces...me estoy liando...¿Como lo puedo hacer para que, al clicar en "Eliminar" se quite el producto a través de su ID del carrito?

0voto

Leonardo-Tadei comentado

No hay una única forma de hacerlo... ni siquiera hay una única forma de hacerlo bien.

Lo que te sugiero, considerando el código en general que he visto, es que el "borrar" sea un enlace que vaya a otra página, por ejemplo:

<a href="borrarProducto.php?id={$producto->id}" class="eliminar">Eliminar</a>

y que al final del script hagas el header() que et indico más arriba.

De esta forma tenés todas las peticiones explícitas y tendrás más control sobre las idas y las vueltas.

El código de borrarProducto.php tiene que buscar el producto en la sesión (y cómo lo hagas dependerá de cómo los guardes en ella, si como objetos, si como vectores, etc). En algunos casos habrá que recorrer, y en otros se halla por clave el elemento y se lo borra.

Luego con el header() se recarga la página anterior, y al haber un producto menos en la sesión, el código que la recorre y muestra ya lo mostrará actualizado.

Después de hacer una versión más simple se podría pensar en refinar las cosas... entiendo que te estés liando, porque ahora tenés cosas de dudoso funcionamiento en varios lugares: la estructura de la DB, la clase que en ve de un objeto tiene datos, las llamadas AJAX que no recargan la página, los varios direcotorios y scripts para mostrar cada familia cuando con los datos normalizados basta con uno solo, el pensar como funciones a los métodos, el uso de funciones mysql_* ya obsoletas para conectarte a la DB, la anología no tan exacta entre vectores en JAVA y en PHP.

Si no tenés apuro y el proyecto es para aprender, te sugiero que empieces dejando solo 2 tablas para Productos y Familias conectando a la DB con mysqli_* o PDO, y armando un visulizador del catálogo con esta estructura. Luego de esto recień agregarle el carrito.

Saludos cordiales!

0voto

Yesod comentado

Lo he completado asi:

<?php
session_start();
    $arreglo=$_SESSION['carrito'];
    foreach($i as $arreglo){
        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';
    }
header("Location: ../carritodecompras.php");
?>

El problema es que me borra todos los productos...

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