Attention
TYPO3 v11 has reached end-of-life as of October 31th 2024 and is no longer being maintained. Use the version switcher on the top left of this page to select documentation for a supported version of TYPO3.
Need more time before upgrading? You can purchase Extended Long Term Support (ELTS) for TYPO3 v11 here: TYPO3 ELTS.
Custom data processors
When there is no suitable data processor that
prepares the variables needed for your content element or template, you can
define a custom data processor by implementing
\TYPO3\
.
You can find the example below in the TYPO3 Documentation Team extension examples.
Using a custom data processor in TypoScript
The data processor can be configured through a TypoScript setup configuration. A custom data processor can be used in the definition of a "new custom content element" as follows:
tt_content {
examples_dataproccustom =< lib.contentElement
examples_dataproccustom {
templateName = DataProcCustom
dataProcessing.10 = T3docs\Examples\DataProcessing\CustomCategoryProcessor
dataProcessing.10 {
as = categories
categoryList.field = tx_examples_main_category
}
}
}
In the extension examples you can find the code in
EXT:
.
In the field tx_
the comma-separated
categories are stored.
Note
The custom data processor described here should serve as a simple example.
It can therefore only work with comma-separated values, not with an m:n
relationship as used in the field categories
of tables like
tt_
. For that, further logic would need to be implemented.
Implementing the custom data processor
The custom data processor must implement \TYPO3\
.
The main method process
gets called with the following parameters:
Content
Object Renderer $c Obj - Receives the data of the current TypoScript context, in this case the data of the calling content element.
array $content
Object Configuration - Contains the configuration of the calling content element. In this example
all configuration of
tt_
content. examples_ dataproccustom array $processor
Configuration - Contains the configuration of the currently called data processor. In this
case the value of
as
and thestd
configuration of theWrap category
List array $processed
Data - On calling, contains the processed data of all previously called data processors on this content element. Your custom data processor also stores the variables to be send to Fluid here.
This is an example implementation of a custom data processor:
namespace T3docs\Examples\DataProcessing;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
use TYPO3\CMS\Frontend\ContentObject\DataProcessorInterface;
use TYPO3\CMS\Extbase\Domain\Repository\CategoryRepository;
class CustomCategoryProcessor implements DataProcessorInterface
{
public function process(
ContentObjectRenderer $cObj,
array $contentObjectConfiguration,
array $processorConfiguration,
array $processedData
) : array {
if (isset($processorConfiguration['if.']) && !$cObj->checkIf($processorConfiguration['if.'])) {
// leave $processedData unchanged in case there were previous other processors
return $processedData;
}
// categories by comma-separated list
$categoryIdList = $cObj->stdWrapValue('categoryList', $processorConfiguration ?? []);
if ($categoryIdList) {
$categoryIdList = GeneralUtility::intExplode(',', (string)$categoryIdList, true);
}
/** @var CategoryRepository $categoryRepository */
$categoryRepository = GeneralUtility::makeInstance(CategoryRepository::class);
$categories = [];
foreach ($categoryIdList as $categoryId) {
$categories[] = $categoryRepository->findByUid($categoryId);
}
// set the categories into a variable, default "categories"
$targetVariableName = $cObj->stdWrapValue('as', $processorConfiguration, 'categories');
$processedData[$targetVariableName] = $categories;
return $processedData;
}
}
In the extension examples you can find the code in
typo3conf/
.
On being called, the Custom
runs std
on the calling ContentObjectRenderer, which has the data of the table
tt_
in the calling content element.
Since the field category
got configured in TypoScript as follows:
categoryList.field = tx_examples_main_category
stdWrap fetches the value of category
from
tt_
of the currently calling content
element.
Now the custom data processor processes the comma-separated values into an array
of integers that represent uids of the table sys_
. It then
fetches the category data from the Category
by calling
find
.
The data of the category records then gets stored in the desired key in the
$processed
array.
To make the data processor more configurable, we test for a TypoScript
if condition at the beginning, and make the name of the key
we use to store the data configurable by the configuration as
.