Rendering process¶
{: style=“width: 100%” }
Trigger¶
The rendering process is normally triggered through TypoScript
(using the ContentObjectRenderer
) by calling the DataProcessor
:
```typo3_typoscript linenums=“1” # Configuration/TypoScript/setup.typoscript
tt_content.textmedia = USER tt_content.textmedia.userFunc = Fr:raw-latex:Sitepackage:raw-latex:`\DataProcessing`:raw-latex:`\TextMediaProcessor` ```
Fetch data¶
In the next step the DataProcessor
gets the relevant data from
the DataProvider
:
$data = $this->provider->get($this->cObj->data);
Each DataProvider
returns an object which implements the
`ProviderResponseInterface
<%7B%7B%20repository.blob%20%7D%7D/Classes/Data/Response/ProviderResponseInterface.php>`__:
```php linenums=“1” # Classes/Data/Response/TextMediaProviderResponse.php
namespace Fr:raw-latex:Sitepackage:raw-latex:`\Data`:raw-latex:`\Response`;
use Fr:raw-latex:Typo`3Handlebars:raw-latex:Data`:raw-latex:Response:raw-latex:`\ProviderResponseInterface`;
class TextMediaProviderResponse implements ProviderResponseInterface { /** * @var string */ protected $layout = ’’;
public function getLayout(): string
{
return $this->layout;
}
public function setLayout(string $layout): self
{
$this->layout = $layout;
return $this;
}
// ...
pubflic function toArray(): array
{
return [
'layout' => $this->layout,
// ...
];
}
} ```
Process data¶
The provided data is now transferred to the Presenter
, which
prepares the data for rendering and then triggers the actual
rendering:
$renderedTemplate = $this->presenter->present($data);
return $renderedTemplate;
It is up to the Presenter
to trigger the rendering differently based
on the given data:
```php linenums=“1” # Classes/Presenter/TextMediaPresenter.php
namespace Fr:raw-latex:Sitepackage:raw-latex:`\Presenter`;
use Fr:raw-latex:Sitepackage:raw-latex:`\Data`:raw-latex:`\Response`:raw-latex:`\TextMediaProviderResponse`; use Fr:raw-latex:Typo`3Handlebars:raw-latex:Data`:raw-latex:Response:raw-latex:`\ProviderResponseInterface`; use Fr:raw-latex:Typo`3Handlebars:raw-latex:Presenter`:raw-latex:PresenterInterface;
class TextMediaPresenter implements PresenterInterface { public function present(ProviderResponseInterface \(data): string { if (!(\)data instanceof TextMediaProviderResponse)) { throw new UnableToPresentException( ‘Received unexpected response from DataProvider.’, 1613552420 ); } if ($data->getLayout() === ‘wide’) { return \(this->presentWide(\)data); } return \(this->presentNormal(\)data); }
protected function presentWide(TextMediaProviderResponse $data): string
{
return $this->renderer->render(
'Extensions/FluidStyledContent/TextMedia/Wide',
$data->toArray()
);
}
protected function presentNormal(TextMediaProviderResponse $data): string
{
return $this->renderer->render(
'Extensions/FluidStyledContent/TextMedia/Normal',
$data->toArray()
);
}
} ```
Render template¶
In the Renderer
the template path is now resolved and the
rendering is triggered. If the template is already in the cache, it will
be treated preferentially. In any case, the compiled template is
cached to speed up subsequent renderings.
Finally, the rendered template is returned to the
ContentObjectRenderer
which triggered the DataProcessor
from
TypoScript.