diff --git a/Classes/Fluid/ViewHelper/ComponentRenderer.php b/Classes/Fluid/ViewHelper/ComponentRenderer.php index cec7023..891996c 100644 --- a/Classes/Fluid/ViewHelper/ComponentRenderer.php +++ b/Classes/Fluid/ViewHelper/ComponentRenderer.php @@ -551,7 +551,7 @@ protected function initializeComponentParams() protected function extractContentViewHelpers(NodeInterface $node, RenderingContext $renderingContext): array { return array_reduce( - $this->extractViewHelpers($node, ContentViewHelper::class), + $this->extractViewHelpers($node, ContentViewHelper::class, false), function (array $nodes, ViewHelperNode $node) use ($renderingContext) { $slotArgument = $node->getArguments()['slot'] ?? null; $slotName = ($slotArgument) ? $slotArgument->evaluate($renderingContext) : self::DEFAULT_SLOT; @@ -569,7 +569,7 @@ function (array $nodes, ViewHelperNode $node) use ($renderingContext) { * @param string $viewHelperClassName * @return array */ - protected function extractViewHelpers(NodeInterface $node, string $viewHelperClassName): array + protected function extractViewHelpers(NodeInterface $node, string $viewHelperClassName, bool $recursive = true): array { $viewHelperNodes = []; @@ -581,9 +581,12 @@ protected function extractViewHelpers(NodeInterface $node, string $viewHelperCla $viewHelperNodes[] = $node; } else { foreach ($node->getChildNodes() as $childNode) { + if ($recursive === false && $childNode instanceof ViewHelperNode && ($childNode->getViewHelperClassName() === ComponentViewHelper::class || $childNode->getUninitializedViewHelper() instanceof ComponentRenderer)) { + continue; + } $viewHelperNodes = array_merge( $viewHelperNodes, - $this->extractViewHelpers($childNode, $viewHelperClassName) + $this->extractViewHelpers($childNode, $viewHelperClassName, $recursive) ); } } diff --git a/Tests/Functional/SlotParameterTest.php b/Tests/Functional/SlotParameterTest.php index d02c6c4..2317f39 100644 --- a/Tests/Functional/SlotParameterTest.php +++ b/Tests/Functional/SlotParameterTest.php @@ -64,6 +64,14 @@ public function renderDataProvider(): \Generator 'some htmlother html', "some html\nother html\n" ]; + yield 'two nested component calls with named slots' => [ + 'some htmlother html', + "some htmlother html\n" + ]; + yield 'two different nested component calls with named slots' => [ + 'some htmlslot 1 htmlslot 2 htmlslot content', + "some htmlslot 1 html|slot 2 html|slot content\n" + ]; // Check if slot object behaves correct for if statements yield 'unspecified slot parameter' => [