Keep array of objects in a session

0

Trying to create a shopping cart I have the following question:

I have a detalleticket class and I add to an array each object of the detailTicket class that I then add to a session. It happens that when wanting to show the item says undefined and the console, the var_dumop returns empty objects.

My premise is: I'm not putting "an" object in the session, but an array of objects. then: as an arrangement of objects is passed through session and then it is traversed:

new code:

<?php


include_once ($_SERVER['DOCUMENT_ROOT'].'/gestionweb/models/claseTicket.php');
session_start();

    if (isset($_POST['accion'])){
   if ($_POST['accion']=="listar"){

    if(isset($_SESSION['carrito'])){
             $informacion =$_SESSION['carrito']; 
            $carrito[] = unserialize($informacion);
            
             echo json_encode($carrito);
                     
        }else{
         
      $carrito = array();
      echo json_encode($carrito);
        }
    
   }else if ($_POST['accion']=="agregar"){
        $id = $_POST['id'];
        $pu = $_POST['precio'];
        $cant = $_POST['cantidad'];
        $nom = $_POST['nombre'];
        $detalle = new detalleTicket($id,$pu,$cant,$nom);
    
        
 
        
     if(isset($_SESSION['carrito'])){
//predefine que la variable carrito sea un array
//desserializa la informacion, ya que la estas cada vez serializando y nunca la deserializas
            $informacion =$_SESSION['carrito']; 
            $carrito[] = unserialize($informacion);
        } else {
            $carrito = array();
        }

        array_push($carrito, $detalle);

        $_SESSION['carrito'] = serialize($carrito);

    }
    
  
   
}   


?>

I think the mistake is there.

This is the AJAX code, which is loaded when entering the cart list:

$(document).ready(function() {
listarDetalle();

});
function listarDetalle(){
     var accion="listar";
      
    $.ajax({
     
            type: "POST",
            url: "//localhost/gestionweb/includes/php/procesoDetalle.php",
            data: { "accion":accion}, 
           dataType:'json',
        
            error: function(){
                alert("error petición ajax");
               
            },
            
            success: function(data){
              
          console.log(data);
          
                                   
               for (var i = 0; i < data.length; i++) {
        
                var newRow =
                    "<tr>" +
                    "<td>" + data[i].idp + "</td>" +
               
                    "<td>" + data[i].cantidad + "</td>" +
                    "<td>" + data[i].nombre + "</td>" +
                      "<td>" + data[i].pu + "</td>" +
                    "<td><input type='radio' id='"+data[i].idp+"' name='seleccion'/></td>"+
                    "</tr>";
                $(newRow).appendTo("#ticket tbody");                 
       
    
               
            
        
  

        } }
        
}).fail( function( jqXHR, textStatus, errorThrown ) {

  if (jqXHR.status === 0) {

    alert('Not connect: Verify Network.');

  } else if (jqXHR.status == 404) {

    alert('Requested page not found [404]');
  

  } else if (jqXHR.status == 500) {

    alert('Internal Server Error [500].');

  } else if (textStatus === 'parsererror') {

    alert('Requested JSON parse failed.');

  } else if (textStatus === 'timeout') {

    alert('Time out error.');

  } else if (textStatus === 'abort') {

    alert('Ajax request aborted.');

  } else {

    alert('Uncaught Error: ' + jqXHR.responseText);

  }

});;

};
    
asked by Caruso 02.09.2018 в 14:11
source

2 answers

0

Try this way:

if(isset($_SESSION['carrito'])){
//predefine que la variable carrito sea un array
//desserializa la informacion, ya que la estas cada vez serializando y nunca la deserializas
            $informacion =$_SESSION['carrito']; 
            $carrito[] = unserialize($informacion);
        } else {
            $carrito = array();
        }

        array_push($carrito, $detalle);

        $_SESSION['carrito'] = serialize($carrito);

you tell me how it was ...

    
answered by 02.09.2018 / 18:00
source
0

Well after fighting so much I found a class and implemented it, the objects arrive well on the console, but it does not show them, but it is already an advance:

<?php


include_once ($_SERVER['DOCUMENT_ROOT'].'/gestionweb/models/claseTicket.php');
session_start();
class Carrito
{
    //aquí guardamos el contenido del carrito
    private $carrito = array();
    //seteamos el carrito exista o no exista en el constructor
    public function __construct()
    {
        if(!isset($_SESSION["carrito"]))
        {
            $_SESSION["carrito"] = null;
            $this->carrito["precio_total"] = 0;
            $this->carrito["articulos_total"] = 0;
        }
        $this->carrito = $_SESSION['carrito'];
    }
    //añadimos un producto al carrito
    public function add($articulo = array())
    {
        //primero comprobamos el articulo a añadir, si está vacío o no es un 
        //array lanzamos una excepción y cortamos la ejecución
        if(!is_array($articulo) || empty($articulo))
        {
            throw new Exception("Error, el articulo no es un array!", 1);
        }
        //nuestro carro necesita siempre un id producto, cantidad y precio articulo
        if(!$articulo["id"] || !$articulo["cantidad"] || !$articulo["precio"])
        {
            throw new Exception("Error, el articulo debe tener un id, cantidad y precio!", 1);
        }
        //nuestro carro necesita siempre un id producto, cantidad y precio articulo
        if(!is_numeric($articulo["id"]) || !is_numeric($articulo["cantidad"]) || !is_numeric($articulo["precio"]))
        {
            throw new Exception("Error, el id, cantidad y precio deben ser números!", 1);
        }
        //debemos crear un identificador único para cada producto
        $unique_id = md5($articulo["id"]);
        //creamos la id única para el producto
        $articulo["unique_id"] = $unique_id;
        //si no está vacío el carrito lo recorremos 
       /* if(!empty($this->carrito))
        {
            foreach ($this->carrito as $row)
            {
                //comprobamos si este producto ya estaba en el 
                //carrito para actualizar el producto o insertar
                //un nuevo producto	
                if($row["unique_id"] === $unique_id)
                {
                    //si ya estaba sumamos la cantidad
                    $articulo["cantidad"] = $row["cantidad"] + $articulo["cantidad"];
                }
            }
        }*/
        //evitamos que nos pongan números negativos y que sólo sean números para cantidad y precio
        $articulo["cantidad"] = trim(preg_replace('/([^0-9\.])/i', '', $articulo["cantidad"]));
        $articulo["precio"] = trim(preg_replace('/([^0-9\.])/i', '', $articulo["precio"]));
        //añadimos un elemento total al array carrito para 
        //saber el precio total de la suma de este artículo
        $articulo["total"] = $articulo["cantidad"] * $articulo["precio"];
        //primero debemos eliminar el producto si es que estaba en el carrito
        $this->unset_producto($unique_id);
        ///ahora añadimos el producto al carrito
        $_SESSION["carrito"][$unique_id] = $articulo;
        //actualizamos el carrito
        $this->update_carrito();
        //actualizamos el precio total y el número de artículos del carrito
        //una vez hemos añadido el producto
        $this->update_precio_cantidad();
    }
    //método que actualiza el precio total y la cantidad
    //de productos total del carrito
    private function update_precio_cantidad()
    {
        //seteamos las variables precio y artículos a 0
        $precio = 0;
        $articulos = 0;
        //recorrecmos el contenido del carrito para actualizar
        //el precio total y el número de artículos
        foreach ($this->carrito as $row)
        {
            $precio += ($row['precio'] * $row['cantidad']);
            $articulos += $row['cantidad'];
        }
        //asignamos a articulos_total el número de artículos actual
        //y al precio el precio actual
        $_SESSION['carrito']["articulos_total"] = $articulos;
        $_SESSION['carrito']["precio_total"] = $precio;
        //refrescamos él contenido del carrito para que quedé actualizado
        $this->update_carrito();
    }
    //método que retorna el precio total del carrito
    public function precio_total()
    {
        //si no está definido el elemento precio_total o no existe el carrito
        //el precio total será 0
        if(!isset($this->carrito["precio_total"]) || $this->carrito === null)
        {
            return 0;
        }
        //si no es númerico lanzamos una excepción porque no es correcto
        if(!is_numeric($this->carrito["precio_total"]))
        {
            throw new Exception("El precio total del carrito debe ser un número", 1);
        }
        //en otro caso devolvemos el precio total del carrito
        return $this->carrito["precio_total"] ? $this->carrito["precio_total"] : 0;
    }
    //método que retorna el número de artículos del carrito
    public function articulos_total()
    {
        //si no está definido el elemento articulos_total o no existe el carrito
        //el número de artículos será de 0
        if(!isset($this->carrito["articulos_total"]) || $this->carrito === null)
        {
            return 0;
        }
        //si no es númerico lanzamos una excepción porque no es correcto
        if(!is_numeric($this->carrito["articulos_total"]))
        {
            throw new Exception("El número de artículos del carrito debe ser un número", 1);
        }
        //en otro caso devolvemos el número de artículos del carrito
        return $this->carrito["articulos_total"] ? $this->carrito["articulos_total"] : 0;
    }
    //este método retorna el contenido del carrito
    public function get_content()
    {
        //asignamos el carrito a una variable
        $carrito = $this->carrito;
        //debemos eliminar del carrito el número de artículos
        //y el precio total para poder mostrar bien los artículos
        //ya que estos datos los devuelven los métodos 
        //articulos_total y precio_total
        unset($carrito["articulos_total"]);
        unset($carrito["precio_total"]);
        return $carrito;
    }
    //método que llamamos al insertar un nuevo producto al 
    //carrito para eliminarlo si existia, así podemos insertarlo
    //de nuevo pero actualizado
    private function unset_producto($unique_id)
    {
        unset($_SESSION["carrito"][$unique_id]);
    }
    //para eliminar un producto debemos pasar la clave única
    //que contiene cada uno de ellos
    public function remove_producto($unique_id)
    {
        //si no existe el carrito
        if($this->carrito === null)
        {
            throw new Exception("El carrito no existe!", 1);
        }
        //si no existe la id única del producto en el carrito
        if(!isset($this->carrito[$unique_id]))
        {
            throw new Exception("La unique_id $unique_id no existe!", 1);
        }
        //en otro caso, eliminamos el producto, actualizamos el carrito y 
        //el precio y cantidad totales del carrito
        unset($_SESSION["carrito"][$unique_id]);
        $this->update_carrito();
        $this->update_precio_cantidad();
        return true;
    }
    //eliminamos el contenido del carrito por completo
    public function destroy()
    {
        unset($_SESSION["carrito"]);
        $this->carrito = null;
        return true;
    }
    //actualizamos el contenido del carrito
    public function update_carrito()
    {
        self::__construct();
    }
}
$carrito = new Carrito();
if ($_POST['accion']=='listar'){
    $c=$carrito->get_content();
    echo json_encode($c);
}else if ($_POST['accion']=='agregar'){

       
    $articulo = array(
    "id"=>$_POST["id"],
    "precio"=>$_POST["precio"],
    "cantidad"=>$_POST["cantidad"]
    ); 
    $carrito->add($articulo);
}
?>

It works perfect but here is an image (because it does not show data?):

    
answered by 03.09.2018 в 21:13