So I've learned that I should use multicell so that text won't go past the cell and will wrap. But, one thing I'm still confused with is how to actually get the cells to be beside each other and only go on to a new line when at the end of the row.
My html table is as follows:
<table class="experience" id="experience" >
<tr>
<td><b>Date From/To</b></td>
<td><b>Company Name/Address</b></td>
<td><b>Job Detail and Brief Outline of Dutie</b></td>
<td><b>Reasons For Leaving</b></td>
</tr>
<tr>
<td><input type="text" name="job_dates[]" id="job_dates" /></td>
<td><input type="text" name="company_name[]" id="company_name"/></td>
<td><input type="text" name="details[]" id="details" /></td>
<td><input type="text" name="leaving[]" id="leaving"/></td>
</tr>
</table>
<a href="#" title="" class="add-row1">Add Row</a>
The user is able to add a row by clicking the add row link. This table is just part of my form and it does go to my php file. Now when the user has filled out the form and hit submit, my php file gets the table values with:
$jobDates = (isset($_POST['job_dates']) ? $_POST['job_dates'] : array());
$company = (isset($_POST['company_name']) ? $_POST['company_name'] : array());
$jobDetails = (isset($_POST['details']) ? $_POST['details'] : array());
$reasons = (isset($_POST['leaving']) ? $_POST['leaving'] : array());
At the moment I'm displaying the table in my pdf file by doing the following:
$pdf->Cell(40,10, 'Work Experience');
$pdf->Ln(20);
$width_cell=array(45,50,30,90);
$pdf->Cell($width_cell[0],10,'Date From/To',1,0); // First header column
$pdf->Cell($width_cell[1],10,'Company Name',1,0); // Second header column
$pdf->Cell($width_cell[2],10,'Job Duties',1,0); // Third header column
$pdf->Cell($width_cell[3],10,'Reason for leaving',1,1); // Fourth header column
$pdf->SetFont('Arial','',10);
foreach ($jobDates as $point => $data) {
$pdf->MultiCell($width_cell[0],10,$data,1,'C');
$pdf->MultiCell($width_cell[1],10,$company[$point],1,'C');
$pdf->MultiCell($width_cell[2],10,$jobDetails[$point],1,'L');
$pdf->MultiCell($width_cell[3],10,$reasons[$point],1,'C');;
}
This however just makes them display one after the other on a new line rather than beside each other. It should only go onto a new line when it is going onto a new row of data (if the user has entered in more than one row in the form)
I've attached an image to show what is happening at the moment
Managed to get it working which I'll share in case someone else who is having this issue stumbles upon this.
Following a tutorial I found I created a new php page called mc_table.php
<?php
require "fpdf/fpdf.php";
class PDF_MC_Table 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;
}
function Row($data)
{
//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;
//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';
//Save the current position
$x=$this->GetX();
$y=$this->GetY();
//Draw the border
$this->Rect($x,$y,$w,$h);
//Print the text
$this->MultiCell($w,5,$data[$i],0,$a);
//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;
}
}
?>
Then at the top of my main php page I call the script:
require('mc_table.php');
And instead of: $pdf = new FPDF(); It is now: $pdf=new PDF_MC_Table();
And to create the table I have done:
$width_cell=array(45,50,30,90);
$pdf->Cell($width_cell[0],10,'Date From/To',1,0); // First header column
$pdf->Cell($width_cell[1],10,'Company Name',1,0); // Second header column
$pdf->Cell($width_cell[2],10,'Job Duties',1,0); // Third header column
$pdf->Cell($width_cell[3],10,'Reason for leaving',1,1); // Fourth header column
$pdf->SetWidths(array(45,50,30,90));
foreach ($jobDates as $point => $data) {
$pdf->Row(array($data,$company[$point],$jobDetails[$point],$reasons[$point]));
}