TYPO3 Data Processor

Wenn man TYPO3 mit Fluid Templates im Einsatz hat, sind immer nur die Daten des Extbase-Controllers verfügbar. Bei einem Projekt bin ich vor kurzem in die Situation gekommen, dass ich weitere Daten laden musste: hierfür gibt es den Data Processor. Mit diesem kann man einfach weitere Daten laden, auf welche man dann im Fluid Template einfach mit der gewohnten Syntax {my_data} zugreifen kann.

Beim entwickeln einer Blog-Extension, bin ich auf das Problem gekommen, weitere Daten im Fluid-Template verfügbar zu machen. Im konkreten Beispiel wurde für den Blog ein eigener Doktype erstellt (siehe https://docs.typo3.org/typo3cms/CoreApiReference/latest/ApiOverview/PageTypes/Index.html). Dieser Doktype bzw. Page Type (Blogartikel) hat eine Verbindung zu weiteren Blogartikeln (ähnliche Artikel). Würde man nun im Template auf diese Eigenschaft zugreifen, würde hier einfach eine Zahl stehen (für die Anzahl der ähnlichen Artikeln). Wir möchten aber auf das Blog-Objekt zugreifen, bzw. auf die Liste der Blog-Artikel-Objekte, um zum Beispiel die Titel und Bilder der ähnlichen Artikeln auszugeben. 

Um diese Aufgabenstellung zu lösen, bin ich auf den Data Processor gestoßen. Diesen kann man sich wie einen „Hook“ vorstellen, der vom Fluid-Controller aufgerufen wird, und man wie in einem normalen Action-Controller weitere Variablen zuweisen kann. 

1. Data Processor registrieren

Um den Data Processor Typo3 bekannt zu machen, wird dieser per TypoScript eingebunden.

#Nur einbinden, wenn die aktuelle Seite vom Typ 142 (Blogartikel ist)[globalVar = TSFE:page|doktype = 142]  #Data Processor registrieren  page.10.dataProcessing.10 = Varioous\VaBlog\DataProcessor\BlogProcessor[END]

Nun wird die Klasse BlogProcessor jedes Mal aufgerufen, wenn eine Seite vom Page Type 142 gerendert wird. Ich persönlich finde diese Lösung eleganter und schöner, es ist aber natürlich auch möglich die Bedingung im DataProcessor durchzuführen.

2. DataProcessor-Klasse implementieren

Die Klasse muss das Interface TYPO3\CMS\Frontend\ContentObject\DataProcessorInterface implementieren.

namespace Varioous\VaBlog\DataProcessor; use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;use TYPO3\CMS\Frontend\ContentObject\DataProcessorInterface; class BlogProcessor implements DataProcessorInterface{    public function process(        ContentObjectRenderer $cObj,        array $contentObjectConfiguration,        array $processorConfiguration,        array $processedData    ) {        #ObjektManager erzeugen        $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');        #Repository erzeugen        $blogArticleRepository = $objectManager->get(\Varioous\VaBlog\Domain\Repository\BlogarticleRepository::class);         #field uid aus Processor Configuration laden        $field = 'uid';        if (array_key_exists('field',$processorConfiguration)) {            $field = $processorConfiguration['field'];        }         #Artikel laden und Variable zuweisen        $processedData['article'] = $blogArticleRepository->findByUid(intval($processedData['data'][$field]));        #Daten zurückliefern        return $processedData;    }}

3. Variable benützen

Nun kann man im Fluid Template wie gewohnt auf die Variable zugreifen:

<f:if condition="{article.similararticles}">    <div class="article-similar">        <h3 class="h3">Ähnliche Artikel:</h3>        <f:for each="{article.similararticles}" as="article">            <f:render section="SimilarArticle" arguments="{article : article}" />        </f:for>    </div></f:if>

Ich finde dies ist eine sehr elegante Art um weitere Daten in einem Fluid Template zu laden. Es gibt auch schon einige vorgefertigte Data Processors, zum Beispiel einen SplitProcessor oder sehr interessant einen DatabaseQueryProcessor, diese findet man hier dokumentiert.

Wir entwickeln digitale Lösungen mit Leidenschaft

Warum wir das tun? Weil die Verwirklichung Ihrer Vision unser größter Anspruch und die schönste Anerkennung ist. Deshalb nehmen wir uns gerne ausreichend Zeit für die Realisierung Ihres digitalen Projekts.

Kontaktieren Sie uns, wir sind gerne für Ihre Fragen da:

Passend zu diesem Thema:

TYPO3 Chatbot

TYPO3 Chatbot

Chatbots ermöglichen es, die Betreuung von Website-Besuchern im Kundenservice einfach und effizient zu gestalten. Der Einsatz dieser virtuellen Helfer…

Richter Pharma Web4Partners

Richter Pharma Web4Partners

Um den Austausch von Marketing-Material und Bilder sowie die Verbreitung von Informationen für Vertriebspartner von Richter Pharma einfacher und schne…

TYPO3 9 Custom Content Elements

TYPO3 9 Custom Content Elements

TYPO3 bietet in Sachen Inhalts-Pflege schon eine Vielzahl an Content Elementen an. Solche sind z.B. Text & Medien (textmedia), Menüs (menu_pages,...) …