Verstehe die Klasse nicht ganz
Stefan
- php
Hallo Forum,
ich habe vor graumer Zeit schon einmal dieses Thema angesprochen, aber es konnte mir keiner wirklich helfen. Da ich aber immer noch nicht wirklich weiter gekommen bin, frage ich noch einmal hier nach.
Ich habe eine Klasse, die ich nicht ganz verstehe.
Hintergrund meines Problemes ist:
Das Script generiert eine Tabelle (als PDF). Hierzu schaut es in der function "row" nach, wieviele Zellen mit welcher Breite und welchem Inhalt vorhanden sind.
Anschließend "mißt" es für die Zelle mit dem "größten" Inhalt nach, ob der zur Verfügung stehende Platz auf der Seite ausreicht (function NbLines). Falls das nicht der Fall ist, wird die Seite (vorab!!) umgebrochen (function CheckPageBreak).
Das sieht natürlich dann meist ziemlich unmöglich aus, wenn auf Seite 1 noch viel Platz frei bleibt und die Seite bereits umgebrochen wurde.
Deshalb würde ich gerne das Script erweitern bzw. etwas umbauen.
Frage 1: Sehe ich das bis hierhin korrekt, wie das Script arbeitet?
Ziel (in Prosa ausgedrückt):
Derzeit wird in der Klasse je "Multizeile" geschaut, welche Zelle dieser Multizeile die meisten Einzelzeilen enthält. Diese Einzelzeile wird dann überprüft, ob sie über den zur Verfügung stehenden Platz der Seite hinausgeht. Ist das der Fall, wird die Seite umgebrochen, ansonsten nicht.
Mein Wunsch ist, daß diese Prüfung stattfindet, aber eine zusätzlich Prüfung checkt, wieviele Zeilen auf die aktuelle Seite noch gepasst hätten. Dann sollen diese zeilen dorthin geschrieben werden und die "Restzeilen" sollen z.b. in einer Variable $restzeilen zurückgegeben werden. Dann Seitenumbruch und die nächste zu verwendende Multizeile soll dann nur Leerzellen enthalten inkl. der Zelle mit dem Inhalt $restzeilen.
Ab hier beginnt der Kreislauf erneut. Die Zeile wird überprüft, ob sie über den zur Verfügung stehenden Platz der Seite (in diesem Fall dann die komplette neue Seite exklusive dem Header) hinausgeht. Ist das der Fall, kommt wieder die zusätzlich Prüfung, die checkt, wieviele Zeilen auf die aktuelle Seite noch gepasst hätten. Dann sollen diese zeilen dorthin geschrieben werden und die "Restzeilen" sollen z.b. in einer Variable $restzeilen zurückgegeben werden. Dann Seitenumbruch und die nächste zu verwendende Multizeile soll dann nur Leerzellen enthalten inkl. der Zelle mit dem Inhalt $restzeilen.
Ab hier beginnt der Kreislauf erneut. usw. usw.
Frage 2: Ist mein Ansatz (der Prosaansatz) geschickt oder gibt es einen besseren Weg?
Gruß, Stefan
<?php
require('fpdf.php');
class PDF_MC_Table_WA extends FPDF
{
var $widths;
var $aligns;
function SetWidths($w)
{
//Set the array of column widths
$this->widths=$w;
}
function SetAligns($a)
{
//Set the array of column alignments
$this->aligns=$a;
}
//============== by Stephan Gaertner (stegasoft.de) =================
//-------------- added 14/11/2005 -----------------------------------
var $borders;
var $bordercolors;
var $backgroundcolors;
var $cellfonts;
function SetBorders($b)
{
//Set the array of borders
$this->borders=$b;
}
function SetBorderColors($b)
{
//Set the array of border colors
$this->bordercolors=$b;
}
function SetBackgroundColors($b)
{
//Set the array of background colors
$this->backgroundcolors=$b;
}
function SetCellFont($cfnt)
{
//Set the array of cell font family
$this->cellfonts=$cfnt;
}
//-------------------------------------------------------------------
//===================================================================
function Row($data,$height=5,$line_height=5)
{
//Calculate the height of the row
$nb=0;
for($i=0;$i<count($data);$i++)
$nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
//$h=5*$nb;
if($height<($line_height*$nb))
$h=$line_height*$nb;
else
$h=$height;
//Issue a page break first if needed
$this->CheckPageBreak($h);
//Draw the cells of the row
for($i=0;$i<count($data);$i++)
{
$w=$this->widths[$i];
$a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
$border=strtoupper($this->borders[$i]);
$bordercolor=$this->bordercolors[$i];
$backgroundcolor=$this->backgroundcolors[$i];
$font_attributes=$this->cellfonts[$i];
//Save the current position
$x=$this->GetX();
$y=$this->GetY();
//Draw the border
if(trim($bordercolor[0])!="") {
if((trim($bordercolor[1])=="") AND (trim($bordercolor[2])==""))
$this->SetDrawColor($bordercolor[0]);
else
$this->SetDrawColor($bordercolor[0],$bordercolor[1],$bordercolor[2]);
}
if(trim($backgroundcolor[0])!="") {
if((trim($backgroundcolor[1])=="") AND (trim($backgroundcolor[2])==""))
$this->SetFillColor($backgroundcolor[0]);
else
$this->SetFillColor($backgroundcolor[0],$backgroundcolor[1],$backgroundcolor[2]);
}
if ($border!='0') {
if((strstr($border, 'L')==false) && (strstr($border, 'R')==false) && (strstr($border, 'B')==false) && (strstr($border, 'T')==false)) {
switch ($border) {
case 'D': $this->Rect($x,$y,$w,$h);
break;
case '': $this->Rect($x,$y,$w,$h);
break;
case 'F': $this->Rect($x,$y,$w,$h,'F');
break;
case 'DF': $this->Rect($x,$y,$w,$h,'DF');
break;
case 'FD': $this->Rect($x,$y,$w,$h,'DF');
break;
}
}
else {
if (strstr($border, 'F')!==false) {
$this->Rect($x,$y,$w,$h,'F');
}
if (strstr($border, 'L')!==false) {
$this->Line($x, $y, $x, $y+$h);
}
if (strstr($border, 'R')!==false) {
$this->Line($x+$w, $y, $x+$w, $y+$h);
}
if (strstr($border, 'T')!==false) {
$this->Line($x, $y, $x+$w, $y);
}
if (strstr($border, 'B')!==false) {
$this->Line($x, $y+$h, $x+$w, $y+$h);
}
}
}
if(trim($font_attributes[0])!="") {
$this->SetFont($font_attributes[0],$font_attributes[1],$font_attributes[2]);
}
//Print the text
$this->MultiCell($w,$line_height,$data[$i],0,$a,0);
//Put the position to the right of the cell
$this->SetXY($x+$w,$y);
}
//Go to the next line
$this->Ln($h);
}
function CheckPageBreak($h)
{
//If the height h would cause an overflow, add a new page immediately
if($this->GetY()+$h>$this->PageBreakTrigger)
$this->AddPage($this->CurOrientation);
}
function NbLines($w,$txt)
{
//Computes the number of lines a MultiCell of width w will take
$cw=&$this->CurrentFont['cw'];
if($w==0)
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$s=str_replace("\r",'',$txt);
$nb=strlen($s);
if($nb>0 and $s[$nb-1]=="\n")
$nb--;
$sep=-1;
$i=0;
$j=0;
$l=0;
$nl=1;
while($i<$nb)
{
$c=$s[$i];
if($c=="\n")
{
$i++;
$sep=-1;
$j=$i;
$l=0;
$nl++;
continue;
}
if($c==' ')
$sep=$i;
$l+=$cw[$c];
if($l>$wmax)
{
if($sep==-1)
{
if($i==$j)
$i++;
}
else
$i=$sep+1;
$sep=-1;
$j=$i;
$l=0;
$nl++;
}
else
$i++;
}
return $nl;
}
}
?>
Hallo Forum,
Hallo Forum,
kann mir jemand den Gefallen tun und versuchen, sich in die Klasse rein zu denken? Ich weiß, daß das viel Mühe ist und darüber hinaus auch wirklich schwierig ist, aber ich komm hier echt nicht weiter und habe schon überall versucht, etwas Hilfe zu bekommen. Leider bisher absolut erfolglos.
Stefan