. * */ class Pdf_mysql_table extends FPDF { /** * Modificado por Ricardo Montañana 05/2008 para añadir la posibilidad de cálculo de totales * @var $totales float[] Vector de totales de las columnas que lo necesiten */ private $ProcessingTable=false,$aCols=array(),$TableX,$HeaderColor; private $RowColors,$ColorIndex; private $bdd,$titulo,$cabecera; private $totales=array(),$procesandoTotales=false; /** * * @param mixed $bdd Controlador de la base de datos * @param string $orientacion Orientación de la página P/L * @param string $formato Tamaño de la página p. ej. A4 * @param string $titulo Título del informe * @param string $cabecera Texto para la cabecera */ public function __construct($bdd,$orientacion,$formato,$titulo='',$cabecera='') { $this->bdd=$bdd; $this->titulo=$titulo; $this->cabecera=$cabecera; parent::__construct($orientacion,'mm',$formato); } public function setTitulo($titulo) { $this->titulo=$titulo; } public function iniciaTotales() { $this->totales = array(); } function Header() { //Modficada por Ricardo Montañana //Titulo $fecha=strftime("%d-%b-%Y %H:%M"); $this->SetFont('Arial','',8); $this->Cell(0,4,html_entity_decode(CENTRO . " " . PROGRAMA . " v" . VERSION,ENT_COMPAT | ENT_HTML401,'ISO-8859-1'),0,1,'L'); $this->SetFont('Arial','',18); $this->Cell(0,6,utf8_decode($this->titulo),0,1,'C'); $this->SetFont('Arial','',8); $this->Cell(0,3,$fecha,0,1,'R'); $this->Cell(0,5,utf8_decode($this->cabecera),0,1,'C'); $this->Ln(10); //Print the table header if necessary if($this->ProcessingTable) $this->TableHeader(); //Ensure table header is output parent::Header(); } public function Footer() { $this->SetFont('Arial','',8); $this->setY($this->h-10); $this->Cell(0,6,'-'.$this->PageNo().'-',0,1,'C'); parent::Footer(); } function TableHeader() { $this->SetFont('Arial','B',12); $this->SetX($this->TableX); $fill=!empty($this->HeaderColor); if($fill) $this->SetFillColor($this->HeaderColor[0],$this->HeaderColor[1],$this->HeaderColor[2]); foreach($this->aCols as $col) $this->Cell($col['w'],6,utf8_decode($col['c']),1,0,'C',$fill); $this->Ln(); } function Row($data) { $this->SetX($this->TableX); $ci=$this->ColorIndex; $fill=!empty($this->RowColors[$ci]); if($fill) $this->SetFillColor($this->RowColors[$ci][0],$this->RowColors[$ci][1],$this->RowColors[$ci][2]); foreach($this->aCols as $col) { switch ($col['a']) { case 'D':$alin='R';break; case 'I':$alin='L';break; case 'C':$alin='C';break; default:$alin='L';break; } if ($this->procesandoTotales) { $this->SetFont('Arial','B',12); } $dato = isset($data[$col['f']]) ? $data[$col['f']] : ""; $this->Cell($col['w'],5,utf8_decode($dato),1,0,$alin,$fill); //$this->Cell($col['w'],5,utf8_decode($data[$col['f']]),1,0,$alin,$fill); //$this->Cell($col['w'],5,utf8_decode($data['proveedor']),1,0,$alin,$fill); //$this->Write(5,"nombre=".$col['f'].",titulo=".$col['c'].",ancho=".$col['w'].",alin=".$col['a']); //$this->Write(5,$data[$col['f']].$col['f']); //print_r($data); //print_r($this->aCols); if ($col['t']=='S' && !$this->procesandoTotales) { if (isset($this->totales[$col['f']])) $this->totales[$col['f']] += $data[$col['f']]; else $this->totales[$col['f']] = $data[$col['f']]; } } $this->Ln(); $this->ColorIndex=1-$ci; } function CalcWidths($width,$align) { //Compute the widths of the columns $TableWidth=0; foreach($this->aCols as $i=>$col) { $w=$col['w']; if($w==-1) $w=$width/count($this->aCols); elseif(substr($w,-1)=='%') $w=$w/100*$width; $this->aCols[$i]['w']=$w; $TableWidth+=$w; } //Compute the abscissa of the table if($align=='C') $this->TableX=max(($this->w-$TableWidth)/2,0); elseif($align=='R') $this->TableX=max($this->w-$this->rMargin-$TableWidth,0); else $this->TableX=$this->lMargin; } function AddCol($field=-1,$width=-1,$caption='',$align='I',$total='N') { //Add a column to the table if($field==-1) $field=count($this->aCols); $this->aCols[]=array('f'=>$field,'c'=>$caption,'w'=>$width,'a'=>$align,'t'=>$total); } function Table($query,$prop=array()) { //Issue query $res=$this->bdd->query($query) or die('Error: '.$this->bdd->error."
Query: $query"); //Add all columns if none was specified if(count($this->aCols)==0) { $nb=$res->field_count; for($i=0;$i<$nb;$i++) $this->AddCol(); } //Retrieve column names when not specified $i=0; foreach($this->aCols as $i=>$col) { if($col['c']=='') { if(is_string($col['f'])) $this->aCols[$i]['c']=ucfirst($col['f']); else $this->aCols[$i]['c']=ucfirst($res->field_seek($i)); } $i++; } //Handle properties if(!isset($prop['width'])) $prop['width']=0; if($prop['width']==0) $prop['width']=$this->w-$this->lMargin-$this->rMargin; if(!isset($prop['align'])) $prop['align']='C'; if(!isset($prop['padding'])) $prop['padding']=$this->cMargin; $cMargin=$this->cMargin; $this->cMargin=$prop['padding']; if(!isset($prop['HeaderColor'])) $prop['HeaderColor']=array(); $this->HeaderColor=$prop['HeaderColor']; if(!isset($prop['color1'])) $prop['color1']=array(); if(!isset($prop['color2'])) $prop['color2']=array(); $this->RowColors=array($prop['color1'],$prop['color2']); //Compute column widths $this->CalcWidths($prop['width'],$prop['align']); //Print header $this->TableHeader(); //Print rows $this->SetFont('Arial','',11); $this->ColorIndex=0; $this->ProcessingTable=true; $this->procesandoTotales=false; while($row=$res->fetch_assoc()) { $this->Row($row); } $this->procesandoTotales=true; // Procesa los totales if ($this->procesaTotales()) { $this->Row($this->totales); } $this->ProcessingTable=false; $this->cMargin=$cMargin; $this->aCols=array(); } /** * Se encarga de generar una línea de totalización si es necesario * @param array $datos Línea con los totales a imprimir o NULL * @return boolean Si hay que generar la línea o no */ private function procesaTotales() { foreach($this->aCols as $col) { if ($col['t']=='S') { return true; } } return false; } } ?>