Custom rendering components 

All components are described using interfaces. This makes it easy to exchange individual components. The following illustrates how such a use case can look.

Custom Renderer 

The CPSIT\Typo3Handlebars\Renderer\Renderer interface describes a Renderer. A distinction must be made as to whether the custom Renderer is to be used for all components or only for individual variants.

Global replacement 

If the custom Renderer is to be used equally for all components, it can simply be registered as a global replacement for the default Renderer in the Services.yaml file.

# Configuration/Services.yaml

services:
  CPSIT\Typo3Handlebars\Renderer\Renderer:
    alias: 'Vendor\Extension\Renderer\AlternativeRenderer'
Copied!

Single replacement 

A custom Renderer can also be used only for specific modules. In this case, it replaces the default Renderer for the concrete Presenters.

# Configuration/Services.yaml

services:
  Vendor\Extension\Presenter\MyCustomPresenter:
    arguments:
      $renderer: ['@Vendor\Extension\Renderer\AlternativeRenderer']
Copied!

Custom TemplateResolver 

A standard TemplateResolver exists for resolving template paths for templates and partials. This is used in the default Renderer, but a custom TemplateResolver can also be used for specific purposes.

To use a custom TemplateResolver, a corresponding class is created that implements the CPSIT\Typo3Handlebars\Renderer\Template\TemplateResolver interface:

# Classes/Renderer/Template/AlternativeTemplateResolver.php

namespace Vendor\Extension\Renderer\Template;

use CPSIT\Typo3Handlebars\Renderer\Template\TemplateResolver;

class AlternativeTemplateResolver implements TemplateResolver
{
    /**
     * @var list<string>
     */
    private array $supportedFileExtensions = ['hbs', 'hbs.html'];

    public function getSupportedFileExtensions(): array
    {
        return $this->supportedFileExtensions;
    }

    public function supports(string $fileExtension): bool
    {
        return in_array(strtolower($fileExtension), $this->supportedFileExtensions, true);
    }

    public function resolveTemplatePath(string $templatePath): string
    {
        // ...
    }
}
Copied!

This is then used in the Services.yaml file instead of the standard TemplateResolver:

# Configuration/Services.yaml

services:
  CPSIT\Typo3Handlebars\Renderer\Template\TemplateResolver:
    alias: 'Vendor\Extension\Renderer\Template\AlternativeTemplateResolver'
Copied!

Sources