TYPO3 Extbase PDF ViewHelper

| | Allgemein, CMS, Programmierung, Web

Einen ViewHelper für TYPO3 mit Extbase zu erstellen ist nicht sehr schwierig. Leider an manchen stellen nur sehr trickreich.

Eine allgemeine Einführung zum erstellen eines TYPO3 Extbase custom ViewHelper befindet sich im Artikel: „Eigenen TYPO3 Extbase ViewHelper erstellen

Im Folgenden wird erklärt wie man in kurzer Zeit einen ViewHelper zur erstellung von PDF Dateien mit Extbase und Fluid erstellt. In diesem Beispiel wird TCPDF (Version: 6.2.6) verwendet.

Zusätzlich zur standard Extbase Extension Struktur müssen Folgende Ordner und Dateien angelegt werden:

Classes –>ViewHelpers

  • TcpdfViewHelper.php
  • PpageViewHelper.php
  • PtextViewHelper.php

Resources –> Private –> Library –> tcpdf

Resources –> Private –> Library  –> Templates –> Controllername–> Action.html

ext_autoload.php

Um die TCPDF Klassen in Extbase zur Verfügung zu haben müssen diese in der ext_autoload.php eingebunden werden.

Datei: ext_autoload.php
<?php
$libraryClassesPath = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('ExtensionKey') . 'Resources/Private/Library/';

return array(
 'TCPDF' => $libraryClassesPath . 'tcpdf/tcpdf.php',
);

?>

Die TCPDF Datein müssen sich Dafür im Pfad „Resources/Private/Library/“ der Extension befinden.
Diese Dateien können natürlich auch in den Classes Ordner verschoben werden. Es muss nur der Pfad in der ext_autoload.php angepasst werden.

In diesem Beispiel hat der ViewHelper die Funktionen die PDF Datei inline zu öffnen, zu speichern, sowie im Fluid Template einzelne PDF Seiten zu definieren.

Dafür werden 3 ViewHelper benötigt.
Als erstes der TcpdfViewHelper in der TcpdfViewHelper.php Datei:

Datei: TcpdfViewHelper.php
<?php
# FpdfViewHelper.php
namespace TYPO3\ExtensionName\ViewHelpers;

class TcpdfViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper {

/**
*
* @param string $outputmode="I"
* @param string $savepath="fileadmin/report%TIME%.pdf"
* @param string $returntext="File was saved to fileadmin."
*/
public function render($outputmode="I", $savepath="fileadmin/report%TIME%.pdf", $returntext="File was saved to fileadmin.") {

$pdf = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TCPDF');
$this->templateVariableContainer->add('tcpdf', $pdf);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// $pdf->lastPage();
$this->renderChildren();
//Unterscheidung bzgl. inline öffnen und speichern (Es gibt noch weitere Möglichkeiten: http://www.tcpdf.org/doc/code/classTCPDF.html#a3d6dcb62298ec9d42e9125ee2f5b23a1)

switch ($outputmode) {
case 'I':
$pdf->Output("Report.pdf", "I");
exit();
break;
case 'F':
default:
$savepath = str_replace("%TIME%", time(), $savepath);
$text = $pdf->Output($_SERVER['DOCUMENT_ROOT'].$savepath, 'F');
echo $returntext;
break;
}
$this->templateVariableContainer->remove('tcpdf');

return $text;
}
}
?>

Als nächstes muss eine Seite in TCPDF definiert werden. Dies geschieht in der PpageViewHelper.php:

Datei: PpageViewHelper.php
<?php
#PpageViewHelper.php
namespace TYPO3\ExtensionName\ViewHelpers;
class PpageViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper {
 // TCPDF Stuff
 public function render(){
 $fpdf = $this->templateVariableContainer->get('tcpdf');
 
 $fpdf->SetTopMargin(0);
 $fpdf->AddPage();
 $this->renderChildren();
 }
}
?>

Um nun unseren Inhalt (HTML + Tabellen Layout klappt am besten) auf die PDF Seiten zu bekommen wird der dritte ViewHelper in der Datei PtextViewHelper.php definiert:

Datei: PtextViewHelper.php 
<?php
# PtextViewHelper.php

namespace TYPO3\ExtensionName\ViewHelpers;

class PtextViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper {
 
 /**
 * 
 * @param string $text=null
 */
 public function render($text=NULL){
 $pdf = $this->templateVariableContainer->get('tcpdf');
 if ($text === NULL) {
 $text = $this->renderChildren();
 }
 
 $pdf->writeHTML($text, true, false, true, false, '');
 
 // $this->renderChildren();
 }
}
?>

Um nun den ViewHelper in Fluid nutzen zu können, kann man zum Beispiel so vorgehen:

{namespace sp=TYPO3\ExtensionName\ViewHelpers}
<f:layout name="Default" />
<f:section name="content">
 <sp:tcpdf outputmode="F" savepath="fileadmin/pdf_file_with_%TIME%.pdf" returntext="Successfully saved">
 <f:for each="{supervariable}" as="fluid">
 <sp:ppage>
 <sp:ptext>
 
 <b>{fluid.variable.definied.in.controller.action}</b>

 </sp:ptext> 
 </sp:ppage>
 </f:for>
 </sp:tcpdf>
</f:section>

oder so

{namespace sp=TYPO3\ExtensionName\ViewHelpers}
<f:layout name="Default" />
<f:section name="content">
 <sp:tcpdf>
 <f:for each="{supervariable}" as="fluid">
 <sp:ppage>
 <sp:ptext>
 
 <b>{fluid.variable.definied.in.controller.action}</b>

 </sp:ptext> 
 </sp:ppage>
 </f:for>
 </sp:tcpdf>
</f:section>

Die im Fluid Template zur Verfügung stehenden Variablen werden wie gewohnt durch die Action im Controller definiert.

Neueste Beiträge

Introducing a simple Docker Compose setup for HMS MQTT Publisher

I’ve been tinkering with my home automation setup recently, specifically integrating HMS-XXXXW-2T series micro-inverters with my system. The hms-mqtt-publisher[GitHub, External] is a neat tool that does just that by fetching telemetry info from these inverters and publishing it to an MQTT broker. The catch? It typically requires compiling from source with Cargo, Rust’s package manager.


Weiter >>

Effortlessly Backing Up Paperless-ngx with Cloudflare, rclone, and Docker

In the digital age, data backup is a non-negotiable part of managing any document management system. For those of us relying on the efficiency and organizational prowess of Paperless-ngx, ensuring our data is safe and recoverable is paramount. I’ve devised a seamless backup solution that utilizes the power of Cloudflare’s rclone and Docker, guaranteeing peace of mind and data security. Here’s a detailed look into my approach, which is applicable not just for Paperless-ngx but for any data stored on R2 storage. (https://www.cloudflare.com/developer-platform/r2/, Pricing: https://www.cloudflare.com/plans/developer-platform/ (10GB/Month for free))


Weiter >>

Ein Leitfaden für Senioren: Günstige Smartphones und Handys für Senioren bis 170 Euro

Mit über 80 Jahren beschlossen mein Opa, sich der digitalen Welt anzuschließen. Meine Oma nutzt bereits ein Xiaomi-Handy und schätzt dessen Einfachheit. Nun möchte mein Opa auch ein Mobiltelefon, das eine gute Kamera hat und einfach zu bedienen ist, aber dennoch WhatsApp und andere Funktionen unterstützt – und besonders wichtig: Kein Senioren Handy

Kurzversion: Am Ende ist es das Xiaomi Redmi 12 geworden, was zu dem Zeitpunkt bei Amazon für 149,90 Euro verfügbar war*


Weiter >>