From 049f58c7cb38cf0670935475042bf64a159fd354 Mon Sep 17 00:00:00 2001 From: Friedemann Altrock Date: Mon, 2 Jun 2025 17:29:04 +0200 Subject: [PATCH] [TASK] allow the use of f:section in components Fixes: #91 --- Classes/Fluid/ComponentView.php | 29 +++++++++++++++++++ .../Fluid/ViewHelper/ComponentRenderer.php | 8 ++++- .../Components/WithSection/WithSection.html | 8 +++++ Tests/Functional/ComponentRendererTest.php | 1 + 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 Classes/Fluid/ComponentView.php create mode 100644 Tests/Fixtures/Functional/Components/WithSection/WithSection.html diff --git a/Classes/Fluid/ComponentView.php b/Classes/Fluid/ComponentView.php new file mode 100644 index 0000000..b980a76 --- /dev/null +++ b/Classes/Fluid/ComponentView.php @@ -0,0 +1,29 @@ +parsedTemplate = $parsedTemplate; + } + + /** + * @return ParsedTemplateInterface + */ + protected function getCurrentParsedTemplate() + { + return $this->parsedTemplate; + } +} diff --git a/Classes/Fluid/ViewHelper/ComponentRenderer.php b/Classes/Fluid/ViewHelper/ComponentRenderer.php index 26b5ff9..83b5dc7 100644 --- a/Classes/Fluid/ViewHelper/ComponentRenderer.php +++ b/Classes/Fluid/ViewHelper/ComponentRenderer.php @@ -8,6 +8,7 @@ use Psr\Http\Message\ServerRequestInterface; use SMS\FluidComponents\Domain\Model\RequiredSlotPlaceholder; use SMS\FluidComponents\Domain\Model\Slot; +use SMS\FluidComponents\Fluid\ComponentView; use SMS\FluidComponents\Interfaces\ComponentAware; use SMS\FluidComponents\Interfaces\EscapedParameter; use SMS\FluidComponents\Interfaces\RenderingContextAware; @@ -142,7 +143,6 @@ public function render(): string $renderingContext = GeneralUtility::makeInstance(RenderingContextFactory::class)->create([], $request); } - $renderingContext->setViewHelperVariableContainer($this->renderingContext->getViewHelperVariableContainer()); if (static::shouldUseTemplatePaths()) { $renderingContext->getTemplatePaths()->setPartialRootPaths( $this->renderingContext->getTemplatePaths()->getPartialRootPaths() @@ -193,6 +193,12 @@ public function render(): string ); } + // Set custom view to reset rendering stack + $view = new ComponentView($this->parsedTemplate, $renderingContext); + $viewHelperVariableContainer = clone $this->renderingContext->getViewHelperVariableContainer(); + $viewHelperVariableContainer->setView($view); + $renderingContext->setViewHelperVariableContainer($viewHelperVariableContainer); + // Render component return $this->parsedTemplate->render($renderingContext); } diff --git a/Tests/Fixtures/Functional/Components/WithSection/WithSection.html b/Tests/Fixtures/Functional/Components/WithSection/WithSection.html new file mode 100644 index 0000000..00e890d --- /dev/null +++ b/Tests/Fixtures/Functional/Components/WithSection/WithSection.html @@ -0,0 +1,8 @@ + + + + + + + A renderer with a section. + diff --git a/Tests/Functional/ComponentRendererTest.php b/Tests/Functional/ComponentRendererTest.php index 350370a..f724763 100644 --- a/Tests/Functional/ComponentRendererTest.php +++ b/Tests/Functional/ComponentRendererTest.php @@ -63,6 +63,7 @@ public static function renderComponentProvider() 'falseParameter' => false, // strange fluid behavior: will be empty string ], '', 'This is a string|123|1|'], ['DateTimeParameter', ['date' => 1601371704], '', 'Tue, 29 Sep 2020 09:28:24 +0000'], + ['WithSection', [], '', 'A renderer with a section.'], ]; }