From 3b5ac06eb63653ddc9a2270c6aff001200c5bfd2 Mon Sep 17 00:00:00 2001 From: Romain Canon Date: Wed, 25 Oct 2017 15:10:52 +0200 Subject: [PATCH] [BUGFIX] Handle nested fields views behaviour with Fluid standalone Couple of fixes that will fix certain issues when working with nested fields in TYPO3 v8. --- Classes/ViewHelpers/FieldViewHelper.php | 42 ++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/Classes/ViewHelpers/FieldViewHelper.php b/Classes/ViewHelpers/FieldViewHelper.php index d486ce6..4a09dcc 100644 --- a/Classes/ViewHelpers/FieldViewHelper.php +++ b/Classes/ViewHelpers/FieldViewHelper.php @@ -151,6 +151,9 @@ protected function renderLayoutView(array $templateArguments) $templateArguments['fieldName'] = $fieldName; $templateArguments['fieldId'] = ($templateArguments['fieldId']) ?: StringService::get()->sanitizeString('formz-' . $formObject->getName() . '-' . $fieldName); + $currentView = $this->viewHelperVariableContainer->getView(); + $currentVariables = []; + $view = $this->fieldService->getView($layout); /* @@ -163,24 +166,55 @@ protected function renderLayoutView(array $templateArguments) if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '8.0.0', '<')) { $view->setRenderingContext($this->renderingContext); } else { - $renderingContext = $view->getRenderingContext(); + $currentVariables = $this->renderingContext->getVariableProvider()->getAll(); /* * Updating the view dependencies: the variable container as well as * the controller context must be injected in the view. */ - $renderingContext->setViewHelperVariableContainer($this->viewHelperVariableContainer); + $this->viewHelperVariableContainer->setView($view); + + $view->getRenderingContext()->setViewHelperVariableContainer($this->viewHelperVariableContainer); $view->setControllerContext($this->controllerContext); - $this->viewHelperVariableContainer->setView($view); + /* + * Adding current variables to the field view variables. + */ + $tmpVariables = $currentVariables; + ArrayUtility::mergeRecursiveWithOverrule($tmpVariables, $templateArguments); + $templateArguments = $tmpVariables; } $view->setLayoutRootPaths($layoutPaths); $view->setPartialRootPaths($partialPaths); $view->assignMultiple($templateArguments); - return $view->render(); + $result = $view->render(); + + if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '8.0.0', '>=')) { + /* + * Because the view can be used several times in nested fields, we + * need to restore the variables after the view was rendered. + */ + $viewVariableProvider = $view->getRenderingContext()->getVariableProvider(); + + foreach ($viewVariableProvider->getAllIdentifiers() as $identifier) { + $viewVariableProvider->remove($identifier); + } + + foreach ($currentVariables as $key => $value) { + $viewVariableProvider->add($key, $value); + } + + /* + * Resetting the view of the variable container with the original + * view. + */ + $this->viewHelperVariableContainer->setView($currentView); + } + + return $result; } /**