2017-10-09 51 views
7

Mam zestaw tabel podzielonych na kategorie według ich źródła, np .: "Klient", "Magazyn", "Podłogi". one wyglądać tak:Jak dodać sumy FPDF do ostatniego wiersza tabel?

List of Floor Stock orders

Każdy zawierają wykazy cen, które muszą być sumowane i wyniósł w ostatnim wierszu tabel.

Mam problemy z linkami do „sum” tablicy do tablicy „Stoły” - specjalnie wyświetlając każdą sumę na końcu każdej tabeli

Dotychczas sumy każdej tabeli są generowane w innej funkcji, gdzie sourceTotals jest tablicą przykład:

public function setSourceTotalsArray($data) 
{ 
    $this->sourceTotals = $data["source_totals"]; 
    return $this->sourceTotals; 
} 

ta zwraca tablicę, która wygląda tak:

array(4) { ["Floorstock"]=> int(0) ["Stock"]=> int(0) ["Client"]=> float(32.18) } 

Oto gdzie mogę określić moje $pdf obiektu:

if($_SERVER["REQUEST_METHOD"] == "POST"){ 
$data = json_decode($_POST["printData"],true); 
$pdf = new PDF(); 
// Column headings 
$month = $pdf->getMonth($data['month']); 
$year = $data['year']; 
$pdf->SetFont('Arial','',10); 
$pdf->AddPage(); 
$pdf>title(array('month'=>$month,'year'=>$year,'showroom'=>ucfirst($data['showroom_name']))); 
$pdf->tableBody($data); 

if(!empty($data["order_detail"])){ 
    $customerOrders = array(); 
    $stockOrders = array(); 
    $floorstockOrders = array(); 
    $otherOrders = array(); 

    foreach($data["order_detail"] as $o){ 
     switch($o["orderSource"]){ 
      case 'Client': 
       $customerOrders[] = $o; 
       break; 
      case 'Stock': 
       $stockOrders[] = $o; 
       break; 
      case 'Floorstock': 
       $floorstockOrders[] = $o; 
       break; 

      default: 
       $otherOrders[] = $o; 
       break; 
     } 
    } 

    if (!empty($customerOrders)) { 
     $pdf->orderDetail($customerOrders, $data['currency'], 'Client'); 
    } 

    if (!empty($stockOrders)) { 
     $pdf->orderDetail($stockOrders, $data['currency'], 'Stock'); 
    } 

    if (!empty($floorstockOrders)) { 
     $pdf->orderDetail($floorstockOrders, $data['currency'], 'Floor Stock'); 
    } 

    if (!empty($otherOrders)) { 
     $pdf->orderDetail($otherOrders, $data['currency'], 'Client'); 
    } 
} 
$pdf->Output(); 

Funkcja orderDetail jest co strukturach tabeli wewnątrz obiektu $pdf tak, że tabela zawiera komórki, które odpowiadają prawidłowej nazwy kolumny:

function orderDetail($data,$currencyShortCode, $type){ 
    $this->orderType = $type; 
    list($currencySymbol, $w_symbol, $cellHight) = $this->getOrderDetailHeader($currencyShortCode, $type); 

    foreach ($data as $d){ 
     $commaValue = $this->addComma((float)$d['value']); 
     $this->Cell(15,$cellHight,$d['order_no'],'LTB',0,'L'); 
     $this->Cell(20,$cellHight,substr($d['customer'],0,13),'TB',0,'L'); 
     $this->Cell(20,$cellHight,substr($d['company'],0,13),'TB',0,'L'); 
     $this->Cell(20,$cellHight,substr($d['ref'],0,13),'TB',0,'L');   
     $this->Cell(2,$cellHight,'','TB',0,'R'); 
     $this->Cell($w_symbol,$cellHight,$currencySymbol,'TB',0,'R'); 
     $this->Cell(16-$w_symbol,$cellHight,$commaValue,'TB',0,'R'); 
     $this->Cell(2,$cellHight,'','TB',0,'R'); 
     $this->Cell(10,$cellHight,$d['cat'],'TB',0,'L'); 
     $this->Cell(84,$cellHight,$d['description'],'RTB',0,'L'); 
     $this->Ln($cellHight); 
    } 
    //BOTTOM TOTAL 
    $this->Cell(13,$cellHight,'TOTAL','LRTB',0,'L'); 
    $this->Cell(22,$cellHight,'','TB',0,'L'); 
    $this->Cell(20,$cellHight,'','TB',0,'L'); 
    $this->Cell(20,$cellHight,'','TB',0,'L'); 
    $this->Cell(4,$cellHight,$currencySymbol,'TB',0,'R'); 
    $this->Cell(14,$cellHight,$this->setSourceTotalsArray($data),'TB',0,'R'); //HERE 
    $this->Cell(2,$cellHight,'','TB',0,'R'); 
    $this->Cell(10,$cellHight,'','TB',0,'L'); 
    $this->Cell(84,$cellHight,'','RTB',0,'L'); 
} 

ja po prostu nie wiem jak przekazać setSourceTotalsArray do orderDetail, ponieważ moja obecna próba zwraca tylko null.

Odpowiedz

5

Twoja metoda setSourceTotalsArray nic tak naprawdę nie robi, więc jeśli zwróci null, oznacza to, że $data nie ma węzła source_totals. (Sugestia/przewodnie: ustaw error reporting na E_ALL, więc PHP ostrzeże Cię o tym, a następnie dla środowisk na żywo wyłącz display_errors i włącz log_errors, dzięki czemu zobaczysz błędy w dzienniku, ale użytkownicy nie zobaczą ich na ekranie.) Powód source_totals nie istnieje w $data jest to, że $ dane variable inside orderDetail is only a subset of $ dane` w pełnym skrypcie.

Co mogę zrobić, to dodać argument $total do orderDetail. Ci uzyskać coś takiego:

function orderDetail($data,$currencyShortCode, $type, $total) { 
    ... 
    $this->Cell(14,$cellHight, $total,'TB',0,'R'); //HERE 
    ... 
} 

I

if (!empty($customerOrders)) { 
    $pdf->orderDetail($customerOrders, $data['currency'], 'Client', $data['source_totals']['Client']); 
} 
// Also add the 4th argument for stock orders, floor orders and others. 
2

Kolejny fantastyczny sposób, aby wygenerować plik PDF jest po prostu przy użyciu binarnego wkhtmltopdf.

jeśli masz już raport, który generuje html, możesz użyć buforowania wyjściowego do wygenerowania html, a następnie przekonwertować do formatu pdf, może działać w większości środowisk i możesz kontrolować dokładnie to, czego chcesz, tak jak WebKit (Chrome , Safari itd.) Zrób to, używając znajomego języka (HTML).

HTH.