Devolver array de objetos por AJAX

  • Autor Autor giulichajari
  • Fecha de inicio Fecha de inicio
giulichajari

giulichajari

Gamma
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
estoy desarrollando un sistema de ventas, y en la ventana de ticket tengo el boton buscar que permite ir a otra pagina con el listado de articulos. Este consta dfe dos botones. Uno es agregar que añade el producto en cuestion a un array de detalles del objeto ticket(trabajo con MVC y POO), y elotro un terminado que retorna a la ventana anterior

Clase ticket y detalle.

Insertar CODE, HTML o PHP:
<?php
//require_once ("includes/claseConexion.php");
require_once ("claseProducto.php");

class detalleTicket{
    
    private $idp;
    private $precio;
    private $cantidad;
    private $nombre;
    private $subtotal;
    
   
   public function __construct($id,$pu,$cant,$nom){
    
    
    $this->idp=$id;
    $this->precio=$pu;
    $this->cantidad=$cant;
    $this->nombre=$nom;
    $this->subtotal= ($this->cantidad * $this->precio);
   
   }
   public function setSubtoal($sub){
    
    $this->subtotal=$sub;
    
   }
   public function actualizaCantidad($nueva){
    
    $this->cantidad=$this->cantidad + $nueva;
    $sub= $this->cantidad * $this->precio;
     $this->setSubtoal($sub);    
    
   }
}
class Ticket{
  private $id;
  private $detalle = array();
  private $fecha;
  private $hora;
  private $total;
  private $stm;
  private $vuelto; 
  
  public function __construct($f,$h){
    
    $this->fecha=$f;
    $this->hora=$h;
    
  }
  public function agregaDetalle($d){
    
    $this->detalle[] = $d;
  } 
  public function setTotal($val){
    
    $this->total=$val;
    
  }
public function listarArt(){
    
  return $this->detalle;
}
public function registrar(){
    //me conecto a la bd
    $conexion = Conexion::singleton_conexion(); 
 try{

    $conexion->beginTransaction();
    $queryid="select comprobante from identificadores;"; 
     $array=$conexion->query($queryid);
   foreach($array as $a){
    $id = $a['comprobante'];
      }
 
  $qnuevoid="UPDATE identificadores SET comprobante=".++$id.";";
  $conexion->query($qnuevoid);
  
        $queryticket="insert into despensa.ticket (idticket, fecha, total,vuelto) values (".$id.",'".$this->fecha."',56,88);";
		$conexion->query($queryticket);

   $conexion->commit();
   
 }catch(Exception $e){
   $conexion->rollBack();
     echo "Fallo: " . $e->getMessage(); 
 }
 

    
}
}


?>

El problema que tengo es que quiero listar los articulos añadidos al carrito al retornar a la pagina y me da un error de parseo de JSON: REQUESTED JSON PARSE FAILED.

Para lo mismo tengo un codigo jquery intermedio y un archivo de poroceso:

Insertar CODE, HTML o PHP:
$(document).ready(function() {
listarDetalle();

});
function listarDetalle(){
     var accion="listar";
    $.ajax({
       
            type: "POST",
            url: "../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].nombre + "</td>" 
                    "<td>" + data[i].marca + "</td>" +
                    "<td>" + data[i].cantidad + "</td>" +
                    "<td><input type='radio' id='"+data[i].idproducto+"' 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);

  }

});;

};

Osea en el ready del documento listo los articulos pero me da error:

PHP:
<?php
header('Content-Type: application/json');
include ("../../models/claseTicket.php");
$ticket = new Ticket('12-12-12','12.10');

if (isset($_POST['accion'])){
   if ($_POST['accion']="listar"){
       $arrayarticulos=$ticket->listarArt();
     echo json_encode($arrayarticulos);
    
    
   }else if ($_POST['accion']="agregar"){
    $id = $_POST['id'];
    $precio = $_POST['precio'];
    $cant=$_POST['cantidad'];
    $nom=$_POST['nombre'];
    $registro[] = new detalleTicket($id,$precio,$cant,$nom);
    $ticket->agregaDetalle($registro);
     
   } 
}

?>
La verdad no se que puede ser..el error es: Error en la peticion ajax..Requested JSON parse failed.
 
[MENTION=157498]giulichajari[/MENTION] Tienes...

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

te falta un =

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

otra cosa, guardas los detalles en la base de dato o en algun lado??
por que si no es asi $ticket->listarArt();
estara vacio cuando hagas la peticio ajax!!
 
Última edición:
[MENTION=157498]giulichajari[/MENTION] Tienes...

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

te falta un =

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

otra cosa, guardas los detalles en la base de dato o en algun lado??
por que si no es asi $ticket->listarArt();
estara vacio cuando hagas la peticio ajax!!

Y la idea es armar un objeto ticket sin la bd..cuando se confirma la compra se envian todos los datos y se guardan, esto se puede hacer con sesiones me dijeron, pero estoy investigando
 
Si bro con session lo haces :encouragement:
 
Si bro con session lo haces :encouragement:

Pero como lo hago?

hice esto en el index de ticket:

PHP:
<?php
session_start();
include_once ("/../../../models/claseTicket.php");

date_default_timezone_set("America/Argentina/Buenos_Aires");
 $time=time();
 $fecha = date("d/m/y  (H:i:s)",$time);
 echo date("d/m/y  (H:i:s)",$time);
 $ticket = new Ticket($fecha,$time);
$_SESSION['ticket']=serialize($ticket); 
 ?>

Y esto en procesodetalle.php que lo llamo mediante Ajax:

PHP:
<?php
header('Content-Type: application/json');
include ("../../models/claseTicket.php");
session_start();
$ticket = unserialize($_SESSION['ticket']);


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


       $arrayarticulos[]=$ticket->listarArt();

    echo json_encode($arrayarticulos);

   }else if ($_POST['accion']=="agregar"){
    $id = $_POST['id'];
    $precio = $_POST['precio'];
    $cant=$_POST['cantidad'];
    $nom=$_POST['nombre'];

    $ticket->agregaDetalle(new detalleTicket($id,$precio,$cant,$nom));

   } 
}

Pero me dice error de parseo: Requested JSON parse Failed, me puedes ayudar?

Esto sucede al cargar el ticket:

Insertar CODE, HTML o PHP:
$(document).ready(function() {
listarDetalle();

});
function listarDetalle(){
     var accion="listar";
    $.ajax({

            type: "POST",
            url: "../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++) {
          alert('fdsfgds')
                var newRow =
                    "<tr>" +
                    "<td>" + data[i].idp + "</td>" +
                    "<td>" + data[i].nombre + "</td>" 
                    "<td>" + data[i].marca + "</td>" +
                    "<td>" + data[i].cantidad + "</td>" +
                    "<td><input type='radio' id='"+data[i].idproducto+"' 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);

  }

});;

};
 
Atrás
Arriba