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: