Ir al contenido


Foto

Error con DOMPDF en tabla que se llena dinamicamente


  • Por favor identifícate para responder
11 respuestas en este tema

#1 androbin

androbin

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 17 mayo 2012 - 04:48

Bueno amigos mi primera consulta en el foro

Tengo una pagina en PHP la cual genera multiples consultas a una base de datos y con esta estoy generando un PDF utilizando DOMPDF,todos los campos se generan en el PDF  pero dentro de este tengo una tabla que se llena dinamicamete de acuerdo a los registros que encuentre en la consulta, para llenar la tabla  utilizo el siguiente codigo:


<?php

require_once("dompdf/dompdf_config.inc.php");
include("ClassConexion.php");

$acumulado_pagos="select CANTIDAD,CONCEPTO.DESCRIPCION,VALOR from ACUMULADO inner join CONCEPTO on
              CONCEPTO.CODIGOCONCEPTO = ACUMULADO.CODIGOCONCEPTO where CODIGOLIQUIDACION='".$periodo."' and IDENTIFICACION='".$codigo_ingreso."'                      and TIPO='Pago'";
$resultado_pagos=ibase_query($dbh,$acumulado_pagos);


$html='<html xmlns="http://www.w3.org/1999/xhtml">

<body>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
          <tr valign="top">
            <th width="53%" scope="row"><table width="100%" border="0" cellpadding="0" cellspacing="0">
              <tr>
        if($filas_pagos = ibase_fetch_assoc($resultado_pagos)){
              do {  $total_pagos+= $filas_pagos[VALOR];
              <th width="6%" align="right" class="Estilo3" scope="row">&nbsp;'.$filas_pagos['CANTIDAD'] .'</th>
                <td width="4%" class="Estilo3">&nbsp;</td>
                <td width="66%" align="left" class="Estilo3">&nbsp;'.$filas_pagos['DESCRIPCION'].'</td>
                <td width="22%" align="right" class="Estilo3">&nbsp;'.number_format($filas_pagos['VALOR'],2).'</td>
              </tr>

  }  while ($filas_pagos = ibase_fetch_assoc($resultado_pagos));
   
}
   
    </table></th>
        <td width="47%">
</table>


</body>
</html>';
$html=utf8_decode($html);
$dompdf=new DOMPDF();
$dompdf->load_html($html);
ini_set("memory_limit","32M");
$dompdf->render();
$dompdf->stream("certificado.pdf");

?>


esta es solo parte del codigo que esta dentro de la variable $html que es con la que estoy creando mi PDF pero cuando se arma el archivo en el campo que deben ir la tabla se genera un error.

Entiendo que el error se origina  por que DOMPDF no reconoce el if y while que estoy dejando dentro de la variable $ html pero es que no se como hacerlos fuera de la varible y que aun asi siga generando la tabla dinamicamente y ubicanda donde la necesito dentro del documento, espero me entientan mi explicacion y de antemano muchas gracias por la ayuda que me puedan brindar.
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 mayo 2012 - 07:59

Lo que debes hacer es ir separando las partes del HTML en varias variables y al final concatenarlas, por ejemplo:

$html1 = '<html xmlns="http://www.w3.org/1999/xhtml">

<body>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
        <tr valign="top">
          <th width="53%" scope="row"><table width="100%" border="0" cellpadding="0" cellspacing="0">
            <tr>';

        if($filas_pagos = ibase_fetch_assoc($resultado_pagos)){
            do {  $total_pagos+= $filas_pagos[VALOR];
              $html2 .= '<th width="6%" align="right" class="Estilo3" scope="row">&nbsp;'.$filas_pagos['CANTIDAD'] .'</th>
                  <td width="4%" class="Estilo3">&nbsp;</td>
                  <td width="66%" align="left" class="Estilo3">&nbsp;'.$filas_pagos['DESCRIPCION'].'</td>
                  <td width="22%" align="right" class="Estilo3">&nbsp;'.number_format($filas_pagos['VALOR'],2).'</td>
                </tr>';
     
      }

$html = $html1 . $html2;


y así sucesivamente, ¿se entiende?.

Saludos.
  • 0

#3 androbin

androbin

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 18 mayo 2012 - 11:09

Muchas  muchas gracias enecumene fuiste muy claro en tu explicacion y ya no genera error, pero solo me genera una fila de datos cuando deberia devolver varias ya que como explique esta tabla se llena dinamicamente.

Con el codigo que ingrese al inicio de la consulta y sin generar el PDF me funciona me trae multiples filas, me podrias por favor indicar en que estoy fallando.


Nuevamente gracias 
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 mayo 2012 - 11:27

Coloca el código arreglado e indica donde es que debe generarte varias filas.

Saludos.
  • 0

#5 androbin

androbin

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 18 mayo 2012 - 11:36

Gracias por contestar tan pronto, asi deje el codigo:


<?php

require_once("dompdf/dompdf_config.inc.php");

$acumulado_pagos="select CANTIDAD,CONCEPTO.DESCRIPCION,VALOR from ACUMULADO inner join CONCEPTO on
              CONCEPTO.CODIGOCONCEPTO = ACUMULADO.CODIGOCONCEPTO where CODIGOLIQUIDACION='".$periodo."' and IDENTIFICACION='".$codigo_ingreso."'                      and TIPO='Pago'";
$resultado_pagos=ibase_query($dbh,$acumulado_pagos);

$html1='<html xmlns="http://www.w3.org/1999/xhtml">

<body>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
          <tr valign="top">
            <th width="53%" scope="row"><table width="100%" border="0" cellpadding="0" cellspacing="0">
              <tr>';
[color=purple]if($filas_pagos = ibase_fetch_row($resultado_pagos)){
              do {  $total_pagos+= $filas_pagos[VALOR];
              $html2 =' <th width="6%" align="right" class="Estilo3" scope="row">&nbsp;'.$filas_pagos['CANTIDAD'] .'</th>
                <td width="4%" class="Estilo3">&nbsp;</td>
                <td width="66%" align="left" class="Estilo3">&nbsp;'.$filas_pagos['DESCRIPCION'].'</td>
                <td width="22%" align="right" class="Estilo3">&nbsp;'.number_format($filas_pagos['VALOR'],2).'</td>
              </tr>';
 
    } while ($filas_pagos = ibase_fetch_assoc($resultado_pagos));
     
    }[/color]
  $html3 ='</table></th>
</body>
</html>';
$html=$html1 . $html2 . $html3;
$html=utf8_decode($html);
$dompdf=new DOMPDF();
$dompdf->load_html($html);
ini_set("memory_limit","32M");
$dompdf->render();
$dompdf->stream("certificado.pdf");

?>



El ciclo que esta en purpura es el que me trae todas las filas de datos de acuerdo a la consulta a la base de datos.


Gracias

  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 mayo 2012 - 11:56

Ya vi cual es el problema, es que no está en un ciclo sino en una condición, el ciclo lo tienes más abajo pero sin nada, pongamoslo así:

<?php

require_once("dompdf/dompdf_config.inc.php");

$acumulado_pagos="select CANTIDAD,CONCEPTO.DESCRIPCION,VALOR from ACUMULADO inner join CONCEPTO on
                  CONCEPTO.CODIGOCONCEPTO = ACUMULADO.CODIGOCONCEPTO where CODIGOLIQUIDACION='".$periodo."' and IDENTIFICACION='".$codigo_ingreso."'                      and TIPO='Pago'";
      $resultado_pagos=ibase_query($dbh,$acumulado_pagos);

$html1='<html xmlns="http://www.w3.org/1999/xhtml">

<body>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
        <tr valign="top">
          <th width="53%" scope="row"><table width="100%" border="0" cellpadding="0" cellspacing="0">';
 
  while ($filas_pagos = ibase_fetch_row($resultado_pagos)) {
              $total_pagos+= $filas_pagos[VALOR];
              $html2 .='<tr>
              <th width="6%" align="right" class="Estilo3" scope="row">&nbsp;'.$filas_pagos['CANTIDAD'] .'</th>
              <td width="4%" class="Estilo3">&nbsp;</td>
              <td width="66%" align="left" class="Estilo3">&nbsp;'.$filas_pagos['DESCRIPCION'].'</td>
              <td width="22%" align="right" class="Estilo3">&nbsp;'.number_format($filas_pagos['VALOR'],2).'</td>
            </tr>';
  }

  $html3 ='</th></table>
</body>
</html>';

$html=$html1 . $html2 . $html3;
$html=utf8_decode($html);
$dompdf=new DOMPDF();
$dompdf->load_html($html);
ini_set("memory_limit","32M");
$dompdf->render();
$dompdf->stream("certificado.pdf");

?>


Nos comentas.

Saludos.
  • 0

#7 androbin

androbin

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 18 mayo 2012 - 05:08

Realice los cambios que me sugeriste pero no funciona, al cambiar el ibase_fetch_assoc a  ibase_fetch_row ya no genera ninguna fila de datos es decir sale vacio.

No sé si es posible crear la tabla fuera del body y luego llamarla donde la necesito de alguna manera o que otras opción crees pueda utilizar ya que pienso que DOMPDF recorre el while una sola vez y arma de una el PDF y por ahí este la falla.

De nuevo gracias, quedo atento a tus comentarios

  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 mayo 2012 - 05:20

Cambia ibase_fetch_row por ibase_fetch_assoc y listo, recuerda, si ves un punto delante de un "=" dejalo asì, eso significa una concatenación.

Saludos
  • 0

#9 androbin

androbin

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 18 mayo 2012 - 05:54

De verdad que pena molestarte tanto. :embarrassed:

La verdad es que ya habia realizado la prueba tanto con row como assoc y como te dije con row no genera nada y con assoc genera de nuevo una sola fila, ademas al agregar ".="  me genera este error y no trae el PDF

Catchable fatal error: Argument 1 passed to DOMNode::appendChild() must be an instance of DOMNode, null given, called in C:\AppServ\www\Panel\dompdf\include\table_frame_decorator.cls.php on line 304 and defined in C:\AppServ\www\Panel\dompdf\include\frame.cls.php on line 726


Como te decia no sera posible realizar el mismo proceso de otra forma  o alguna otra opcion o solucion.

Gracias Totales
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 mayo 2012 - 09:53

Pues hagamos este cambio:

while ($filas_pagos = ibase_fetch_assoc($resultado_pagos)) {
              $total_pagos+= $filas_pagos['VALOR'];
              $html2 = $html2 . '<tr>
              <th width="6%" align="right" class="Estilo3" scope="row">&nbsp;'.$filas_pagos['CANTIDAD'] .'</th>
              <td width="4%" class="Estilo3">&nbsp;</td>
              <td width="66%" align="left" class="Estilo3">&nbsp;'.$filas_pagos['DESCRIPCION'].'</td>
              <td width="22%" align="right" class="Estilo3">&nbsp;'.number_format($filas_pagos['VALOR'],2).'</td>
            </tr>';
  }


Esa es otra forma de concatenar cadenas.

Saludos.
  • 0

#11 androbin

androbin

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 19 mayo 2012 - 10:39

Gracias asi si funciono al 100% , te debo una.  (b) 
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 mayo 2012 - 10:42

Gracias asi si funciono al 100% , te debo una.  (b)


Excelente !! colocas el tema como resuelto?, espero verlo más seguido por estos lares.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.