smic / webcomponents
Render Web Components
Installs: 14
Dependents: 0
Suggesters: 0
Security: 0
Stars: 4
Watchers: 1
Forks: 0
Open Issues: 8
Type:typo3-cms-extension
pkg:composer/smic/webcomponents
Requires
- ext-json: *
- typo3/cms-core: ^12.0 || ^13.0
- typo3/cms-frontend: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.61
- phpstan/phpstan: ^1.11.9
- phpunit/phpunit: ^10.5.35
- saschaegerer/phpstan-typo3: ^1.10
- ssch/typo3-rector: ^2.6
- typo3/coding-standards: ^0.8.0
- typo3/testing-framework: ^8.2.3
Suggests
- contentblocks/content-blocks: Define webcomponents as content blocks
- dev-main
- 0.5.1
- 0.4.0
- 0.3.4
- 0.3.2
- 0.3.0
- 0.2.0
- 0.1.0
- dev-topic/for-bigfoot
- dev-topic/ssr
- dev-topic/more-attributes
- dev-topic/php-version
- dev-topic/phpstan-php-version
- dev-topic/component-rendering-helper-exception
- dev-topic/content-as
- dev-topic/ctype-attribute
- dev-topic/component-rendering-data-interface
- dev-topic/content-blocks-int
- dev-topic/content-blocks
- dev-topic/interface
- dev-ver/0-1
- dev-topic/improve-rendering
- dev-topic/basic-rendering
This package is auto-updated.
Last update: 2025-12-17 10:09:08 UTC
README
This extension provides tools to render Web Components with TYPO3.
TypoScript based rendering
tt_content.tx_myext_mycontentelement = WEBCOMPONENT
tt_content.tx_myext_mycontentelement {
tagName = my-web-component
properties {
title.data = header
greeting = Hello World!
}
}
Generates the output:
<my-web-component
title="This is the title from the content element record"
greeting="Hello World!"
></my-web-component>
Component class based rendering
You can populate the web component with PHP:
tt_content.tx_myext_mycontentelement = WEBCOMPONENT
tt_content.tx_myext_mycontentelement.component = Acme\MyExt\Components\MyContentElement
<?php
namespace Acme\MyExt\Components;
use Sinso\Webcomponents\DataProviding\ComponentInterface;
use Sinso\Webcomponents\Dto\ComponentRenderingData;
use Sinso\Webcomponents\Dto\InputData;
class MyContentElement implements ComponentInterface
{
public function provide(InputData $inputData): ComponentRenderingData
{
$record = $inputData->record;
$properties = [
'title' => $record['header'],
'greeting' => 'Hello World!',
];
return (new ComponentRenderingData())
->withTagProperties($properties)
->withTagName('my-web-component');
}
}
Abort rendering
The component classes can use the \Sinso\Webcomponents\DataProviding\Traits\Assert trait to abort rendering, for example if the record is not available:
<?php
namespace Acme\MyExt\Components;
use Sinso\Webcomponents\DataProviding\ComponentInterface;
use Sinso\Webcomponents\DataProviding\Helpers\FileReferencesHelper;
use Sinso\Webcomponents\DataProviding\Traits\Assert;
use Sinso\Webcomponents\Dto\ComponentRenderingData;
use Sinso\Webcomponents\Dto\InputData;
use TYPO3\CMS\Core\Resource\FileReference;
class Image implements ComponentInterface
{
use Assert;
public function __construct(
private readonly FileReferencesHelper $fileReferencesHelper,
) {}
public function provide(InputData $inputData): ComponentRenderingData
{
$record = $inputData->record;
$image = $this->fileReferencesHelper->loadFileReference($record, 'image');
// rendering will stop here if no image is found
$this->assert($image instanceof FileReference, 'No image found for record ' . $record['uid']);
return (new ComponentRenderingData())
->withTagProperty('imageUrl', $image->getPublicUrl())
->withTagName('my-image');
}
}
Render a web component in Fluid
<html
xmlns:wc="http://typo3.org/ns/Sinso/Webcomponents/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<wc:render
component="Acme\MyExt\Components\LocationOverview"
inputData="{'header': 'This is the header'}"
/>
</html>