From 050e6e119fd4130c6b58462b46c8503cf70153ad Mon Sep 17 00:00:00 2001 From: Ferdinand Kuhl Date: Sun, 2 Jun 2024 04:04:48 +0200 Subject: [PATCH] storing the render function in ViewHelperVariableContainer --- .../ApplyRenderFunctionViewHelper.php | 11 +++++++- .../RegisterRenderFunctionViewHelper.php | 5 ++-- .../Traits/ValidateRenderFunctionTrait.php | 26 +++++++++++++++++++ README.md | 2 +- .../Tests/Functional/Fixtures/Test/Index.html | 2 +- .../Functional/Fixtures/Test/Select.html | 2 +- 6 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 Classes/ViewHelpers/Traits/ValidateRenderFunctionTrait.php diff --git a/Classes/ViewHelpers/ApplyRenderFunctionViewHelper.php b/Classes/ViewHelpers/ApplyRenderFunctionViewHelper.php index cf97859..02539a1 100644 --- a/Classes/ViewHelpers/ApplyRenderFunctionViewHelper.php +++ b/Classes/ViewHelpers/ApplyRenderFunctionViewHelper.php @@ -7,15 +7,18 @@ namespace DigiComp\FluidRenderFunctions\ViewHelpers; use DigiComp\FluidRenderFunctions\InvokeRenderFunctionInterface; use DigiComp\FluidRenderFunctions\Utils\GeneratorClosureIterator; use DigiComp\FluidRenderFunctions\Utils\RenderableProxy; +use DigiComp\FluidRenderFunctions\ViewHelpers\Traits\ValidateRenderFunctionTrait; use Neos\FluidAdaptor\Core\ViewHelper\AbstractViewHelper; class ApplyRenderFunctionViewHelper extends AbstractViewHelper { + use ValidateRenderFunctionTrait; + public function initializeArguments(): void { parent::initializeArguments(); $this->registerArgument('in', 'mixed', 'subject to apply the render function to'); - $this->registerArgument('function', InvokeRenderFunctionInterface::class, 'render function to use', true); + $this->registerArgument('function', 'string', 'render function to use', true); $this->registerArgument( 'force', 'bool', @@ -26,6 +29,12 @@ class ApplyRenderFunctionViewHelper extends AbstractViewHelper ); } + public function validateArguments() + { + parent::validateArguments(); + $this->validateRenderFunctionArgument('function'); + } + public function render() { $in = $this->arguments['in']; diff --git a/Classes/ViewHelpers/RegisterRenderFunctionViewHelper.php b/Classes/ViewHelpers/RegisterRenderFunctionViewHelper.php index 5db7772..511cae7 100644 --- a/Classes/ViewHelpers/RegisterRenderFunctionViewHelper.php +++ b/Classes/ViewHelpers/RegisterRenderFunctionViewHelper.php @@ -47,8 +47,9 @@ class RegisterRenderFunctionViewHelper extends AbstractViewHelper foreach ($this->childNodes as $childNode) { $transferNode->addChildNode($childNode); } - $this->renderingContext->getVariableProvider() - ->add($this->arguments['as'], new NodeRenderTransfer($transferNode, $this->arguments['subjectName'])); + $renderer = new NodeRenderTransfer($transferNode, $this->arguments['subjectName']); + $this->renderingContext->getViewHelperVariableContainer() + ->add(static::class, $this->arguments['as'], $renderer); return ''; } } diff --git a/Classes/ViewHelpers/Traits/ValidateRenderFunctionTrait.php b/Classes/ViewHelpers/Traits/ValidateRenderFunctionTrait.php new file mode 100644 index 0000000..c486f4d --- /dev/null +++ b/Classes/ViewHelpers/Traits/ValidateRenderFunctionTrait.php @@ -0,0 +1,26 @@ +viewHelperVariableContainer->get( + RegisterRenderFunctionViewHelper::class, + $this->arguments[$argumentName] + ); + if (!($renderFunction instanceof InvokeRenderFunctionInterface)) { + throw new \InvalidArgumentException( + 'render function with name "' . $this->arguments[$argumentName] . '" has not been registered.', + 1717293038 + ); + } + $this->arguments[$argumentName] = $renderFunction; + } +} diff --git a/README.md b/README.md index 9dc2ced..f5f553a 100644 --- a/README.md +++ b/README.md @@ -13,5 +13,5 @@ FluidRenderFunctions to the rescue: {myBook.name} from {myBook.author.name} - + ``` diff --git a/Resources/Private/Templates/Tests/Functional/Fixtures/Test/Index.html b/Resources/Private/Templates/Tests/Functional/Fixtures/Test/Index.html index 369d8a4..ab764ae 100644 --- a/Resources/Private/Templates/Tests/Functional/Fixtures/Test/Index.html +++ b/Resources/Private/Templates/Tests/Functional/Fixtures/Test/Index.html @@ -4,5 +4,5 @@ {subject.name} is cool - {test -> rf:applyRenderFunction(function: testFunc, force: true)} + {test -> rf:applyRenderFunction(function: 'testFunc', force: true)} diff --git a/Resources/Private/Templates/Tests/Functional/Fixtures/Test/Select.html b/Resources/Private/Templates/Tests/Functional/Fixtures/Test/Select.html index 1899cee..120ca49 100644 --- a/Resources/Private/Templates/Tests/Functional/Fixtures/Test/Select.html +++ b/Resources/Private/Templates/Tests/Functional/Fixtures/Test/Select.html @@ -4,5 +4,5 @@ {subject.name} is cool - +