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

Upgrade fürs Homelab: Vom 150-€-Mini-Server zum MINISFORUM MS-01 als Heimserver/Homelab: i9-12900H, 10 GbE, USB4 & PCIe-GPU, ideal für LLMs, Docker & Home Assistant

Mein kleiner Mini-Server aus diesem Beitrag läuft immer noch ohne Zicken:
Heimserver für Home Assistant und anderes für ca. 150 Euro.
Aber: Ich bastle inzwischen deutlich mehr mit LLMs, Containern und VMs – also musste etwas Stärkeres her.

Gekauft habe ich nun den MINISFORUM MS-01 als Barebone mit Intel Core i9-12900H (hier)[*],
dazu diese NVMe-SSD (Link)[*] und dieses DDR5-RAM-Kit (Link)[*].

Ergebnis: Setup an, Dienste rübergezogen – fertig. Die Kiste ist im Alltag leise, unter LLM-Last brüllt sie nicht, legt aber hörbar los – so soll’s sein.


Weiter >>

Glas gravieren mit Diodenlaser: So klappt’s mit einfacher Gouachefarbe

Glasgravur für Zuhause: Wie du mit einfacher Wasserfarbe und einem Diodenlaser wie dem Atomstack perfekte Ergebnisse erzielst

Du willst Weingläser, Sektgläser oder Kölschstangen selbst gravieren? Ganz einfach zuhause, ohne teures Profi-Equipment? Dann bist du hier genau richtig! In diesem Artikel zeige ich dir, wie du mit einem Diodenlaser wie dem Atomstack A12 Ultra Pro[*] und einer einfachen schwarzen Wasserfarbe beeindruckende Gravuren auf Glas zauberst.

Das Besondere: Du brauchst keinen teuren Speziallack! Eine ganz normale, deckende Gouachefarbe auf Wasserbasis[*] reicht völlig aus – einfach aufzutragen, abwaschbar und absolut effektiv. Perfekt für Einsteiger, Hobby-Maker und DIY-Fans.


Weiter >>

Your MSPA Goes Smart – Step-by-Step to a DIY Smart Home Hot Tub (Wi-Fi Upgrade)

Introduction

In this article, I’ll show you how I successfully reverse-engineered the serial communication protocol of an MSPA Muse Carlton hot tub. The goal was to read remote control commands and send custom ones. I used an ESP32 Dev Board[*] for this. This protocol likely works with other MSPA models as well.

This article is for makers, home automation enthusiasts, and tech fans who enjoy diving deep into technical systems.


Weiter >>